我们得到了活跃数据大小,就可以根据活跃数据的情况,配置我们的初始化空间。
下面是我们的应用在稳定阶段的一段FULLGC。生成的代码在最后。
1、活跃数据示例
[Full GC[PSYoungGen: 64K->0K(4416K)] [PSOldGen: 51352K->51352K(56768K)]51416K->51352K(61184K) [PSPermGen: 2085K->2085K(12288K)], 0.0026228 secs][Times: user=0.00 sys=0.00, real=0.00 secs]
PSYoungGen:新生代情况
PSOldGen:老年代情况,占用空间51352K,51M,这个是老年代的活跃数据情况
PSPermGen:永久带情况,占用空间2085K,2M,它是永久带的活跃数据大小。
2、常用经验参数
2.1 老年代大小
Java堆大小的初始化值和最大值(通过-Xms和-Xmx选项来指定)应该是老年代活动对象的大小的3到4倍。
上面的GC记录,显示老年代大小是51M,那么对应的初始值和最大值在153M到204M之间;-Xms153m –Xmx204M
2.2 永久代大小
另外一个常规是,永久带的初始值和最大值(-XX:PermSize和-XX:MaxPermSize)应该是永久带活动对象大小的1.2到1.5倍。在上面的FullGC之后永久代占用空间是2M。因此,永久代的推荐大小是2.4M到3M,即可以设置为-XX:PermSize=3m-XX:MaxPermSize=3m(1.5倍)。
2.3 新生代大小
新生代空间应该是老年代活动对象大小的1到1.5倍。那么在这里例子中,新生代的大小可以设置为51M到76M。
那么最终的参数就是:-Xms200m-Xmx200m -Xmn60m -XX:PermSize=3m -XX:MaxPermSize=3m -XX:+UseParallelGC-XX:+PrintGCDetails
使用之后,FULLGC就不再出现,也没有内存溢出的问题。
3、计算活跃数据(模拟FULL GC)的源代码
packagecom.gc;
importjava.util.ArrayList;
importjava.util.List;
/**
* 简单的模拟FULLGC,用来计算活跃数据大小
* 参数:-Xms30m-Xmx60m -XX:+UseParallelGC -XX:+PrintGCDetails
* @author 范芳铭
*/
publicclass EasyActiveData {
public byte[] placeHolder = new byte[1024* 1024]; //占位符 1M
public static void main(String[] args)throws Exception{
activeData();
}
private static void activeData() throwsException{
List<EasyActiveData>list_a = new ArrayList<EasyActiveData>();
List<EasyActiveData>list_b = new ArrayList<EasyActiveData>();
for(int j=0; j < 25;j ++){
EasyActiveDataserial = new EasyActiveData();
list_a.add(serial);
}
Thread.sleep(100);//停顿下
for(int j=0; j < 30;j ++){
EasyActiveDataserial = new EasyActiveData();
list_b.add(serial);
}
Thread.sleep(100);//停顿下
while(true){
EasyActiveDataserial = new EasyActiveData();
serial = list_a.get(0);
serial = null;
serial =list_b.get(0);;
Thread.sleep(100);//停顿10毫秒
}
}
}
运行参数
-Xms30m 启动内存
-Xmx60m 最大内存
-XX:+UseParallelGC 选用的垃圾回收方式
-XX:+PrintGCDetails 打印GC明细
4、运行结果
…
[Full GC [PSYoungGen:64K->0K(4416K)] [PSOldGen: 51352K->51352K(56768K)]51416K->51352K(61184K) [PSPermGen: 2085K->2085K(12288K)], 0.0026228 secs][Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [PSYoungGen:4098K->48K(4416K)] 55450K->55496K(61184K), 0.0038392 secs] [Times:user=0.00 sys=0.00, real=0.00 secs]
[Full GC [PSYoungGen:48K->0K(4416K)] [PSOldGen: 55448K->55448K(56768K)]55496K->55448K(61184K) [PSPermGen: 2085K->2085K(12288K)], 0.0025522 secs][Times: user=0.02 sys=0.00, real=0.00 secs]
[Full GC [PSYoungGen:4098K->0K(4416K)] [PSOldGen: 55448K->56472K(56768K)]59546K->56472K(61184K) [PSPermGen: 2085K->2085K(12288K)], 0.0043092 secs]
…
原文地址:http://blog.csdn.net/ffm83/article/details/43195417