来学习JVM吧

8/25/2021 JVM

JVM还是有必要学习的

# 用户线程

一共6种状态

  1. 初次标记状态
  2. 并发标记
  3. 并发可中断处理
  4. 最终重新标记
  5. 并发处理
  6. 并发重置

# 垃圾回收器

# 常用的两种

  1. 引用计数器 定义:当有其他对象引用时,默认引用+1,失效时-1, 弊端:存在互相引用的问题,造成引用无法为0
  2. (目前常用)可达性分析算法 定义:通过离散数学中引用,引用键

# 垃圾回收算法

注:JDK的区别,JDK6/7 包含'年轻代' '老年代' '永久代', 在JDK8中舍弃'老年代' 使用matespace替代

第一种:标记清除 它是最基础的收集算法。

  • 原理:分为标记和清除两个阶段:首先标记出所有的需要回收的对象,在标记完成以后统一回收所有被标记的对象。
  • 特点:(1)效率问题,标记和清除的效率都不高;(2)空间的问题,标记清除以后会产生大量不连续的空间碎片,空间碎片太多可能会导致程序运行过程需要分配较大的对象时候,无法找到足够连续内存而不得不提前触发一次垃圾收集。
  • 地方:适合在老年代进行垃圾回收,比如CMS收集器就是采用该算法进行回收的。

第二种:标记整理

  • 原理:分为标记和整理两个阶段:首先标记出所有需要回收的对象,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
  • 特点:不会产生空间碎片,但是整理会花一定的时间。
  • 地方:适合老年代进行垃圾收集,parallel Old(针对parallel scanvange gc的) gc和Serial old收集器就是采用该算法进行回收的。

第三种:复制算法

  • 原理:它先将可用的内存按容量划分为大小相同的两块,每次只是用其中的一块。当这块内存用完了,就将还存活着的对象复制到另一块上面,然后把已经使用过的内存空间一次清理掉。
  • 特点:没有内存碎片,只要移动堆顶指针,按顺序分配内存即可。代价是将内存缩小位原来的一半。
  • 地方:适合新生代区进行垃圾回收。serial new,parallel new和parallel scanvage 收集器,就是采用该算法进行回收的。
  • 复制算法改进思路:由于新生代都是朝生夕死的,所以不需要1:1划分内存空间,可以将内存划分为一块较大的Eden和两块较小的Suvivor空间。每次使用Eden和其中一块Survivor。当回收的时候,将Eden和Survivor中还活着的对象一次性地复制到另一块Survivor空间上,最后清理掉Eden和刚才使用过的Suevivor空间。其中Eden和Suevivor的大小比例是8:1。缺点是需要老年代进行分配担保,如果第二块的Survovor空间不够的时候,需要对老年代进行垃圾回收,然后存储新生代的对象,这些新生代当然会直接进入来老年代。

优化收集方法的思路 分代收集算法

  • 原理:根据对象存活的周期的不同将内存划分为几块,然后再选择合适的收集算法。 一般是把java堆分成新生代和老年代,这样就可以根据各个年待的特点采用最适合的收集算法。在新生代中,每次垃圾收集都会有大量的对象死去,只有少量存活,所以选用复制算法。老年代因为对象存活率高,没有额外空间对他进行分配担保,所以一般采用标记整理或者标记清除算法进行回收。

另注: Minor GC 年轻代 Full GC 老年代 其中: 新生代分为,Eden 和 两个 Survivor区(From 和 To) 默认比例为8:1:1 Minor GC:Full GC 默认为1:2

触发GC的几个条件

  1. 老年代空间不足时会触发
  2. 永久代空间不足时(JDK6和JDK7)
  3. CMS GC时出现 4.Minor GC上升到老年代的空间大于当前剩余空间
  4. 调用System.gc()方法
  5. RPC一小时一次

Stop-the-Word

  1. JVM由于要执行GC 所以要停止程序
  2. 任何的GC都会发生 3.多数GC通过减少Stop-the-Word来提高执行效率,

Safe Point 安全点 线程会被冻结

# JVM运行方式

  1. Server模式
  2. Client模式 可以通过Java -version来查看

年轻代的垃圾回收器

  1. Serial(收集器)---复制算法
  2. Parallel 复制算法 多线程 停顿时间
  3. Parallel Scavenge 复制算法 多线程 吞吐量

老年代的垃圾回收器

  • Serial Old --- 标记--整理
  • Parallel Old --- 多线程 。 标记---整理算法 ,另外 吞吐量优先
  • CMS GC --- 标记--- 清理算法
  • Garbage First --- 复制+标记 -- > 整理算法
    • 将堆分为多个大小相等的Region
    • 年轻代和老年代不在物理隔离

Object的finalize方法和C++的构析函数 给对象最后一次机会

Java中的强引用

类型引用 被垃圾回收时间 用途 生存时间
强引用 从来不会 对象一般状态 Jvm停止
软引用 在内存不足时 对象缓存 内存不足
弱引用 被垃圾回收时 对象缓存 GC 运行时
虚引用 unknown 标记,哨兵 unknown

参考:

Last Updated: 8/25/2021, 9:46:16 PM
我再没见过 像你一般的星空
Seto