首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的使用和释放内存

Java中的使用和释放内存
EN

Stack Overflow用户
提问于 2012-03-09 07:03:30
回答 3查看 1.1K关注 0票数 1

我正在努力提高我的web应用程序的性能,所以我决定对它进行分析。

在执行此操作时,我注意到,在完成了一个长流程之后,当我启动任务管理器时,我发现java.exe占用了太多内存。

顺便说一下,在进程完成2-3小时后,我检查了它,并且cpu处于稳定状态。

我在分析器的VM元素视图中看到,使用的内存是5 GB,空闲内存是15 GB,在任务管理器中java.exe使用的总内存是41 GB

这是什么自由记忆?

现在有这么多内存将被java占用吗?

我注意到,随着进程的开始和运行,用过的内存和空闲的内存都在增长,但是在完成之后,使用的内存减少了,但没有空闲内存。

我想知道我的申请有什么问题吗?还是正常的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-09 07:16:46

分析器通常显示堆内存的使用情况。因此,您可能正在使用5 GB的堆,而可用的是15 GB。任务管理器显示进程使用的总内存,其中包括堆内存和非堆内存,例如Sun中的“Perm”内存。下面的文章有一个很好的资源集合来详细了解这一点。

Java Memory explained (SUN JVM)

票数 3
EN

Stack Overflow用户

发布于 2012-03-09 07:19:30

你确定这是GB而不是MB吗?我不想暗示任何东西,但是对于一个你还没有描述的系统来说,这是一个巨大的内存。我很想知道这是什么类型的应用程序,它是用Java编写的,消耗了这么多内存。我们有这些大型的ram服务器,但是我们运行的是医院系统的EMR系统,一次有1,000个用户(运行Java.)。

如果实际上是GB,那么您就有一个庞大的代码库,或者在ram中存储大量的对象。可能还有许多分配的对象不能被GC使用。

如果我正确地理解了您的工具,它就是在解释Java正在保留system,但没有将它分配给对象。这是你的免费公羊。使用内存是由代码库和内存中的对象消耗的内存。Java有时会保存当前未被使用的ram,并且不会将其发布到操作系统中,以确保内存地址的连续性(防止内存碎片化)。麦克

票数 2
EN

Stack Overflow用户

发布于 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的总和。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9630192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档