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

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

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

Java虚拟机运行时数据区域

概括:

  • Java有Java编译器和Java虚拟机,编译器将Java源代码转换为.class文件,虚拟机加载并运行.class文件。Java 的开发遵循“一次编写到处乱跑”理念,它运行在 VM(虚拟机)上。

JVM启动流程:
在这里插入图片描述
JVM体系结构:
在这里插入图片描述
更详细的结构: (图片来源以及详细解释)
在这里插入图片描述

  • 运行时数据区:经过编译生成的字节码文件(class文件),由 class loader(类加载子系统)加载后交给执行引擎执行。在执行引擎执行的过程中产生的数据会存储在一块内存区域。这块内存区域就是运行时区域。

在这里插入图片描述
划分线程共享和线程独占和线程共享的原因:
这里写图片描述

接下来就是各个运行时数据区的详细概况:
  • (一) 程序计数器:

这里写图片描述

  • (二) Java虚拟机栈

这里写图片描述
在这里插入图片描述
在这里插入图片描述
这里写图片描述

  • (三) 本地方法栈

这里写图片描述

  • (四) Java堆

这里写图片描述
在这里插入图片描述

  • (五) 方法区

在这里插入图片描述
在这里插入图片描述
这里写图片描述
关于元空间: 元空间的本质和永久代类似,都是对JVM规范中方法区的实现,不过元空间和永久代之间最大的差别在于: 元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。

  • (六)方法区中的常量池:

这里写图片描述

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   运行时常量

    }
}

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

  • (七) 直接内存(不是运行时数据区域的一部分):

这里写图片描述


HotSpot虚拟机对象探秘

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

这里写图片描述

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

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

这里写图片描述

3). 初始化对象

这里写图片描述

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

这里写图片描述

对象的内存布局(结构)

这里写图片描述

对象的访问定位
  • 句柄访问
  • 直接指针

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值