《Java虚拟机》随笔记01

一、运行时数据区
1.计数器
当前线程所执行的字节码的行号指示器
2.虚拟机栈
线程私有 每个方法在执行时会创建一个栈帧,
3.本地方法栈
4.java堆
所有线程共享的一块内存区域,所有对象实例和数组都在堆上分配内存。
-Xmx -Xms
5.方法区
线程共享,存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码
方法区无法满足内存分配需求,内存泄露OutOfMemoryError
5.1运行时常量池
运行时常量池具备动态性,运行期间也可将新的常量放入池中
HotSpot虚拟机
永久代 -XX:MaxPermSize

二、HotSpot虚拟机在java堆中对象分配、布局和访问的全过程
本地线程分配缓冲(Thread Local Allocation Buffer)
虚拟机是否使用TLAB -XX:+/-UseTLAB
2.1对象创建
new指令,类加载-->为新生对象分配内存,对象所需大小在类加载完后可确定。-->将分配到的内存空间都初始化为零值-->对对象进行必要的设置(类的元数据信息、对象的哈希码、对象的gc分代年龄,这些信息存放在对象的对象头中Object Header)-->init方法
内存分配完成后,虚拟机需要将分配到的内存空间初始化为零值。这一步操作保证了对象的实例对象在java代码总可以不赋值就
直接使用,程序能访问到这些字段的数据类型所对应的零值。
2.2对象的内存布局
对象在内存中存储布局分为:对象头、实例数据、对齐填充
对象头:第一部分:存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。
另一部分是类型指针,即对象指向它的类元数据的指针。
实例数据:对象真正存储的有效信息,在程序代码中所定义的各种类型的字段内容。存储顺序受到虚拟机分配策略参数和字段在java源码中定义顺序的影响。HotSpot虚拟机默认 的分配策略为long/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Points)普通对象指针。
对齐填充:起着占位符的作用。HotSpot VM自动内存管理系统要求对象起始地址是8字节的整数倍,即对象的大小必须是8字节的整数倍。而对象头大小是8字节的倍数。当对象实例数据部分没有对齐时,就需要对齐填充来补全。
2.3访问定位
java虚拟机栈中的reference类型存放对象的引用。访问具体对象目前有2种方式。句柄和直接指针。
若采用句柄访问,则reference中存储的是句柄池的地址,句柄中包含了对象实例数据与类型数据各自的具体地址信息。
若采用直接指针访问,则reference中存储的是对象的地址。(是对象类型数据的还是对象实例数据的?)

时间: 2024-11-08 23:46:06

《Java虚拟机》随笔记01的相关文章

《深入理解Java虚拟机》笔记01:走近Java

1.1 Java的技术体系 Sun官方所定义的Java技术体系包括以下几个组成部分: Java程序设计语言 各种硬件平台上的Java虚拟机 Class文件格式 Java API类库 来自商业机构和开源社区的第三方Java类库 Java程序设计语言.Java虚拟机.Java API类库这三部分统称为JDK(Java Development Kit),JDK是用于Java程序开发的最小环境 1.2 Java技术体系 Java Card:支持一些Java小程序(Applets)运行在小内存设备(如智能

《深入理解Java虚拟机》笔记01 -- 运行时数据区

运行时数据区示意图 1. 程序计数器 占用一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.主要用来记录线程执行到哪条语句了,分支.循环.跳转.异常处理.线程恢复等功能都需要依赖这个计数器来完成. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址:如果正在执行的时Native方法,这个计数器值则为空.此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域. 2. Java 虚拟机栈 线程私有,生命

深入理解JAVA虚拟机--读书笔记

如上图,判断线段AB和线段CD相交. 分析:如果线段AB和线段CD相交,只能是图中的两种相交情况.可以用向量叉乘来判断.如果(向量AB叉乘向量AC)*(向量AB叉乘向量AD)<= 0 并且(向量CD叉乘向量CA)*(向量CD叉乘向量CB)<= 0,那么说明线段AB与线段CD相交. 设A(X1,Y1), B(X2, Y2), C(X3, Y3), D(X4, Y4),三角形ABC的面积为:2A =  = X1*Y2 + X3*Y1 + X2*Y3 - X3*Y2 - X1*Y3 - X2*Y1.

《深入Java虚拟机》笔记:指令集 (转)

<深入Java虚拟机>笔记:指令集 指令 含义 iconst_m1 把int型常量-1压入栈中 iconst_0 把int型常量压入栈中 fconst_1 把float型常量1压入栈中 lconst_2 把long型常量2压入栈中 dconst_3 把double型常量3压入栈中 bipush byte1 把byte1转换成int型压入栈中 sipush byte1,byte2 把byte1,byte2组成的short转换成int压入栈中 aconst_null 把空对象压入栈中 ldc in

《深入Java虚拟机学习笔记》- 第4章 网络移动性

Java虚拟机学习笔记(四)网络移动性 <深入Java虚拟机学习笔记>- 第4章 网络移动性,布布扣,bubuko.com

《深入Java虚拟机学习笔记》- 第7章 类型的生命周期

一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令,或者通过不明确的创建.反射.克隆和反序列化): 当调用某个类的静态方法时(即在字节码中执行invokestatic指令): 当使用某个类或接口的静态字段,或者对该字段赋值时(用final修饰的静态字段除外,它被初始化为一个编译时常量表达式): 当调用Java API中的某些反射方法: 当初始化某个

《深入Java虚拟机学习笔记》- 第13章 逻辑运算

<深入Java虚拟机学习笔记>- 第13章 浮点运算 <深入Java虚拟机学习笔记>- 第13章 逻辑运算,布布扣,bubuko.com

《深入Java虚拟机学习笔记》- 第12章 整数运算

Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算.当byte.short和char类型值参与算术运算时,首先会将它们转换为int类型.这些操作码都不会抛出异常,溢出在这里通常可以被忽略. 整数加法 操作码 操作数 说明 iadd (无) 从栈中弹出两个int类型数,相加,然后将所得int类型结果压回栈 ladd (无) 从栈中弹出两个long类型数,相加,然后将所得long类型结果压回栈 将一个常量与局部变量相加 操作码 操作数 说明 iinc vindex

《深入Java虚拟机学习笔记》- 第2章 平台无关

Java虚拟机学习笔记(二)平台无关 <深入Java虚拟机学习笔记>- 第2章 平台无关,布布扣,bubuko.com

深度理解java虚拟机读书笔记(二)HotSpot Java对象创建,内存布局以及访问方式

内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的时候,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号代表的类是否被加载.解析并初始化.如果没有完成这个过程,则必须执行相应类的加载. (二)在堆上为对象分配空间.对象需要的空间大小在类加载完成后便能确定.之后便是在堆上为该对象分配固定大小的空间.分配的方式也有两种: