读Java性能权威指南(第2版)笔记16垃圾回收C1。调整堆的大小1。1。随着堆的大小增加,停顿的持续时间也会增加1。2。停顿发生的频率确实会降低,但是停顿的持续时间会拖慢整体性能1。3。操作系统进行的交换对JVM是不公开的1。3。1。操作系统要将数据从磁盘交换到RAM,这是一个代价高昂的操作1。4。首要规则是设定堆的大小永远不要超过机器的物理内存1。4。1。如果有多个JVM在运行,那么这适用于所有堆的总和1。5。XmsN标志1。5。1。初始值1。6。XmxN标志1。6。1。最大值1。7。默认值 1。7。2。在物理内存小于192MB的机器上,堆的最大值会是物理内存的一半(96MB或更少)1。8。如果JVM发现堆在初始大小时,GC的次数太多,它就会不断地增加堆大小,直到JVM执行的GC数量适当,或者直到堆大小达到最大值1。9。对于不需要堆很大的应用程序来说,根本不需要设置堆的大小,只需要设定GC算法的性能目标1。10。除非应用程序需要比默认值更大的堆,否则优化时可以调整GC算法的性能目标而不是微调堆的大小1。11。一个有效的经验是,调整堆的大小,让其在FullGC之后,仍然被占用301。11。1。用jconsole连接应用程序,强制执行FullGC,并观察当FullGC完成后有多少内存被占用1。11。2。确保它有额外的0。5GB1GB内存来满足JVM的非堆需求1。12。当JVM运行在隔离容器中时,你需要设定堆的最大值1。13。确切地知道应用程序需要多大的堆,那么不妨将初始值和最大值都设置为该值1。13。1。因为GC不再需要弄清楚是否应该调整堆大小,稍微高效一点2。调整分代大小2。1。新生代相对较大2。1。1。YoungGC的停顿时间会增加2。1。2。新生代的回收频率会降低2。1。3。晋升到老年代的对象也会更少2。1。4。老年代相对会更小2。1。4。1。被填满的频率会更高2。1。4。2。会执行更多的FullGC2。2。优化分代大小的命令行标志,调整的都是新生代的大小,老年代自动得到剩余的所有空间2。3。XX:NewRatioN2。3。1。设置新生代与老年代的比例2。3。2。新生代初始大小堆的初始大小(1NewRatio)2。3。3。默认值是22。3。3。1。新生代的初始大小是堆初始大小的332。3。4。如果应用程序会动态调整堆大小,并且需要更大的(或更小的)新生代,那就重点设置NewRatio的值2。4。XX:NewSizeN2。4。1。设置新生代的初始值2。4。2。设置了该选项,那么它将优先于通过NewRatio计算出来的值2。4。3。没有默认值2。4。3。1。默认情况下这个值会通过NewRatio计算出来2。5。XX:MaxNewSizeN2。5。1。设置新生代的最大值2。5。2。通过设定新生代的最小值和最大值来进行优化是十分困难的2。6。XmnN2。6。1。将NewSize和MaxNewSize设置为同一个值的简单写法2。6。2。如果堆的大小是固定的(通过设置Xms等于Xmx),通常最好也用Xmn将新生代大小设为固定的2。7。自适应大小2。7。1。一般应该保持开启2。7。1。1。因为GC算法会通过调整代的大小,来尽量满足它们停顿时间的目标2。7。1。2。控制着JVM改变堆内新生代和老年代比例的方式2。7。2。关闭XX:UseAdaptiveSizePolicy标志2。7。2。1。默认值为true2。7。3。如果堆的最小值和最大值设置为相同的值,并且新生代的初始值和最大值也设为相同的值,那么自适应大小实际上就被关闭了2。7。4。如果你想将其中某个阶段的GC优化到最佳状态,禁用自适应大小很有用2。7。5。对于精细优化过的堆,禁用自适应大小能小幅提升性能2。7。6。开启XX:PrintAdaptiveSizePolicy标志2。7。6。1。查看JVM是如何调整应用程序内空间大小2。7。6。2。执行GC时,GC日志里会包含回收过程中各个代是如何调整大小的详细信息