java三类_Java之JVM的深入探究(三)--jvm三类配置参数详解

6a01542c10aaa5345bc687f1e4488b13.gif

预计阅读时间: 11分钟

d205fd7d6d9d40a045b48ae93496f034.png

对于JVM的进一步探究,有了之前两篇文章对JAVA JVM的了解,我想一定是对JVM有了初步的一些认识,接着我们一起在看看java JVM的相关三类配置参数。

其中这三类参数分别是:1、JVM跟踪参数    2、JVM堆分配参数    3、JVM栈分配参数;

跟踪参数:

首先我们来看看跟踪参数,有名称我们可知该参数是用来进行跟踪监控的,没错它就是用来监控JVM的状态的,其作用还是相当的大,常常被从事开发的人员用于JVM故障排除及优化。

1、配置参数, 当发生GC(garbage collection 垃圾回收),打印输出GC的简要信息

需配置使用的参数:-XX:+PrintGC或-verbose:gc参数

其中这两个配置参数作用是一样的,都是在发生GC时打印出发生GC的简要信息。例如我们配置了参数-XX:+PrintGC或-verbose:gc,执行下面代码:

package com.alxiu.test;

public class GCDemo{

public static void main(String[] args){

// TODO Auto-generated method stub

byte[] bytes =null;

for(int i=0;i<100;i++){

bytes = new byte[1 * 1024 * 1024];

}

}

}

该程序连续创建了100个1M的数组对象,在Eclipse控制台即可查看到GC情况:

[GC (Allocation Failure)  65086K->1768K(251392K), 0.0009079 secs]

可以看到程序执行了GC(minor GC),GC都是新生代的GC,因为这个程序每次创建新的数组对象,都会把新的对象赋给bytes变量,而老的对象没有任意对象引用它,老对对象会变的不可达(提示:‘不可达’对象,即为不可访问的对象,反之即为‘可达’对象),这些不可达的对象在新生代minor GC时候被回收掉。

关于GC打印输出简要的信息含义:

65086K表示回收前,对象占用空间;

1768K表示回收后,对象占用空间;

251392K表示还有多少空间可用;

0.0009546 secs表示这次垃圾回收花的时间。

2、配置参数, 打印GC的详细信息以及堆使用详细信息

需配置使用的参数:-XX:+PrintGCDetails参数

修改上述代码的配置参数为:-XX:+PrintGCDetails,执行代码:

在Eclipse控制台即可查看到GC详细信息以及堆使用详细信息情况:

[GC (Allocation Failure) [PSYoungGen: 65086K->1744K(76288K)] 65086K->1752K(251392K), 0.0180972 secs] [Times: user=0.00 sys=0.00, real=0.02 secs]

Heap

PSYoungGen      total 76288K, used 42596K [0x000000076b400000, 0x0000000774900000, 0x00000007c0000000)

eden space 65536K, 62% used [0x000000076b400000,0x000000076dbe5290,0x000000076f400000)

from space 10752K, 16% used [0x000000076f400000,0x000000076f5b4050,0x000000076fe80000)

to   space 10752K, 0% used [0x0000000773e80000,0x0000000773e80000,0x0000000774900000)

ParOldGen       total 175104K, used 8K [0x00000006c1c00000, 0x00000006cc700000, 0x000000076b400000)

object space 175104K, 0% used [0x00000006c1c00000,0x00000006c1c02000,0x00000006cc700000)

Metaspace       used 2651K, capacity 4486K, committed 4864K, reserved 1056768K

class space    used 285K, capacity 386K, committed 512K, reserved 1048576K

可以看到除了打印GC信息之外,还显示了堆使用情况,堆分为新生代、老年代、元空间。注意这里没有永久区了,永久区在java8已经移除,原来放在永久区的常量、字符串静态变量都移到了元空间,并使用本地内存。

我们可以看到在新生代(PSYoungGen)当中又分为伊甸区(eden)和幸存区(from和to),从上面打印的内容可以看到新生代总大小为76288K,使用了42628K,仔细观察可能会发现eden+from+to=65536K+10752K+10752K=87040 并不等于总大小76288K,这是为什么呢?这是因为新生代的垃圾回收算法是采用复制算法,简单的说就是在from和to之间来回复制(复制过程中再把不可达的对象回收掉),所以必须保证其中一个区是空的,这样才能有预留空间存放复制过来的数据,所以新生代的总大小其实等于eden+from(或to)=65536K+10752K=76288K。

3、除了以上在控制台打印输出GC信息外,还可使用外部文件记录GC的日志

除了以上两个配置参数以外还有一个非常有用的参数,它可以把GC的日志记录到外部文件中,这在生产环境进行故障排查时尤为重要,当java程序出现OOM时,总希望看到当时垃圾回收的情况,通过这个参数就可以把GC的日志记录下来,便于排查问题,当然也可以做日常JVM监控。

需要配置使用的参数:-Xloggc:log/gc.log

例如我的配置:-Xloggc:D:\gclog\gc.log    打印输出日志如下图:

7b8da69477a8e2bfb235612f029a7912.png

4、对类的加载过程的监控

需要配置使用的参数:-XX:+TraceClassLoading

我们可以使用这个参数监控java程序加载类:

修改上述代码的配置参数为:-XX:+TraceClassLoading,执行代码,控制台打印输出监控到的java类加载的过程信息:

[Opened F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.Object from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.io.Serializable from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.Comparable from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.CharSequence from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.String from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.reflect.AnnotatedElement from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.reflect.GenericDeclaration from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.reflect.Type from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.Class from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.Cloneable from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.ClassLoader from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.System from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.Throwable from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.Error from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.ThreadDeath from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.Exception from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.RuntimeException from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

[Loaded java.lang.SecurityManager from F:\devlope\Java\jdk1.8.0_151\jre\lib\rt.jar]

...

到此,java之JVM的三类配置参数的其中一类“跟踪参数”的探究学习到此已完毕,下一篇文接着学习“堆配置参数”

更多技术文章请扫码关注 ‘一直蓝色猿’ :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值