gpt4 book ai didi

Java 8 分配了太多内存

转载 作者:IT老高 更新时间:2023-10-28 21:09:11 27 4
gpt4 key购买 nike

我正在使用 Java 7 JRE 运行 Eclipse 4.3。当我升级到 Java 8 JRE 时,Eclipse 突然消耗更多内存。如果我将带有 JRE 7 的 Eclipse 直接启动到我的工作区,它会根据任务管理器分配 600 MB 的 RAM。当我使用 JRE 8 时,这个值为 750 MB。

更糟糕的是,如果我运行一个通常使用 JRE 7 分配大约 10 GB RAM 的大型 Java 程序,切换到 JRE 8 会导致它分配 12 GB内存。

有人知道是什么导致了这种额外的 RAM 分配吗?我已经测试了调整不同的选项,但成功率为零:

-XX:ReservedCodeCacheSize=
-XX:MaxMetaspaceSize=
-XX:MetaspaceSize=
...

最佳答案

提问的方式

why Java 8 allocating too much memory on my machine

我认为没有人能够回答,但是有几条指南可能会有所帮助。鉴于您正在通过任务管理器测量内存,您对使用的总 RSS 感兴趣。所以

  • 第 1 步:比较您正在运行的版本之间的 JVM 默认值。您可以使用两个 jdks 的 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version 命令来获取它们。在输出之上使用文本排序,您将能够使用任何比较工具获得很好的差异。更改默认 GC 收集器和线程堆栈大小之类的事情会对最终的 RSS 产生很大影响。
  • 第 2 步:测量每个内存池的分配。一般来说,java使用的总内存可以使用heap + metasize + code cache + native + (thread_stack_size * maximum_number_of_threads)来计算
    • 堆内存易于通过成熟的工具(Eclipse Memory AnalyzerVisualVM 等)进行测量(并且可以轻松进行比较!!)。如果你记得堆面积增加——你很幸运。此外,Visual vm 允许您安装插件,该插件将显示可通过 jmx 访问的所有内存池的值。
    • metasize(又名 jdk<8 中的 permgen)应该或多或少相等,可以通过 jmap 找到工具。不需要玩flag,你可以得到数字,只要增加或不增加就比较。
    • Code cache : 除了保留代码缓存之外,您还可以设置初始代码缓存(这会影响 RSS 的使用量)。
    • native:有点害群之马。如果所有其他内存池都相等(您的内存凸点为 2GB),则丢失的内存必须在 native 区域的某个位置。我知道的唯一工具是jcmd它在 oracle 文档中有大量文档。

非技术性 - 虽然调整各种选项以减少内存会有所帮助,但获得正确值的机会几乎是大海捞针。我真的建议您了解一下 RSS 是如何在 java 中使用的。这些知识将派上用场好几年!

如果您需要更具体的引用资料或更好的解释,请随时告诉我。而且...祝你的任务好运 ;-)

关于Java 8 分配了太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32461309/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com