Java进阶-JVM-核心

2021-11-30  本文已影响0人  GIT提交不上

一、Java进阶-JVM

1.1 JVM运行时数据区

image.png image.png

1.2 对象内存模型

public class HeapMemory {
    private Object obj1 = new Object();

    public static void main(String[] args) {
        Object obj2 = new Object();
    }
}

  obj1是类的属性,引用在方法区中,obj2是局部变量,引用存放在虚拟机栈中的栈帧里的局部变量表。所以obj1是方法区指向堆,obj2是经典的虚拟机栈指向堆

image.png image.png

  对象内存中分为三块:对象头(Header),实例数据(Instance Data)和对齐填充

image.png

  对象访问方式:

image.png image.png

  对象生命周期:

image.png image.png

1.3 类加载机制

image.png

  加载:加载指的是通过一个完整的类或接口名称来获得其二进制流的形式,并将其按照Java虚拟机规范将数据存储到运行时数据区域,类加载主要做三件事:

  双亲委派模型:

自定义类加载器->应用程序类加载器->扩展类加载器->启动类加载器

image.png

  连接获取类或接口的二进制形式并将其结合到java虚拟机的运行时状态以便执行的过程。连接包括三个步骤:验证、准备和解析。

  初始化:初始化其实就是一个赋值的操作,它会执行一个类构造器的<clinit>()方法。由编译器自动收集类中所有变量的赋值动作
  卸载GC将无用对象从内存中卸载

1.4 GC

  确定对象是否可回收:

  GC Roots:

  垃圾回收算法:

  垃圾收集器:

image.png

https://blog.csdn.net/qq_41931364/article/details/107040928
https://blog.csdn.net/weixin_37335761/article/details/110245500

1.5 运行时常量池

  方法区的一部分,用于存储编译生成的字面量(基本数据类型或被final修饰的常量或字符串)和符号引用,类或接口的运行时常量池是在java虚拟机创建类或接口时创建的在jdk1.6以及之前的版本,Java中的字符串是放在方法区中的运行时常量池内,但是在jdk1.7以后将字符串常量池拿出来放在了堆中

public class GcDemo {
    public static void main(String [] args) {
        String str = new String("lonely")+new String("wolf");
        System.out.println(str == str.intern());
    }
}
public static void main(String [] args) {
    String str = new String("lonely");
    System.out.println(str == str.intern());
}

  只有一个new String(),在jdk1.7和jdk1.8也会返回false,我们假设一开始字符串常量池没有任何字符串,执行一个new String("lonely")会产生两个对象,一个在堆,一个在字符串常量池。String.intern()先检查字符串常量池,发现存在"lonely"的字符串,所以直接返回,这时候两个地址不一样,所以返回false。

image.png

  new String("lonely")+new String("wolf")会产生5个对象,2个在字符串常量池,3个在堆。这时候执行String.intern()如果在1.7和1.8中会检查字符串常量池,发现没有lonelywolf的字符串,所以会在字符串常量池创建一个,指向堆中的字符串。但是在jdk1.6中不会指向堆,会重新创建一个lonelywolf的字符串放到字符串常量池,所以才会产生不同的结果。

image.png

  jdk1.7和jdk1.8实现方法区的区别:

1.6 参考链接

https://juejin.cn/post/6844903892774289421#heading-13
https://juejin.cn/post/6941242430737874974#heading-48
https://juejin.cn/post/6844904048013869064#heading-36
https://juejin.cn/post/6844903636829487112#heading-18

上一篇 下一篇

猜你喜欢

热点阅读