当前位置:网站首页>JVM笔记
JVM笔记
2022-08-04 03:55:00 【wuhui2100】
一、JVM笔记
1、根可达算法(java标记是否可回收的对象),一般从四个根节点出发(线程栈变量、静态变量、常量池、JNI指针)

2、GC回收三种算法(根据这三种算法中和运用形成自己独有的GC)

1)、Mark-Sweep:标记清除
将标记的内存删除、是否对应的内存地址;导致形成零零碎碎的空间,以至于需要大空间对象时分配失败

2)、Copying:拷贝
分配几个大空间,根据根可达算法找出可用的数据放入到另一个大空间中,再次删除要回收的对应大空间
缺点:浪费空间

3)、Mark-Compact:标记压缩
回收的时候顺带将可用的进行重排序
缺点:效率低,比copy还低

3、堆内存逻辑分区
Java1.8默认都是把内存分为两大年代,回收一般使用分带回收机制;即分为新生代与老年代
新生代使用copying(拷贝算法),老年代使用Mark Compact(标记压缩算法)
新生代与老年代在内存比例为1:3,而新生代中eden与survivor比例是8:1:1
1)、新生代使用copying(拷贝算法)
新生代第一次垃圾回收(major gc)将伊甸区(eden)中存活的数据拷贝到幸存区(survivor-0)之后将eden区删除回收;
第二次将伊甸区(eden)中存活的对象与(survivor-0)幸存区0中对象都拷贝到幸存区1(survivor-1)中 将对应的eden与survivor-0都回收;
第三次就又将survivor-1拷贝回survivor-0中,回收eden与survivor-0区;
循环上面三个步骤;当存活的对象达到回收计数阈值时将对应的对象移到老年代中
2)、老年代使用Mark Compact(标记压缩算法)或者Mark Sweep(标记清除算法)结合使用
当老年代达到设置的阈值时就会触发full gc

4、垃圾回收器总图
垃圾回收器是随着内存的不断增长而演进的

1)、serial 垃圾收集器是内存在几兆到几十兆时,单线程的垃圾收集器(回收时执行的流程需要停止需要等待回收完成,才能再次使用程序)
即年轻代使用serial,老年代使用serial old垃圾收集器回收
2)、 Parallel Scavenge垃圾收集器是内存为几百兆到几G时,多线程垃圾收集器(回收时执行的流程需要停止需要等待回收完成,才能再次使用程序),Java1.8默认使用PS+PO的垃圾收集器组合
即年轻代使用Parallel Scavenge,老年代使用Parallel Old垃圾回收器
3)、CMS垃圾收集器,当内存为几十G时(多线程并不是越多越好),引入CMS垃圾回收,即多个工作线程与多个垃圾回收线程同时工作

工作线程与垃圾回收线程同时操作会存在误认为某对象可以进行垃圾回收,需要三色标记算法解决:
黑色标记:满足自己已经标记、已经自己指向的对象也都标记(孩子)则为黑色
灰色标记:自己标记完成,还没来得及标记指向的对象则标记为灰色
白色标记:还没有遍历到的节点

当上图B->D,没有扫描到,业务逻辑实现A->D产生了,则会将D当成垃圾,CMS解决方案就是将A标记为灰色,依然会漏标(不建议使用CMS)

4)、Epsilon在jvm中不做任何垃圾处理,用于开发jvm人员调bug,以及当很大的且不需要gc的对象时可以用来标记,防止其它垃圾收集器对它进行操作
5)、G1垃圾收集器,分区算法将部分区域进行回收,回收时会将所有新生代全部回收,当新生代很大时STW很长
主要为分区算法,将部分回收并发收集,压缩空闲空间不会延长GC的暂停时间,更容易预测GC暂停时间,使用于不需要很高吞吐量的场景;G1主要是物理不分代(一个个小区域),逻辑分带

6)、ZGC垃圾回收器
使用分页算法(go lang回收算法),ZGC的核心算法为颜色指针,也是进行分区,但是不再进行新生代与老年代是分带,

7)、Shenandoah,红帽提供开源的垃圾回收器
5、Java命令进行定位
1)、jsp 列出Java中所有进程
2)、jinfo + 进程号 列出当前进程下的相关属性
3)、jstat Java中数据跟踪信息
jstat -gc(参数) + 进程号 : 跟踪gc的一些信息
jstat -gc(参数) + 进程号 + 刷新毫秒数 :跟踪gc的一些信息以多少毫秒刷新一次
4)、jstack + 线程 查看当前进程下所有的线程调用栈信息
当存在cpu内存飙升时可以使用:
top :查看那个进程使用cpu很高
top -hp + 进程号 : 查看那个线程使用cpu很高
最后使用jstack 查看对应的栈信息看那个方法出现问题
5)、jmap 两大作用查看堆内存中那个对象占用的情况(不同类的对象占用内存的比重),产生堆转储文件(怀疑jvm内存有bug可以将这块内存导出来分析)
jmap histo + 进程号 :生成对象图
jmap histo + 进程号 | head 20 : 生成对象图中最大的前20个类对象所占比重
使用jmap有一个严重的问题:当将堆转存文件时,会卡死状态,直到转存成功再运行(生产环境不建议使 用)
6)、使用arthas(阿尔萨斯)工具
arthas阿里开源的jvm诊断工具,涵盖上面命令,主要有:
1、dashboard : 仪表盘,查看那个线程占用支援比较多
2、head dump: 堆转储文件
3、thread :列除所有线程,看那个cpu吃线程比较多
thread -d : 查看是否存在死锁
4、jvm : 列出java中设置的jvm参数,以及使用了哪些垃圾回收器
5、jad : 反编译java代码
6、redefine : 在线修改class
7、trace :单机版链路追踪,分布式链路追踪使用(zipkin)
边栏推荐
- Introduction to mq application scenarios
- [Ryerson emotional speaking/singing audiovisual dataset (RAVDESS)]
- 逻辑漏洞----其他类型
- 用户与用户互发红包/支付宝C2C/B2C现金红包php源码示例/H5方式/兼容苹果/安卓
- Sfdp 超级表单开发平台 V6.0.5 正式发布
- 复现20字符短域名绕过
- JVM内存和垃圾回收-07.堆
- SQL injection in #, - +, - % 20, % 23 is what mean?
- How to systematically plan and learn software testing?
- MCU C language -> usage, and meaning
猜你喜欢

SVM介绍以及实战

Mini program + new retail, play the new way of playing in the industry!

2003. 每棵子树内缺失的最小基因值 DFS

6-port full Gigabit Layer 2 network managed industrial Ethernet switch Gigabit 2 optical 4 electrical fiber self-healing ERPS ring network switch

目标检测-中篇

软件测试如何系统规划学习呢?

劝退背后。

Why use Selenium for automated testing

Architecture of the actual combat camp module three operations

学会iframe并用其解决跨域问题
随机推荐
基本表单验证流程
MRS: Alluxio的使用介绍
new Date converts strings into date formats Compatible with IE, how ie8 converts strings into date formats through new Date, how to replace strings in js, and explain the replace() method in detail
高效IO模型
什么是数字孪生智慧城市应用场景
解决问题遇到的问题
【MD5】采用MD5+盐的加密方式完成注册用户和登录账号
【医保科普】维护医保基金安全,我们可以这样做
数据治理平台项目总结和分析
内网服务器访问远程服务器的端口映射
Mini program + new retail, play the new way of playing in the industry!
How to automatically export or capture abnormal login ip and logs in elastic to the database?
Basic form validation process
【源码】使用深度学习训练一个游戏
Architecture of the actual combat camp module three operations
2 Gigabit Optical + 6 Gigabit Electric Rail Type Managed Industrial Ethernet Switch Supports X-Ring Redundant Ring One-key Ring Switch
本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现
Take care of JVM performance optimization (own note version)
2003. 每棵子树内缺失的最小基因值 DFS
使用serve搭建本地服务器