深刻理解Java虚拟机 之 Java 内存区域

小微 科技深刻理解Java虚拟机 之 Java 内存区域已关闭评论128字数 1716阅读模式
摘要运行时数据区域image.png程序计数器当前线程所执行的字节码的行号指示器Java虚拟机栈(java方法的内存模型)每一一个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、...

运行时数据区域

image.png文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

程序计数器文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

当前线程所执行的字节码的行号唆使器文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

Java虚拟机栈(java办法的内存模型)文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

每一个办法在执行的同时都会创立一个栈帧,用于存储局部变量表、操作数栈、动态链接、办法出口等信息文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

局部变量表中可以寄存基本数据类型、引用类型、returnAddress类型(指向了一条字节码指令的地址)文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

其中long以及doube类型的数据会重用2个局部变量表空间,其余的数据类型只占用1个。文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

本处所法栈文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

与Java虚拟机栈所施展的作用类似,只无非Java虚拟机栈执行java办法,而本处所法栈为Native办法服务文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

Java堆文章源自微观生活(93wg.com)微观生活-https://93wg.com/3810.html

所有的对象实例以及数组都要在堆上分配。

垃圾搜集器管理的主要区域

新生代、老年代、Eden空间、Survivor空间...

办法区

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

  • 类的版本
  • 字段
  • 接口
  • 办法

运行经常量池

办法区的一部份。Class文件中除了了有类的版本、字段、办法、接口等描写信息外,还有一项信息是常量池,用于寄存编译期间生成的各种字面量以及符号引用,这部份内容将在类加载落后入办法区的运行经常量池。

例如:

String s1 = \"abc\";//放入常量池
String s2 = \"abc\";//放入常量池(可以理解常量池为 HashSet)
//常量池s3 引用堆内存中的 new String;
String s3 = new String;
s1 == s2 //true
s1 == s3 //false

image.png

直接内存

对象

对象的创立

1、当虚拟机遇到内存创立的指令的时候,来到了办法区,找到办法区中有无符号引用(类信息存在的一种原始情势,字符串)

2、检查该符号引用有无被加载、解析以及初始化过,如果没有则执行类加载进程,否则直接筹备为新的对象分配内存

3、分配内存分为指针碰撞以及空闲列表两种方式;分配内存还要要保证并发安全,有两种方式。

指针碰撞:条件是堆内存中的空闲空间十分的规整,使用与未使用的空间全体为连续,只需挪动一下指针就能够了

空闲列表:针对堆内存中的空间零散的存在,虚拟机保护着一个列表,记录着哪里被分配了,哪里还空闲

CAS 命令的方式来节制操作是同步的

本地线程分配缓冲TLAB(Thread Local Allocation Buffer):在堆中为每一一个线程分配一小块独立的内存,这样以来就不存并提问题了,Java 层面与之对应的是 ThreadLocal 类的实现

4、分配完内存后要对对象的头(Object Header)进行初始化,这新信息包含:该对象对应类的元数据、该对象的GC代、对象的哈希码

5、最后,一个新对象的发生后还需要执行构造器中的命令,来完成Java层面的初始化,在 JVM 里为 办法。到此一个新生的对象就发生了出来,筹备被使用。

对象的内存模型

对象的头(Object Header)

在对象头中有两类信息:标志信息(Mark Word)以及元信息指针(Kclass Pointer)

标识信息用来寄存对象一些固有属性的状况,这些属性从对象创立就有,而不是 Java 的使用者定义的:

  • 哈希码:对象的独一标识符
  • 对象的分代春秋:与垃圾回收有关
  • 线程持有的锁
  • 锁的状况
  • 倾向线程 ID、倾向时间戳
  • 数组长度:如果该对象是数组,会有数组长度信息

元信息指针是指向办法区中类元信息的指针。

实例的信息

实例的信息寄存的是一些对 Java 使用者真正有效的信息,也就是类中定义的各个字段,其中还包含从父类继承的字段。

对齐填充

对其填充这段内存段存在与否取决于前面两部份的长度,为了保证对象内存模型的长度为 8 字节的整数倍,这也是虚拟机自动内存管理的请求。

使用对象

对象创立起来以后,就会在虚拟机栈中保护一个本地变量表,用于存储基础类型以及基础类型的值,引用类型与引用类型的值。

其中引用类型的值就是堆中对象地址。怎么引用堆中地址有两种方式:

  • 句柄:在堆中保护一个句柄池,句柄中包括了对象地址,当对象扭转的时候,只需扭转句柄,不需要扭转栈中本地变量表的引用
  • 直接指针:对象的地址直接存储在栈中,这样做的益处就是走访速度变快

以上就是微观生活(93wg.com)关于“深刻理解Java虚拟机 之 Java 内存区域”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/3810.html