20161017

本文详细介绍了JVM中对象的创建过程,包括类的加载、空间分配、对象设置及初始化步骤。同时深入探讨了对象的内存布局、访问方式以及垃圾回收机制,包括常用的垃圾回收算法和不同类型的垃圾回收器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jvm运行时数据区
pc,记录线程执行的字节码的行号,控制流程以及线程切换
栈,后进先出结构,方法调用,栈桢,局部变量表,操作数栈,方法出口等
堆,逻辑上连续,存储对象
方法区,class文件,class对象,常量,static变量
运行时常量池,存在于方法区,保存class文件中的常量池的符号引用,常量,直接引用

创建对象
  • 加载类
new对象时,先检查运行时常量池有没有new的类的符号引用,没有的话需要加载类
  • 分配空间
为对象分配空间:类似栈的分配方法,移动指针,当垃圾清理是复制或标记整理模式时使用;采用记录表记录堆中空闲段来分配,当垃圾清理是标记清理模式时使用;tlab模式,即为每个线程分配堆空间,在这个空间里new对象,这样保证线程安全
  • 设置对象
设置对象头,记录对象对应的类,hash,锁,gc分代等信息
初始化对象空间,成员变量都变成0
  • 初始化
执行init方法

对象的内存布局
  • 对象头
存储对象自身的运行时数据,类型指针,数组还有数组长度
  • 对象数据
对象实例数据,父类对象数据也在内
  • 对齐填充

对象访问
  • 句柄访问
jvm有句柄池,句柄池记录对象地址和类地址,栈区的reference指向句柄池,优势:垃圾清理时减少指针数据变动
  • 直接指针
对象头直接存对象地址和类地址,优势:访问快

垃圾回收
  • 对象无用
引用计数器,无法解决循环引用
GC root可达性分析,通过引用链决定哪个对象无用,GC root包括:栈,静态变量,常量,本地栈

  • 引用分类
strong, 普通引用
weak, 内存不够时回收
soft, 下一次垃圾回收时回收
phantom,不影响垃圾回收,只是为了得到回收通知

finalize方法
gc root时候,如果对象没有重写finalize或者finalize已经被调用,必被回收;如果重写了finalize方法,把他加入f-queue队列,jvm会调用这个队列执行finalize,但这个方法只被执行一次

垃圾回收算法
复制算法
标记清除
标记整理

垃圾回收器
  • 新生代serial单线程复制,parnew多线程复制,parallel scavenge多线程,注重吞吐量复制
  • 老生代cms并发,减少停顿标记清除,serial old单线程标记整理,parallel old多线程,注重吞吐量标记整理
  • g1
  • cms过程:初始标记,并发标记,重新标记,并发清除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值