当前位置: 首页 > 知识库问答 >
问题:

JVM进程大小和内存堆大小之间的巨大差异

公胤运
2023-03-14

我正在Windows 8.1 64位上开发java swing应用程序,带有4GB内存和JDK版本8u20 64位。

问题是当我使用带有监视器选项的Netbeans profiler启动应用程序时。

加载第一个Jframe时,应用程序Memory Heap约为18mb,JVM进程大小约为50mb(Image1)。

然后,当我启动另一个Jframe时,它包含一个带有webView的JFxPanel,堆跳到45mb,JVM进程跳到700mb,非常快(image2),这非常令人困惑。然后,当我关闭第二个JFrame,它被释放,并创建一个系统。调用gc(),JVM执行gc(在大多数情况下),堆下降到20mb左右,但JVM进程从未下降(图3)。

为什么内存堆(45MB)和JVM进程(699MB)之间存在巨大差异?为什么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摇摆应用程序),他没有使用与我相同的VM参数启动他的应用程序。

更新:-第一个JFrame启动后(图1)

第二个JFrame启动后(图2)

第二个JFrame关闭后(图3)

编辑2:-我刚刚用上面相同的VM参数尝试了相同的应用程序,并添加了

-client 
-XX:+UseCompressedOops 

并使用JDK 8u25 32位,因为正如在这个答案中提到的https://stackoverflow.com/a/15471505/423182664位版本在JRE中不包含客户端文件夹,将忽略-client参数。

结果是,当第二个JFrame打开时,总内存进程跃升至540Mb,堆大小(在三点中)与64位版本几乎相同,这是否确认这是一个与JVM相关的问题(相同的堆大小和总进程大小的260Mb差异)?

共有1个答案

闻人哲茂
2023-03-14

虚拟内存分配基本上是不相关的(请参阅此答案的解释),与实际内存使用情况非常不同。JVM不是为限制虚拟内存分配而设计的,请参阅关于限制虚拟内存使用的问题
最终用户可能会在任务管理器中看到大量虚拟内存的使用,但这基本上是没有意义的。本文将解释Windows任务管理器中显示的不同内存使用量。总结:在Windows任务管理器中,查看“内存(专用工作集)”和“页面错误增量”(后者的相关性在本答案中解释)。

 类似资料:
  • PS:有时我会从java代码执行shell脚本。会不会导致这类问题?

  • 在Java中分配堆外内存时(例如通过直接缓冲区或JNI本机代码),如果JVM使用-XX: UseLargePages,分配的内存是否会由巨大的页面支持?

  • 我是Java的初学者,刚开始使用Intellij作为我的IDE。 当我使用它时,有时会延迟。 我更改了我的 xms 和 xmx 以获得更大的堆大小(xms = 1024,xmx = 2048),但它抛出了一个错误。 所以,我把它回滚了。 错误消息是这样的:“初始堆大小设置为大于最大堆大小的值”。 有什么问题? 如果可能,如何增加最大堆大小? 我用的是笔记本电脑,它有8GB内存。x64Intelli

  • 有很多关于堆大小的帖子和站点,但是没有一个提到在调用JVM时如何找出我可以保留的最大可能堆大小。 任务是用最大可用堆大小xmx=max动态启动我的jvm(这里不需要讨论这个任务的对象!)。 我们可以考虑读取当前可用或空闲的内存,并将该大小用于xms和XMX。但这不起作用。 调用Java程序时: Java-XMS1536M-XMX1536M myApp 导致: 选择您选中的应用程序大约需要的堆。并在

  • 问题内容: 当前,在我们的测试环境中,最大和最小JVM堆大小设置为相同的值,基本上与专用服务器计算机为我们的应用程序所允许的大小相同。这是性能最佳的配置,还是给JVM一个更好的范围? 问题答案: 设置- Xms的主要原因是,如果您在启动时需要一定的堆。(防止OutOfMemoryErrors在启动时发生。)如上所述,如果您需要启动堆来匹配最大堆,则是匹配它的最大时间。否则,您将不需要它。只是要求应

  • 我们有一个需求,即应用程序jvm总内存太高,并且根据输入数据集而变化。因此我们不知道要使用-xmx命令行选项设置的最大堆大小。所需的总内存大于默认的最大堆大小(总物理内存的1/4)。 当我们没有给出任何GC人体工程学命令行参数时,内存在9-9.5GB(系统中的总物理内存为38GB)之后没有增长。而应用程序就会在这一点上卡住。 如果我们将Xmx值设为20 GB,则应用程序正在运行。但是我们不确定最大