JVM对象分配及垃圾回收机制

1、JVM中对象的创建过程。

JVM中对象的创建过程
  • 划分内存的方式:
    指针碰撞:要求堆空间必须时规整的
    空间列表:空间可以是不规整的,必须设置了一个空间列表
  • 解决并发安全问题:
    CAS :compare and swap 失败重试 (无锁化 乐观机制)
    Thread Local Allocation Buffer

2、对象的内存布局及访问方式。

对象的内存布局

Mark Word
对象填充:填充对象数据满足8字节的整数

  • 对象的访问定位
    使用句柄 (做一次地址转换)
    直接指针(访问速度更快,节约一次重定位)hotspot主流 访问方式

3、可达性分析算法与垃圾回收算法。

JVM java中,都是自动化的垃圾回收


判断对象的存活
  • 引用计数法(无法解决循环引用的问题)
  • 可达性分析(根可达) JVM采用的算法

GC Roots =====> Garbage Collection RootSet
静态变量
线程栈变量
常量池
JNI指针
内部引用:class对象、异常对象Exception、类加载器
同步锁:synchronized对象
内部对象:JMXBean
临时对象:跨代引用

  • class对象回收条件

1.class new出的所有对象都被回收掉了
2.类加载器也需要被回收掉
3.类 Java.lang.class对象
4.任何地方没有被引用,并且无法通过反射调用这个类的方法
5.参数控制 -Xnoclassgc 启动时禁止类的垃圾回收

  • Finalize
    对象的拯救,在垃圾回收的时候会回调的一个方法
    只有被回调一次(两次GC就会挂掉)

  • 各种引用
    强引用 =
    软引用 SoftRefrence(即将OOM时回收)
    弱引用 WeakRefrence(只要发生垃圾回收就会被回收)
    虚引用 PhantomRefrence(监控垃圾回收器是否正常)

4、分代回收理论及对象的分配策略。

几乎所有的对象都在堆中进行分配

  • 对象的分配原则
    对象优先在Eden分配
    空间分配担保
    大对象直接进入老年代
    长期存活的对象进入老年代
    动态对象年龄判定

大对象直接进入老年代的条件:
1.垃圾回收器 Serial ParNew
2.-XX:PretenureSizeThreshold=4m 大于这个

  • 虚拟机的优化技术
    逃逸分析 +触发JIT(热点数据) 会被分配到栈区


    对象分配原则
  • 分代回收理论


    回收理论

5.垃圾回收算法

  • 复制回收算法(新生代的算法)
    实现简单、运行简单
    没有内存碎片
    空间利用率只有一半

Appel式的复制回收算法
Appel式回收
提高空间利用率和空间分配担保


复制回收算法
  • 标记-清除算法(Mark-Sweep) 老年代算法
    位置不连续,产生碎片
    可以做到不暂停


    标记-清除算法
  • 标记-整理算法(Mark-Compact) (先标记->再整理->最后清除)


    标记-整体算法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容