JVM虚拟机基础信息

对象什么时候可以被垃圾回收
根据根可达性算法 如过从根节点出发,一直查询相关的引用对象,没有被引用的对象就直接被垃圾回收
在Java语言中,可以作为GCRoots的对象包括下面几种:
(1). 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
(2). 方法区中的类静态属性引用的对象。
(3). 方法区中常量引用的对象。
(4). 本地方法栈中JNI(Native方法)引用的对象。
Object object = new Object()在内存中占用多少字节?(对象在 内存中的存储布局)

-
markword :存放锁的信息,GC标记信息,分代年龄
-
class pointer: 存放类的指针(这个对象属于哪个class的?)
-
instance data:你的成员变量所占的地方
-
padding:当整体字节数不能被 8整除的时候补到8的倍数(因为总线的宽度是8可以提高效率)
java 中默认会开启compressescClassPointers 会把64位(8个字节)的指针压缩成4个字节
所以回答这个问题:
在开启压缩的情况下
Object对象的
markword占用了8个字节
class pointer占用了4个字节
instance data占用了0个字节(Object对象没有成员变量)
padding:占用了4个字节(8+4+4=16)
共 16字节
在没有开启压缩的情况下
Object对象的
markword占用了8个字节
class pointer占用了8个字节
instance data占用了0个字节(Object对象没有成员变量)
padding:占用了0个字节
共 16字节
JVM对象内存布局与垃圾回收机制
JVM使用根可达性算法进行垃圾回收,未被引用的对象会被回收。GCRoots包括虚拟机栈、方法区的静态属性和常量引用、本地方法栈的JNI引用。一个新创建的Object对象,在开启压缩情况下,占用16字节,包括markword、classpointer和padding;未开启压缩时,同样占用16字节,但classpointer为8字节。
1876

被折叠的 条评论
为什么被折叠?



