JVM知识

2019-04-18  本文已影响0人  叫我民哥L

对象分配原则

类加载器

Java对象结构

Java对象由三个部分组成:对象头、实例数据、对齐填充。
对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。
实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)
对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)

如何判断对象可以被回收?

判断对象是否存活一般有两种方式:

JVM的永久代中会发生垃圾回收么?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下Java8:从永久代到元数据区 (注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)

引用分类

OutOfMemoryError异常

垃圾收集算法

算法 描述 优点 缺点
标记-清除 首先标记出所有需要回收的对象,在标记 完成后统一回收掉所有被标记的对象 最基础的收集算法 1.效率不高2.标记清除之后会 产生大量不连续的内存碎片
复制 将可用的内存容量划分为两个大小相等的两块, 每次只使用其中一块。当这一块的内存使用完, 就将还存活的对象复制到另外一块,然后将 已使用过的一次清理掉,适用于新生代 1.每次都是对半区进行内存回收, 内存分配时也不需要考虑内存碎片等复杂情况 2.只需要移动堆顶指针,按顺序分配内存即可 3.实现简单,运行高效 1.将内存缩小为原来的一半,代价高 2.在对象存活率较高时就要进行较多 的复制操作,效率将会变低
标记-整理 先标记出所有需要回收的对象,然后让所有存 活的对象都想一端移动,然后直接清理掉端边 界以外的内存 适用于对象存活率高老年代
分代收集算法 把Java堆分成新生代和老年代,根据各个年代 的特点采用最适当的收集算法。新生代采用复制, 老年代采用标记-清除或标记-整理

垃圾收集器

上一篇 下一篇

猜你喜欢

热点阅读