饥人谷技术博客Java

JVM系列之类的使用与卸载

2021-04-01  本文已影响0人  简楼

前言

一个完整即将使用的类已经在JVM虚拟机中整装待发了,进击!!!

类的使用

类的使用一般可以分为主动使用和被动使用;

主动使用

被动使用

除了以上7种外的所有调用,都是被动调用,都不会对类进行初始化,也就是只会进行类的加载、解析;

案例1

public class Test {
    public static void main(String[] args) {
①------System.out.println(Child.str);  
    }
}
class Parent{
    public static String str = "Parent";
    static {
        System.out.println("Parent 静态代码块");
    }
}
class Child extends Parent{
    public static String str2 = "Child ";
    static {
        System.out.println("Child 静态代码块");
    }
}

输出:

Parent 静态代码块
Parent

将①换成System.out.println(Child.str2)
输出:

Parent 静态代码块
Child 静态代码块
Child 

解析

案例2

public class Test {
    public static void main(String[] args) {
        System.out.println(Parent.uuid);
    }
}
class Parent {
    public static final String uuid= UUID.randomUUID().toString();
    static {
        System.out.println("parent4 static block");
    }
}

解析

uuid是静态常量,但是在编译期uuid的值并不能确定,这个值就不会被放到常量池中,所以这个类的初始化会在被主动调用时触发。

总结

常用java虚拟机参数(类加载/卸载跟踪)

-verbose:class 跟踪类的加载和卸载
-XX:+TraceClassLoading 跟踪类的加载
-XX:+TraceClassUnloading 跟踪类的卸载

-XX:+PrintClassHistogram 查看系统中类的分布情况
(需要在控制台按下Ctrl+Break组合键,就会出现柱状图,可以看到当前系统中占用空间最多的对象,以及其实例数量和空间大小 )
上一篇下一篇

猜你喜欢

热点阅读