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

2018-08-15  本文已影响8人  天渊hyominnLover

前言

深入理解JAVA虚拟机读书笔记及代码记录

Chapter Two:Java内存区域与内存溢出异常

2.1 运行时数据区内存分配概述

2.2 JVM对象特征

1. 创建对象

虚拟机为新建对象分配内存空间采用如下两种分配算法:

如何保证分配内存过程的原子性:

创建对象的整个过程:

graph TD
确保类已被加载并初始化-->获取对象大小
获取对象大小-->A{是否在TLAB中分配对象}
A{是否在TLAB中分配对象}-->|否|直接在Eden中分配对象
A{是否在TLAB中分配对象}-->|是|TLAB中分配
直接在Eden中分配对象-->CAS方式分配空间
CAS方式分配空间-->将分配的内存空间赋0值
TLAB中分配-->将分配的内存空间赋0值
将分配的内存空间赋0值-->编辑对象头
编辑对象头-->对象引用入栈
对象引用入栈-->初始化对象

2. 对象在内存中的结构

一个对象在内存中包括3个区域:对象头、实例数据、对齐填充(padding):

存储内容 标志位 状态
Hashcode和分代年龄 01 未锁定
指向锁记录的指针 00 轻量级锁定
指向重量级锁的指针 10 重量级锁定
11 GC标记
偏向线程ID、偏向时间戳、分代年龄 01 可偏向

对象头第二部分是类型指针,用于确定这个类是哪个类的实例

如果对象是数组,还要有一块记录数组长度的数据

3. 对象访问定位

目前市面上的JVM对于对象地址的定位有两种处理方式:

目前Hotspot用的是第二种方式

上一篇下一篇

猜你喜欢

热点阅读