首页 > 代码库 > JVM调优-初始化空间大小配置

JVM调优-初始化空间大小配置

我们得到了活跃数据大小,就可以根据活跃数据的情况,配置我们的初始化空间。

下面是我们的应用在稳定阶段的一段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:老年代情况,占用空间51352K51M,这个是老年代的活跃数据情况

PSPermGen:永久带情况,占用空间2085K2M,它是永久带的活跃数据大小。

 

2、常用经验参数

2.1 老年代大小

   Java堆大小的初始化值和最大值(通过-Xms-Xmx选项来指定)应该是老年代活动对象的大小的34倍。

         上面的GC记录,显示老年代大小是51M,那么对应的初始值和最大值在153M204M之间;-Xms153m –Xmx204M

2.2 永久代大小

         另外一个常规是,永久带的初始值和最大值(-XX:PermSize-XX:MaxPermSize)应该是永久带活动对象大小的1.21.5倍。在上面的FullGC之后永久代占用空间是2M。因此,永久代的推荐大小是2.4M3M,即可以设置为-XX:PermSize=3m-XX:MaxPermSize=3m(1.5)

2.3 新生代大小

  新生代空间应该是老年代活动对象大小的11.5倍。那么在这里例子中,新生代的大小可以设置为51M76M

 

         那么最终的参数就是:-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]

 …

 

 

 

JVM调优-初始化空间大小配置