当前位置:网站首页>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)
边栏推荐
- 机器学习模型的“可解释性”
- 【医保科普】维护医保基金安全,我们可以这样做
- db2中kettle报错 Field [XXX] is required and couldn‘t be found 解决方法
- "Introduction to nlp + actual combat: Chapter 8: Using Pytorch to realize handwritten digit recognition"
- 数组相关 内容 解析
- 【Ryerson情感说话/歌唱视听数据集(RAVDESS) 】
- Asynchronous programming solution Generator generator function, iterator iterator, async/await, Promise
- MySQL query optimization and tuning
- 数据安全峰会2022 | 美创DSM获颁“数据安全产品能力验证计划”评测证书
- 一文详解DHCP原理及配置
猜你喜欢
《nlp入门+实战:第八章:使用Pytorch实现手写数字识别》
三分建设,七分管理!产品、系统、组织三管齐下节能降耗
2 Gigabit Optical + 6 Gigabit Electric Rail Type Managed Industrial Ethernet Switch Supports X-Ring Redundant Ring One-key Ring Switch
pnpm 是凭什么对 npm 和 yarn 降维打击的
docker+bridge+redis master-slave+sentry mode
机器学习之视频学习【更新】
跨境电商看不到另一面:商家刷单、平台封号、黑灰产牟利
自定义通用分页标签01
SVM介绍以及实战
4-way two-way HDMI integrated business high-definition video optical transceiver 8-way HDMI high-definition video optical transceiver
随机推荐
初识Numpy
八年软件测试工程师带你了解-测试岗进阶之路
mq应用场景介绍
劝退背后。
C language -- ring buffer
if,case,for,while
【id类型和NSObject指针 ObjectIve-C中】
嵌入式数据库开发编程MySQL(全)
JVM内存和垃圾回收-07.堆
MySQL 查询练习(1)
SQL注入中 #、 --+、 --%20、 %23是什么意思?
"Introduction to nlp + actual combat: Chapter 8: Using Pytorch to realize handwritten digit recognition"
马尔可夫链
Learn iframes and use them to solve cross-domain problems
2003. 每棵子树内缺失的最小基因值 DFS
2022杭电多校联赛第五场 题解
说说数据治理中常见的20个问题
XSS相关知识点
移动支付线上线下支付场景
Mobile payment online and offline payment scenarios