二、 JVM参数调试

2.1、Trace跟踪参数

n  -verbose:gc -XX:+printGC 在运行的时候打印gc的简单信息

如:

[GC 4790K->374K(15872K), 0.0001606 secs]

[GC 4790K->374K(15872K), 0.0001474 secs]

[GC 4790K->374K(15872K), 0.0001563 secs]

[GC 4790K->374K(15872K), 0.0001682 secs]

 

n  -XX:+PrintGCDetails 打印gc详细信息

n  -XX:+PrintGCTimeStamps 打印gc运行的时间戳

如:

打印详细信息

def newgeneration   total 13824K, used 11223K[0x27e80000, 0x28d80000, 0x28d80000)

新生代使用的内存大小。最小内存0x27e80000,当前使用的0x28d80000,最大边界0x28d80000。

 

n  -Xloggc:log/gc.log 制定文件路径输出gc日志

 

n  -XX:+TraceClassLoading 监控类的加载

[Loaded java.lang.Object from shared objects file]

[Loaded java.io.Serializable from shared objects file]

[Loaded java.lang.Comparable from shared objects file]

[Loaded java.lang.CharSequence from shared objects file]

[Loaded java.lang.String from shared objects file]

[Loaded java.lang.reflect.GenericDeclaration from shared objectsfile]

[Loaded java.lang.reflect.Type from shared objects file]

 

2.2、堆的分配参数

n  -Xmx –Xms 制定最大、最小堆内存。

下面代码运行默认下的堆内存

System.out.print("Xmx=");

System.out.println(Runtime.getRuntime().maxMemory()/1024.0/1024+"M");

System.out.print("free mem=");

System.out.println(Runtime.getRuntime().freeMemory()/1024.0/1024+"M");

System.out.print("total mem=");

System.out.println(Runtime.getRuntime().totalMemory()/1024.0/1024+"M");

 

n  -Xmn 设置新生代大小

n  -XX:NewRatio 新生代和老年代的比值通常为1:4

新生代大小。通常为 Xmx 1/3 1/4。新生代 = Eden + 2 Survivor 空间。实际可用空间为 = Eden + 1 Survivor,即 90%

官方推荐新生代占堆的3/8

 

 

n  -XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件

n  -XX:+HeapDumpPath 导出OOM的路径

n  -Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=d:/a.dump

 

代码:

Vector v=newVector();

        for(int i=0;i<25;i++)

           v.add(new byte[1*1024*1024]);

n  -XX:OnOutOfMemoryError 在OOM时,执行一个脚本

如:

"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat%p”

当程序OOM时,在D:/a.txt中将会生成线程的dump. 可以在OOM时,发送邮件,甚至是重启程序

 

2.3、永久分配参数

n  -XX:PermSize  -XX:MaxPermSize 设置永久区的初始空间和最大空间

代码测试:

for(inti=0;i<100000;i++){

    CglibBean bean = newCglibBean("geym.jvm.ch3.perm.bean"+i,new HashMap());

}

2.3、栈大小分配

n  -Xss

每个线程都有独立的栈空间,局部变量、参数都分配在栈上

测试代码:

public class TestStackDeep {

      private static intcount=0;

      public static voidrecursion(long a,long b,long c){

               longe=1,f=2,g=3,h=4,i=5,k=6,q=7,x=8,y=9,z=10;

               count++;

               recursion(a,b,c);

      }

      public static voidmain(String args[]){

               try{

                         recursion(0L,0L,0L);

               }catch(Throwablee){

                         System.out.println("deepof calling = "+count);

                         e.printStackTrace();

               }

      }

}

递归调用

-Xss128K

deep of calling = 701

java.lang.StackOverflowError 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值