> 文档中心 > 简述JVM堆栈、对象存活分析、GC算法

简述JVM堆栈、对象存活分析、GC算法

目录

  • 1、堆栈简述
  • 2、线程堆栈分析
  • 3、对象存活分析
    • 3.1 引用计数法
    • 3.2 可达性分析法
  • 4、GC回收算法简述
    • 4.1 标记清除算法
    • 4.2 标记复制算法
    • 4.3 标记整理算法

1、堆栈简述

堆:

a、堆是JVM预留的空间,用于存放Java对象内容,被所有的线程共享。

b、堆由JVM的‘’垃圾回收“机制管理内存。

c、堆储存实例对象信息,分为了新生代、老年代、元空间。

d、回收机制:

  • 新生代:分为Eden、Survivor [səˈvaɪvər]To、SurvivorFrom
  • Eden:存放新创建的对象。
  • SurvivorTo:存放一次GC过程中的幸存对象。
  • SurvivorFrom:存放上一次GC过程中的幸存对象。
  • 当Eden区内存不足时触发MinorGC进行垃圾回收,回收策略为复制算法:将Eden和SurvivorFrom区域中的存活对象复制到SurvivorTo区域,并且对象年龄+1,当达到老年标准将对象存入到老年代中,最后将Eden和SurvivorFrom区域数据清空,将SurvivorFrom与SurvivorTo区域数据互换。
  • 老年代:存放稳定的对象,通过MinorGC将新生代对象存入老年代中或者将新创建的大对象存入老年代中,当内存不足时触发MajorGC垃圾回收,回收策略为清除算法:扫描一次老年代中的对象,将没有引用的对象进行回收。
  • 元空间:将类的元数据信息、常量池、静态变量存入到本地内存中(元空间是方法区的一种具体实现)。

e、参数配置:

  • -Xmx3072M:设置JVM最大可用内存为3072M。
  • -Xms3072M:设置JVM初始内存为3072M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

栈:
a、栈的大小由Java虚拟机动态分配和释放,线程独立。

b、存放局部变量和方法调用以及参数返回值的结构。

c、操作数据速度快,栈空间大小受限默认为1M(递归最容易出现栈溢出)

d、参数设置:

-Xss1M:设置每个线程的堆栈大小

2、线程堆栈分析

1、通过jps命令查看所有的启动类:
简述JVM堆栈、对象存活分析、GC算法
2、通过jstack查看,线程PID,然后阅读堆栈信息,通过线程状态以及日志打印的行号可以进行问题分析,命令如下:

# 直接打印jstack 13868# 写入到文件中jstack 13868  > test.log

3、查询最耗CPU线程方式:

# 第一步:找出当前java的进程ps aux | grep demo.jar | grep -v grep# 第二步:找到当前进程下消耗最高的线程,该命令会打印cpu消耗排名以及线程Idtop -Hp PID# 第三步分析线程堆栈jstack 线程ID

3、对象存活分析

3.1 引用计数法

概述:
给java对象添加一个引用计数器,当有一个引用时计数器 +1,引用失效时则 -1,当计数器为0时表示对象不存在任何引用,将进行回收操作,该算法java没有采用。
缺点:
无法解决循环对象相互引用的问题,当对象存在相互引用时,计数器不会为0,所以不会被回收,比如:

 MyObject object1 = new MyObject();     MyObject object2 = new MyObject();     object1.object = object2;     object2.object = object1; // 即使对象为null,也不会被回收     object1 = null;     object2 = null;

3.2 可达性分析法

那些属于 GC Roots:
1、虚拟机栈中引用的对象。
2、本地方法栈中引用的对象。
3、方法区中常量、静态属性引用的对象。
简述JVM堆栈、对象存活分析、GC算法
概念:
1、将一系列的GC Roots作为起点向下筛选,如果对象存在于引用链上时,则标识为存活状态。
2、如果对象不在于引用链上,但是对象重写 finallize方法或者没有执行过finzlize方法,则将对象存入队列中进行第二次筛选,如对象再次存在引用链则不会被回收,反之进行回收。
3、如果对象不在于引用链上,并且没有重写 finallize方法或者已经执行过finzlize方法,则在第二次筛选时直接被回收。
简述JVM堆栈、对象存活分析、GC算法

4、GC回收算法简述

4.1 标记清除算法

概念:
1、标记可达性对象
2、清除没有没有被标记的对象

优缺点:
递归效率低性能低,会停止整个程序运行

实例:
老年代回收算法:MajorGC

4.2 标记复制算法

概念:
1、把内存分成两块区域:空闲区和活动区。
2、当活动区内存用完时,标记可达性的对象,并且将可达的对象复制到空闲区,然后将空闲区变成活动区。
3、将以前的活动区中没有被标记的对象清空,变成空闲区。

优缺点:

回收速度快,但耗费空间会产生内存碎片

实例:
年轻代回收算法:MinorGC

4.3 标记整理算法

概念:
1、与标记-清除算法类似。
2、先标记可达性对象并且整理为一个连续的空间。
3、回收空间边界外没有被标记的对象。

优缺点:
递归标记和整理会耗时,但是不会产生内存碎片。

图示:
简述JVM堆栈、对象存活分析、GC算法

书法艺术字体