我们更喜欢哪种堆大小?

时间:2020-03-05 18:58:53  来源:igfitidea点击:

我知道没有"合适的"堆大小,但是我们在应用程序中使用哪个堆大小(应用程序类型,jdk,os)?

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

解决方案

回答

通常,我尽量不要使用大于1GB的堆。
这将使我们浪费大量的垃圾。

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

具有大堆大小的主集合可能花费超过10分钟的时间(在未优化的GC应用程序上)。

回答

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

但是,多年来,Sun改进了GC并模拟了本机C应用程序的行为,我将初始堆大小设置为32 MB(对于小型程序)或者64 MB(对于大型程序),最大为在1-2 GB之间。如果应用程序确实需要超过1 GB的内存,则很有可能已损坏(除非我们处理的数据对象如此之大),但是我认为没有理由杀死应用程序,只是因为它超过了一定的堆大小。

当然,这是指普通PC。如果为手机或者其他受限设备创建Java代码,则可能应采用初始和最大堆大小来限制该设备。

回答

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

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

回答

我们必须尝试应用程序,并查看其性能。例如,我以前总是开箱即用地运行IDEA,直到获得从事这项庞大的整体项目的新工作为止。 IDEA运行速度非常慢,并且在编译整个项目时会定期抛出内存不足错误。

我要做的第一件事是将堆增加到1个演出。这摆脱了内存不足的问题,但仍然很慢。我还注意到IDEA经常冻结10秒钟左右,然后将使用的内存切成两半,然后再次增加,这触发了垃圾回收的想法。我现在将它与-Xms512m,-Xmx768m一起使用,但是我还添加了-Xincgc来激活增量垃圾收集

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

对于应用程序,我们必须使用类似的方法。尝试确定典型的内存使用情况,并调整堆以使应用程序在这些情况下正常运行。而且,还可以让高级用户调整设置,以解决非常规的数据负载。

回答

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

它还取决于我们使用的JVM。 JDK5和更高版本6包含一些增强功能,可以了解如何调整应用程序。

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

JDK1.4垃圾收集器优化

JDK5垃圾收集器优化

JDK6垃圾收集器优化

回答

我们需要花一些时间在JConsole或者visualvm中,以清楚地了解平台内存使用情况。等到一切稳定之后,我们才能看到堆内存使用的典型锯齿曲线。峰值应该是70-80%的堆,具体取决于我们使用的垃圾收集器。

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

回答

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

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

回答

在我最需要占用内存的应用程序上:

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