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命令查看所有的启动类:
2、通过jstack查看,线程PID,然后阅读堆栈信息,通过线程状态以及日志打印的行号可以进行问题分析,命令如下:
# 直接打印
jstack 13868
# 写入到文件中
jstack 13868 > test.log
3、查询最耗CPU线程方式:
# 第一步:找出当前java的进程
ps aux | grep demo.jar | grep -v grep
# 第二步:找到当前进程下消耗最高的线程,该命令会打印cpu消耗排名以及线程Id
top -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、方法区中常量、静态属性引用的对象。
概念:
1、将一系列的GC Roots作为起点向下筛选,如果对象存在于引用链上时,则标识为存活状态。
2、如果对象不在于引用链上,但是对象重写 finallize
方法或者没有执行过finzlize
方法,则将对象存入队列中进行第二次筛选,如对象再次存在引用链则不会被回收,反之进行回收。
3、如果对象不在于引用链上,并且没有重写 finallize
方法或者已经执行过finzlize
方法,则在第二次筛选时直接被回收。
4、GC回收算法简述
4.1 标记清除算法
概念:
1、标记可达性对象
2、清除没有没有被标记的对象
优缺点:
递归效率低性能低,会停止整个程序运行
实例:
老年代回收算法:MajorGC
4.2 标记复制算法
概念:
1、把内存分成两块区域:空闲区和活动区。
2、当活动区内存用完时,标记可达性的对象,并且将可达的对象复制到空闲区,然后将空闲区变成活动区。
3、将以前的活动区中没有被标记的对象清空,变成空闲区。
优缺点:
回收速度快,但耗费空间会产生内存碎片
实例:
年轻代回收算法:MinorGC
4.3 标记整理算法
概念:
1、与标记-清除算法类似。
2、先标记可达性对象并且整理为一个连续的空间。
3、回收空间边界外没有被标记的对象。
优缺点:
递归标记和整理会耗时,但是不会产生内存碎片。
图示:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/18021.html