深入理解Java虚拟机总结一自动内存管理机制(一)

深入理解Java虚拟机总结一自动内存管理机制(一)

  • 运行时数据区域
  • HotSpot虚拟机对象探秘

运行时数据区域

总体的内存区的划分:
这里写图片描述
划分线程共享和线程独占和线程共享的原因:
这里写图片描述

接下来就是各个运行时数据区的详细概况:

  • 1).程序计数器:
    这里写图片描述

  • 2).Java虚拟机栈
    这里写图片描述
    这里写图片描述
    这里写图片描述

  • 3). 本地方法栈
    这里写图片描述

  • 4).Java堆
    这里写图片描述

  • 5). 方法区
    这里写图片描述
    这里写图片描述

  • 6). 方法区中的常量池:
    这里写图片描述

public class StringTest {

    public static void main(String[] args) {
        String s1 = "abc";  //字节码常量
        String s2 = "abc";

        System.out.println(s1 == s2); // true

        String s3 = new String("abc"); //false

        System.out.println(s1 == s3);

        System.out.println(s1 == s3.intern()); //true   运行时常量

    }
}

上面的代码的内存分配如下:
这里写图片描述

  • 7). 直接内存(不是运行时数据区域的一部分):
    这里写图片描述

HotSpot虚拟机对象探秘

  • 对象的创建过程
  • 对象的内存布局(结构)
  • 对象的访问定位

对象的创建过程

1). 对象的内存分配

这里写图片描述

虚拟机在堆中分配内存有两种方式:

  • 指针碰撞
    这里写图片描述
  • 空闲列表
    这里写图片描述
2). 线程安全问题

这里写图片描述

3). 初始化对象

这里写图片描述

5). 调用对象的构造方法< init >

这里写图片描述

对象的内存布局(结构)

这里写图片描述

对象的访问定位

  • 句柄访问
  • 直接指针

句柄访问:
这里写图片描述
直接指针:
这里写图片描述
各自的优势:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zxzxzx0119/article/details/82560737