JVM学习笔记

7 篇文章 0 订阅

一、方法区与常量池

Java中的方法区实际上是堆内存的一个逻辑划分,属于堆的一部分,用来存放虚拟机加载的类信息,常量,静态变量,JIT编译后的代码数据。

虚拟机内存模型中不存在常量池的概念,但是方法区中存在一个叫做运行时常量池的部分。常量池是Class文件中的一个概念,用来存放编译期生成的各种字面量与符号引用,这部分内容在类加载后存入运行时常量池。值得一提的是,运行时常量池具有动态性,并不是只有在编译期进入常量池的数据才能放入运行时常量池,典型的应用是String类的intern()方法

二、虚拟机栈

虚拟机栈是线程私有的,与线程的生命周期相同,虚拟机栈是用来描述java代码方法执行的一种内存模型,java的线程中每个方法在执行的时候都会产生一个栈帧的数据结构,该数据结构存放于虚拟机栈中。

三、对象创建

虚拟机遇见new指令后,首先检查该指令参数能否在常量池中定位到一个类的符号引用,如果能,继续检查该符号引用代表的类是否已经完成过类加载过程,如果没有,先执行类加载过程。

类加载检查通过后,虚拟机为对象分配内存,根据虚拟机垃圾收集器是否能够带来完整内存的不同,采用指针碰撞(内存完整)或者空闲列表(内存碎片)的分配策略,在堆上进行CAS操作分配内存空间或者在TLAB区域进行内存分配,保证并发安全。

内存分配完成后,虚拟机将分配的地址空间初始化为0,也就是实例字段的初始化工作,紧接着进行对象头(ObjectHeader)的初始化例如MarkWord信息的补全,以上工作完成后,执行该对象的构造方法,完成对象的初始化。

四、对象访问的两种方式:

句柄池:同时存储对象在堆和方法区中的内存地址,两个指针

指针访问:直接存储对象在堆中的内存地址,对象的方法区信息保存在对象的实例数据中。

五、对象死活判定

引用计数法:每当一个对象被引用时,引用计数器就加一,引用时效就减一。缺点是无法解决孤岛对象(几个对象循环调用)

可达性分析:引用链分析,需要解决安全点问题

六、垃圾回收算法:

标记-清除:edan,速度快

复制算法:双survivor,没有碎片

标记-整理:节省空间,不频繁

七、常见的对象分配策略:

大对象直接进入老年代,长期对象直接进入老年代,空间分配担保。

八、Class文件结构

魔数,Class文件版本,常量池,访问标志,类索引、父类索引、接口索引,字段表集合,方法表集合,属性表集合

九、类加载时机

java虚拟机规范约定了有且仅有以下五种情况下,必须立刻执行类加载的整个过程:

  1. 使用new关键字实例化对象,读取或者设置一个类的静态且不被final修饰的字段,调用静态方法
  2. 使用java.lang.reflect包的方法对类进行反射调用
  3. 初始化一个类时必须先初始化其父类(接口例外)
  4. 虚拟机启动时,main方法所在的主类
  5. 使用java.lang.invoke.MethodHandle解析得到的方法句柄所在的类

除此以外的任何情形中,都不会触发类加载过程。

十、为什么需要两个survivor?

关键问题在于整个新生代进行快速GC的时候,采用的是标记清除算法。如果只有一个survivor,那么在第一次执行完标记复制算法,survivor中有对象以后,紧接着进行一次标记清除算法后,eden跟survivor中都会产生碎片,无法满足survivor区的设计需求——避免碎片产生。

十一、java方法的执行流程

每个java方法执行前都会经历解析,分派两个过程,之后方法以栈帧的形式存在于栈中,栈帧由局部变量表,操作栈,动态连接,返回地址四部分构成。字节码指令从局部变量表读取数据入栈,或者将栈中数据保存到局部变量表。动态连接存储运行时常量池中该方法的引用。

十二、如何判断对象大小

jvm中,对象由对象头,实例数据,对齐填充三部分构成,其中对象头包含MarkWord和一个指向方法区Class数据的指针,指针固定大小为4bytes,MarkWord在32为系统下为4bytes,64位系统下为8bytes。所以一个空对象,不包含任何实例成员变量的对象大小为8bytes或者12bytes,但由于jvm采用基于8bytes的内存分配策略,不足8bytes的要补全,所以一个对象至少为8bytes或者16bytes,剩下的根据类中的实例变量大小来增加。尽可能的,jvm会将大小一致的基本类型放在一起,满足该条件的前提下会将父类的成员变量放在前面,但并不绝对。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值