【JVM】为对象分配内存的方式,死亡对象判断方法

目录

为对象分配内存的方式

指针碰撞

空闲列表

TLAB

死亡对象判断方法

引用计数法

可达性分析算法


为对象分配内存的方式

指针碰撞

一般情况下,JVM的对象都放在堆内存中(发生逃逸分析除外)。当类加载检查通过后,JVM为新生对象分配内存 。如果Java堆中内存是绝对规整的,所有被使用过的的内存都被放到一边,空闲的内存放到另外一边,中间放着一个指针作为分界点的指示器,需要为新对象分配内存时指针就向空闲区移动到对应位置,这种分配方式就是 指针碰撞。

空闲列表

如果Java堆内存中的内存并不是规整的,已用的内存和空闲内存相互交错,指针碰撞就不能用了,虚拟机必须维护一个列表,记录哪些内存是可用的,在分配的时候从列表找到一块大的空间分配给对象实例,并更新列表上的记录,这种分配方式就是空闲列表。

TLAB

把内存分配按照线程划分在不同的空间中进行,每个线程在Java堆中预先分配一小块内存,这就是TLAB(本地线程分配缓存) 。虚拟机通过 -XX:UseTLAB 设定它的。

死亡对象判断方法

引用计数法

给对象中添加一个引用计数器:

  • 每当有一个地方引用它,计数器就加 1;

  • 当引用失效,计数器就减 1;

  • 任何时候计数器为 0 的对象就是不可能再被使用的。

优点:实现简单,效率高。

缺点:它很难解决对象之间循环引用的问题。

可达性分析算法

基本思想就是通过一系列的称为 "GC Roots" 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径叫做引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。

哪些对象可以作为 GC Roots ?

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象

  • 本地方法栈(Native 方法)中引用的对象

  • 方法区中类静态属性引用的对象

  • 方法区中常量引用的对象

  • 所有被同步锁持有的对象

  • JNI(Java Native Interface)引用的对象

相关推荐
m0_674294644 小时前
C#怎么使用Channel异步通道 C#如何用BoundedChannel实现有界队列限流异步数据流【进阶】
jvm·数据库·python
云深麋鹿4 小时前
C++ | 容器stack&queue
开发语言·c++
m0_748920364 小时前
HTML函数在系统更新后变卡是硬件老化吗_软硬兼容性排查【方法】
jvm·数据库·python
比老马还六4 小时前
element-ui,使用el-table时,type=“expand“和fixed一起使用坑
开发语言·javascript·ui
Xiu Yan4 小时前
Java 转 C++ 系列:STL容器之list
java·开发语言·数据结构·c++·stl·list·visual studio
weixin_424999364 小时前
如何正确对对象键名进行字母序排序并存入数组
jvm·数据库·python
搬砖小郭4 小时前
从0到1的springboot项目搭建到打包
java
maqr_1104 小时前
如何配置Oracle 19c审计清理_DBMS_AUDIT_MGMT自动清除策略
jvm·数据库·python
小芝麻咿呀4 小时前
边缘计算网关-EG8200Mini导轨版
java·人工智能·边缘计算
qq_372906934 小时前
如何用 JavaScript 实现单选式盒子颜色切换(点击高亮,其余复原)
jvm·数据库·python