一、根据程序的运行状况查看其活跃的数据量
①、活跃的数据:
1.应用程序运行于稳定状态时,老年代占用的java堆大小
2.应用程序运行于稳定状态时,,永久代占用的java堆大小
其实就是FullGc后这2个数据的大小
②、动手测试:1.测试代码:
public class A {int[] storage = new int[102400];int[] extra = new int[200000];public int[] execute() {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}return storage;}}
import java.util.LinkedList;import java.util.Queue;public class Test {public static void main(String[] args) {Queue<int[]> queue = new LinkedList<int[]>();while (true) {int[] tmp=new A().execute();if (queue.size() > 1000) {queue.poll();} else {queue.offer(tmp);}}}}
2.参数配置:
3.测试的结果
4.结果分析
可以看到老年代的大小为404211K,持久代的大小为8888K
二、通过活跃的数据配置堆以及其他参数
通用法则1:
将java堆的初始值-Xms和最大值-Xmx设置为老年代活跃数据大小的3~4倍
所以此处就设置 -Xms1600m,-Xmx1600m
在以上的测试结果中可以看到原始的堆大小为1675m左右,是比较接近的。
通用法则2:
永久带的初始值-XX:PermSize及最大值-XX:MaxPermSize应该比永久代活跃数据大1.2~1.5倍
所以此处就设置-XX:PermSize=13m,-XX:MaxPermSize=13m
补充法则:
新生代空间应该为老年代空间活跃数据的1~1.5倍
此处老年代为400m,新生代就为600m
如果java堆的初始值及最大值为活跃数据的3~4倍,新生代为活跃数据的1~1.5倍时,老年代应设置为活跃数据大小的2~3倍
三、参考表
参考:《java性能优化权威指南》
版权声明:本文为博主原创文章,未经博主允许不得转载。
而是他们在同伴们都睡着的时候,一步步艰辛地向上攀爬的。