您更喜欢哪种堆大小?

时间:2008-09-17 13:27:01

标签: java memory performance

我知道没有“正确”的堆大小,但是你在应用程序中使用哪个堆大小(应用程序类型,jdk,os)?

JVM选项-Xms(初始/最小)和-Xmx(最大)允许控制堆大小。什么设置在哪种情况下有意义?什么时候默认适当?

8 个答案:

答案 0 :(得分:5)

您必须尝试使用​​自己的应用程序并查看其运行情况。例如,我曾经一直运行IDEA,直到我得到这个新工作,我在这个巨大的整体项目上工作。在编译整个项目时,IDEA运行速度非常慢并且经常丢失内存错误。

我做的第一件事就是将堆增加到1 gig。这摆脱了内存不足的问题,但仍然很慢。我也注意到IDEA经常冻结10秒钟左右,之后用过的内存被减半只是为了再次提升,这引发了垃圾收集的想法。我现在用-Xms512m,-Xmx768m但是,我还添加了-Xincgc来激活增量垃圾收集

结果,我得到了旧的IDEA:它运行平稳,不再冻结,从不使用超过600米的堆。

对于您的应用程序,您必须使用类似的方法。尝试确定典型的内存使用情况并调整堆,以使应用程序在这些条件下运行良好。但也让高级用户调整设置,以解决异常数据加载问题。

答案 1 :(得分:3)

这取决于应用程序类型。桌面应用程序与Web应用程序有很大不同。应用程序服务器与独立应用程序有很大不同。

它还取决于您使用的JVM。 JDK5及更高版本6包含有助于了解如何调整应用程序的增强功能。

堆大小很重要,但了解它如何与垃圾收集器一起使用也很重要。

JDK1.4 Garbage Collector Tuning

JDK5 Garbage Collector Tuning

JDK6 Garbage Collector Tuning

答案 2 :(得分:2)

实际上我一直认为Java限制堆大小很奇怪。本机应用程序通常可以使用所需的堆,直到它耗尽虚拟地址空间。在Java中限制堆的唯一原因似乎是垃圾收集器,它具有某种“懒惰”并且可能不会垃圾收集对象,除非有必要这样做。这意味着如果您选择堆太大,您的应用程序将不断使用比实际需要更多的内存。

但是,Sun多年来已经对GC进行了大量改进并模拟了原生C应用程序的行为,我将初始堆大小设置为32 MB(对于小程序)或64 MB(对于较大的程序)和最大值在1-2 GB之间。如果你的应用程序真的需要超过1 GB的内存,它很可能会被破坏(除非你处理的数据对象很大),但我认为没有理由为什么你的应用程序会被杀死,只是因为它超过了一定的堆大小。

当然,这指的是普通电脑。如果为移动电话或其他有限设备创建Java代码,则应该采用初始和最大堆大小来满足该设备的限制。

答案 3 :(得分:1)

通常我尽量不使用大于1GB的堆。 它将花费你在主要的垃圾收集。

有时最好将应用程序拆分到同一台机器上的几个JVM而不是大堆堆。

具有大堆大小的主要集合可能需要> 10分钟(在未经优化的GC应用程序上)。

答案 4 :(得分:1)

这完全取决于您的应用程序以及您可能具有的任何硬件限制。没有一种尺寸适合所有人。

jmap可用于查看您实际使用的堆,并且是正确调整堆大小的良好起点。

答案 5 :(得分:1)

你需要在JConsole或visualvm上花一些时间来清楚了解高原内存的使用情况。等到一切都稳定,你会看到堆内存使用的特征锯齿曲线。峰值应该是70-80%的堆,具体取决于您使用的垃圾收集器。

当堆使用率达到一定百分比时,大多数垃圾收集器会触发完整的GC。这个百分比是最大堆的60%到80%,具体取决于所涉及的策略。

答案 6 :(得分:1)

1.3Gb用于繁重的GUI应用程序。

不幸的是,在Linux上,JVM似乎在这种情况下预先请求1.3G的虚拟内存,即使不需要它也会看起来很糟糕(并引起很多用户抱怨)

答案 7 :(得分:1)

在我最耗能的应用上:

-Xms250M -Xmx1500M -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC