我正在努力提高我的web应用程序的性能,所以我决定对它进行分析。
在执行此操作时,我注意到,在完成了一个长流程之后,当我启动任务管理器时,我发现java.exe占用了太多内存。
顺便说一下,在进程完成2-3小时后,我检查了它,并且cpu处于稳定状态。
我在分析器的VM元素视图中看到,使用的内存是5 GB,空闲内存是15 GB,在任务管理器中java.exe使用的总内存是41 GB。
这是什么自由记忆?
现在有这么多内存将被java占用吗?
我注意到,随着进程的开始和运行,用过的内存和空闲的内存都在增长,但是在完成之后,使用的内存减少了,但没有空闲内存。
我想知道我的申请有什么问题吗?还是正常的?
发布于 2012-03-09 07:16:46
分析器通常显示堆内存的使用情况。因此,您可能正在使用5 GB的堆,而可用的是15 GB。任务管理器显示进程使用的总内存,其中包括堆内存和非堆内存,例如Sun中的“Perm”内存。下面的文章有一个很好的资源集合来详细了解这一点。
发布于 2012-03-09 07:19:30
你确定这是GB而不是MB吗?我不想暗示任何东西,但是对于一个你还没有描述的系统来说,这是一个巨大的内存。我很想知道这是什么类型的应用程序,它是用Java编写的,消耗了这么多内存。我们有这些大型的ram服务器,但是我们运行的是医院系统的EMR系统,一次有1,000个用户(运行Java.)。
如果实际上是GB,那么您就有一个庞大的代码库,或者在ram中存储大量的对象。可能还有许多分配的对象不能被GC使用。
如果我正确地理解了您的工具,它就是在解释Java正在保留system,但没有将它分配给对象。这是你的免费公羊。使用内存是由代码库和内存中的对象消耗的内存。Java有时会保存当前未被使用的ram,并且不会将其发布到操作系统中,以确保内存地址的连续性(防止内存碎片化)。麦克
发布于 2012-03-09 08:57:13
启动服务器JVM时,默认情况下,它将最大堆大小设置为内存的1/4,但我怀疑您已将最大堆大小设置为40 GB。
JVM在启动时保留了这么多虚拟内存,但是在使用它之前,OS不会将内存分配给应用程序。
这意味着您可以将最大值设置为80 GB,并且它将立即使用80 GB的虚拟内存(即使对于hello world程序),实际使用的内存可能要少得多。
在您的例子中,堆的大小已经增加到20 GB (应用程序所触及的),其中您使用的是5GB,而不是15 GB。如果您使用更多的内存,堆大小可能会增加到40 GB的总和。
https://stackoverflow.com/questions/9630192
复制相似问题