当前位置:网站首页>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)
边栏推荐
- 仿牛客论坛项目梳理
- 基本表单验证流程
- 2022杭电多校联赛第五场 题解
- 2 Gigabit Optical + 6 Gigabit Electric Rail Type Managed Industrial Ethernet Switch Supports X-Ring Redundant Ring One-key Ring Switch
- 基于Qt的目录统计QDirStat
- PL/SQL Some Advanced Fundamental
- 自定义通用分页标签01
- typescript type 和 interface 的区别
- 2.15 keil使用电脑端时间日期
- How to systematically plan and learn software testing?
猜你喜欢

MCU C language -> usage, and meaning

C language -- ring buffer

跨境电商看不到另一面:商家刷单、平台封号、黑灰产牟利

打造一份优雅的简历

千兆2光8电管理型工业以太网交换机WEB管理X-Ring一键环网交换机

【MD5】采用MD5+盐的加密方式完成注册用户和登录账号

new Date将字符串转化成日期格式 兼容IE,ie8如何通过new Date将字符串转化成日期格式,js中如何进行字符串替换, replace() 方法详解

Shell 函数

Eight guiding principles to help businesses achieve digital transformation success

目标检测-中篇
随机推荐
帮助企业实现数字化转型成功的八项指导原则
Why use Selenium for automated testing
JVM内存和垃圾回收-07.堆
外卖店优先级
How to systematically plan and learn software testing?
The Shell function
How to automatically export or capture abnormal login ip and logs in elastic to the database?
SQL query String field less than 10 how to check
函数,递归以及dom简单操作
4-way two-way HDMI integrated business high-definition video optical transceiver 8-way HDMI high-definition video optical transceiver
LeetCode每日一题(2285. Maximum Total Importance of Roads)
数组相关 内容 解析
Mobile payment online and offline payment scenarios
Basic form validation process
哎,又跟HR在小群吵了一架!
Introduction to the memory model of the JVM
Asynchronous programming solution Generator generator function, iterator iterator, async/await, Promise
base address: environment variable
拿捏JVM性能优化(自己笔记版本)
new Date将字符串转化成日期格式 兼容IE,ie8如何通过new Date将字符串转化成日期格式,js中如何进行字符串替换, replace() 方法详解