JVM进程大小和内存堆大小之间的巨大差异
我正在Windows 8.1 64位上开发带有JDK 8u20 64bit 4GB RAM的java swing应用程序。
问题是当我使用Monitor选项启动Netbeans分析器的应用程序时。
当加载第一个Jframe时,应用程序内存堆大约为18mb ,JVM进程大小约为50mb(image1) 。
然后,当我启动另一个包含带有WebView的JFxPanel的Jframe时,堆跳到45mb ,JVM 进程跳到700mb非常快(image2) ,这非常混乱。 然后,当关闭第二个JFrame并将其丢弃并调用System.gc(),并且JVM执行GC(大多数时间)时,堆将降至20mb左右,但JVM进程永远不会丢失(image3) 。
为什么内存堆(45 Mb)和JVM进程(699 Mb)之间存在巨大差异? 为什么JVM需要所有内存? 如何减少这个数量? 我使用这些虚拟机选项启动应用程序:
-Xms10m -Xmx60m -Xss192k
-XX:+UseG1GC -XX:MinHeapFreeRatio=5
-XX:MaxHeapFreeRatio=10 -XX:PermSize=20m
-XX:MaxPermSize=32m
编辑: -我刚刚阅读的问题,该链接的JVM内存使用失控,他有同样的问题,但情况不同,他的堆大小是总JVM进程内存大小的33%,在我的情况下少于7 %,他同时在做多个工作(Tomcat webapp),我没有(java swing应用程序),并且他没有使用我所做过的相同VM参数启动他的应用程序。
更新: -第一个JFrame启动后(image1)
第二个JFrame启动后(image2)
第二个JFrame关闭后(image3)
编辑2: -我刚刚尝试了上面相同的VM参数相同的应用程序,并添加
-client
-XX:+UseCompressedOops
并使用JDK 8u25 32位,因为正如本答案中所述https://stackoverflow.com/a/15471505/4231826 64位版本不包括JRE中的客户端文件夹,并将忽略-client参数。
结果是,当第二个JFrame打开并且堆大小(三个点)与64位版本中的数量几乎相同时,总内存过程跳至540Mb 。这是否确认这是与问题相关的问题到JVM(堆大小相同,总进程大小相差260Mb )?
虚拟内存分配大部分是不相关的(请参阅此答案的解释),与实际的内存使用情况非常不同。 JVM并不旨在限制虚拟内存分配,请参阅有关限制虚拟内存使用情况的问题。
最终用户可能会在任务管理器中看到很多虚拟内存使用情况,但这大多是毫无意义的。 本文介绍了Windows任务管理器中显示的内存使用情况的不同数字。 总之:在Windows任务管理器中查看“Memory(Private Working Set)”和“Page Fault Delta”(后者的相关性在此答案中进行了解释)。
上一篇: Big difference between JVM process size and Memory Heap size
下一篇: Non heap memory and No of loaded classes keeps on increasing