Java 8分配了太多内存

Reg*_*00x 29 java eclipse memory-management java-8

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

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

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

-XX:ReservedCodeCacheSize=
-XX:MaxMetaspaceSize=
-XX:MetaspaceSize=
...
Run Code Online (Sandbox Code Playgroud)

Pet*_*iuk 11

在提出问题的方式

为什么Java 8在我的机器上分配太多内存

我认为任何人都无法回答,但有几条指南可能有所帮助.鉴于您通过任务管理器测量内存,您对使用的RSS总量感兴趣.所以

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

非技术性的 - 虽然调整各种选项以减少记忆可能有所帮助,但获得正确值的机会接近于在大海捞针中找到针.我真的建议了解如何在java中使用RSS.这些知识将在未来几年内得到应用!

如果您想要更具体的参考资料或更好的解释,请随时告诉我.而且...祝你好运!-)