我正在尝试提高我的网络应用程序的性能,所以我决定对其进行分析
执行此操作时,我注意到在启动任务管理器完成一个漫长的过程后,我发现 java.exe 占用了太多内存。
顺便说一下,我在程序完成后2-3小时检查了它,并且cpu处于稳定状态
我在分析器的VM元素视图中看到,已使用的内存 5 GB 且可用内存 15 GB ,并且在任务管理器中,java.exe使用的总内存为 41 GB 即可。
这个免费记忆是什么?
是不是现在这样的内存将被java占用?
我注意到,当进程开始并运行已用的内存以及可用内存增长时,但在完成后使用的内存减少但不是空闲内存
我想知道我的申请有什么问题或者这是正常的吗?
答案 0 :(得分:3)
Profilers通常会显示堆内存使用情况。因此,可能正在使用5 GB的堆,并且可以使用15 GB。任务管理器显示进程使用的总内存,其中包括堆内存和非堆内存,例如Sun JVM中的“Perm Gen”内存。 以下帖子有很多资源可以详细了解这一点。
答案 1 :(得分:2)
你确定这是GB而不是MB吗?我并不想暗示任何事情,但对于你还没有描述过的系统来说,这是一个巨大的内存。我很想知道这是用Java编写的应用程序类型,并消耗了大量的内存。我们有这些大型ram服务器正在运行,但我们为医院系统运行EMR系统,同时拥有1,000个用户(运行Java ...)。
如果它实际上是GB,那么你有一个巨大的代码库或在ram中存储很多对象。可能仍然分配了许多GC无法使用的对象。
如果我正确理解您的工具,它会解释Java正在保留系统RAM但尚未将其分配给对象。这将是你的免费公羊。使用的内存是代码库和内存中的对象使用的内存。 Java有时会保留当前未使用的ram,而不是将其释放到操作系统以确保内存地址的连续性(防止碎片ram)。 麦克
答案 2 :(得分:1)
启动服务器JVM时,它默认将最大堆大小设置为内存的1/4,但我怀疑您已将最大堆大小设置为40 GB。
JVM在启动时保留了这么多虚拟内存,但是在使用它之前,操作系统不会将内存分配给应用程序。
这意味着您可以将最大值设置为80 GB,并且它似乎立即使用80 GB的虚拟(即使对于hello world程序)。实际使用的内存可能会少得多。
在您的情况下,堆大小已增加到20 GB(由应用程序触及),您使用的是5 GB且未使用15 GB。如果使用更多内存,堆大小可能会增加到40 GB。