Java GC了解

在这里插入图片描述

Jstack找到线程的快照

jvm提供其他命令作用
jps: 虚拟机进程状况工具,类似linux的ps命令
jstat:虚拟机统计信息监视工具,经常看gc情况的会使用到
jinfo: java配置信息工具
jmap: java内存映射工具,dump,查看堆情况一般会用到
jhat: 虚拟机堆转储快照分析工具,分析dump文件
jstack: Java堆栈跟踪工具,查看线程的堆栈情况
整个jstack文件分析
一般我们比较关注WAITING 、 TIMED_WAITING和BLOCKED状态的线程,可以利用以下命令进行分类
如果 WAITING 之类的特别多,那么多半是有问题啦。
GC
可以在程序启动的时候,开启GC日志,一些参数说明参考https://lihuimintu.github.io/2019/02/19/gcLog/
jstat -gc pid 1000命令来对 gc 分代变化情况进行观察,1000 表示采样间隔(ms),S0C/S1C、S0U/S1U、EC/EU、OC/OU、MC/MU 分别代表两个 Survivor 区、Eden 区、老年代、元数据区的容量和使用量。YGC/YGT、FGC/FGCT、GCT 则代表 YoungGc、FullGc 的耗时和次数以及总耗时。
S0C 年轻代中第一个survivor(幸存区)的容量 (字节)
S1C 年轻代中第二个survivor(幸存区)的容量 (字节)
S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC 年轻代中Eden(伊甸园)的容量 (字节)
EU 年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC Old代的容量 (字节)
OU Old代目前已使用空间 (字节)
PC Perm(持久代)的容量 (字节)
PU Perm(持久代)目前已使用空间 (字节)
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT从应用程序启动到采样时gc用的总时间(s)

新生代一般是占用堆的1/3的空间,新生代又分为Eden区、ServivorFrom、ServivorTo三个区。Eden区内存不够,会触发垃圾回收,一般这个区域垃圾回收的采用复制算法,老年代一般是标记清除算法。在Java8以后的时代,永久代被移除了,而是利用元数据区所取代,元空间和永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用内存,因此元空间的大小只是受到本地内存的限制,类的元数据放入native memory,字符串池和类的静态变量放入java队中,这样元数据空间不再由MaxPermSize控制,而是由系统的实际可用空间来控制。
新生代一般使用minjorGC(复制算法)
MinjorGC(YONGGC)过程:
对象直接在年轻代中的Eden区进行分配,如果Eden区域没有足够的空间,那么就会触发YGC(Minor GC),YGC处理的区域只有新生代。因为大部分对象在短时间内都是可收回掉的,因此YGC后只有极少数的对象能存活下来,而被移动到S0区(采用的是复制算法)
1.eden、ServivorFrom中存活对象复制到ServiorTo,年龄+1
2.清空eden、ServivorFrom中的对象
3.ServivorTo和servicevicorFrom互换,原来 to成为下次GC时的from。
进入老年代的4个条件:
YGC时,To Survivor区不足以存放存活的对象,对象会直接进入到老年代
经过多次YGC后,如果存活对象的年龄达到了设定阈值,则会晋升到老年代中。YGC时,To Survivor区不足以存放存活的对象,对象会直接进入到老年代。
动态年龄判定规则,To Survivor区中相同年龄的对象,如果其大小之和占到了 To Survivor区一半以上的空间,那么大于此年龄的对象会直接进入老年代,而不需要达到默认的分代年龄。
大对象:由-XX:PretenureSizeThreshold启动参数控制,若对象大小大于此值,就会绕过新生代, 直接在老年代中分配。
老年代空间算法回收:
老年代的对象还是比较稳定,所以fullGC不会频繁执行,在进行fullgc前一般都进行一次yonggc,使得有新生代进入老年代,导致空间不够用才触发,当无法找到足够大的连续分配给新创建对象时也会提前触发一次fullgc进行垃圾回收腾出空间。fullgc采用标记清除算法或者标记复制算法。
fullGc什么时候发生
老年代的内存使用率达到了一定阈值(可通过参数调整),直接触发FGC。
空间分配担保:在YGC之前,会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。如果小于,说明YGC是不安全的,则会查看参数 HandlePromotionFailure 是否被设置成了允许担保失败,如果不允许则直接触发Full GC;如果允许,那么会进一步检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果小于也会触发 Full GC。
Metaspace(元空间)在空间不足时会进行扩容,当扩容到了-XX:MetaspaceSize 参数的指定值时,也会触发FGC。
System.gc() 或者Runtime.gc() 被显式调用时,触发FGC。
垃圾收集器

2.5.1 分代收集器

ParNew:一款多线程的收集器,采用复制算法,主要工作在 Young 区,可以通过-XX:ParallelGCThreads参数来控制收集的线程数,整个过程都是 STW 的,常与 CMS 组合使用。
CMS:以获取最短回收停顿时间为目标,采用“标记-清除”算法,分 4 大步进行垃圾收集,其中初始标记和重新标记会 STW ,多数应用于互联网站或者 B/S 系统的服务器端上,JDK9 被标记弃用,JDK14 被删除,详情可见JEP 363。

2.5.2 分区收集器

G1:一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能地满足垃圾收集暂停时间的要求。
ZGC:JDK11 中推出的一款低延迟垃圾回收器,适用于大内存低延迟服务的内存管理和回收,SPECjbb 2015 基准测试,在 128G 的大堆下,最大停顿时间才 1.68 ms,停顿时间远胜于 G1 和 CMS。
Shenandoah:由 Red Hat 的一个团队负责开发,与 G1 类似,基于 Region 设计的垃圾收集器,但不需要 Remember Set 或者 Card Table 来记录跨 Region 引用,停顿时间和堆的大小没有任何关系。停顿时间与 ZGC 接近,下图为与 CMS 和 G1 等收集器的 benchmark。
上下文切换
针对频繁上下文问题,我们可以使用vmstat命令来进行查看

vmstat pid # cs(context switch)一列则代表了上下文切换的次数。
# 特定的 pid 进行监控那么可以使用 pidstat -w pid命令,cswch 和 nvcswch 表示自愿及非自愿切换。
pidstat -w pid 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务篇面试题

1、SpringCloud的组件有哪些? 2、负载均衡如何实现? 3、什么是服务雪崩?怎么解决? 4、项目中有没有做过限流? Tomcat单体可以,分布式不适合 5、解释一下CAP和BASE P:加入node03这边的网络断了&a…

基于PCIe的智能处理系统研究

引言 人工智能是集合众多方向的综合性学科,在诸多应用领域均取得了显著成果。随着航空领域人工智能技术研究的不断深入,面向开放式机载智能交互场景,人工智能的应用可解决诸多问题。例如智能感知、辅助决策等,可利用人工智能算法对多源传感器捕获的海量信息进行快速处理,仅将处…

Go语言异常处理方式

Go 语言没有传统的异常处理机制,如 Java、C 或 Python 中的 try-catch 语句。取而代之,Go 采用了基于返回错误值和 panic/recover 机制的混合模式来进行错误处理。以下是 Go 语言中处理异常(或称错误)的两种主要方式: …

【8086汇编】汇编语言基础入门

文章目录 一、汇编简介1. 汇编语言的组成2. CPU、寄存器、内存3. CPU对存储器的读写4. 拓展5. 检测6. 解析 二、寄存器1. mov、add命令2. 物理地址3. CS:IP 装段地址和偏移地址3.1 如何改变CS:IP的值 4. 数据段DS:[address]4.1 前置知识:字与字节4.2 DS:[address] 5…

[EFI]Z420电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 Hewlett Packard Z420 Workstation处理器Intel Xeon E5-1650v2已驱动内存8GB 2133MHz DDR4 * 2已驱动硬盘闪迪 1T M.2 NVMe SSD已驱动显卡RX 480已驱动声卡ALC已驱动网卡Intel Ethernet Connection I219-V无线网卡蓝牙博通 BCM94360Z4 已驱动 支持系统版本…

整数在内存中的存储和内存操作函数

目录 整数在内存中的存储1. 整数在内存中的存储2. 大小端字节序和字节序判断2.1 什么是大小端?2.2 为什么有大小端 3. 练习3.1 请简述大端字节序和小端字节序的概念,设计⼀个小程序来判断当前机器的字节序。(10分)-百度笔试题3.2 练习23.3 练…

每日三道面试题之 Java并发编程 (三)

1.什么是上下文切换? 在Java线程知识中,上下文切换是指操作系统在多任务环境下,为了实现多任务的并行执行,需要在运行一个任务(如一个线程或进程)时切换到另一个任务运行的过程。上下文切换是多任务操作系统的核心特…

java:特殊文件(properties,xml)和日志

特殊文件 txt(文本文件) txt文件是一种纯文本文件,用于存储文本信息 优缺点:txt文件简单易用,可以使用任何文本编辑器打开和编辑,但不支持数据类型和结构,所有信息均用纯文本形式保存 适合简单的配置信息存储 properties文件 properties文件是一种键值对文件,用于存储配置…

从零自制docker-10-【cgroup进行容器资源限制】

文章目录 目的导入包的相关公开原则当前进程的挂载信息deferfor scanner.Scan()判断字符串包含新建的cgroup的默认文件cpu相关配置对应到ubuntu 22.04版本的cpu相关配置top注意查看你可使用的cpu注意坑启动后的top查看显示进程使用的cpu序号代码结果 目的 启动容器时通过-mem、…

《每天十分钟》-红宝书第4版-对象、类与面向对象编程(七)

类 之前的几个继承模式,只使用 ECMAScript 5 的特性来模拟类似于类(class-like)的行为。不难看出,各种策略都有自己的问题,也有相应的妥协,而且代码又丑又长。 为了解决这些问题,ECMAScript 6 …

JAVA集合(学习)

1.Java集合框架体系图 集合框架Collection单列集合List 有序,可重复Vector 数组结构,线程安全ArrayList 数组结构,非线程安全LinkedList 链表结构,非线程安全Set 无序,唯一HashSet 哈希表结构LinkedHashSet 哈希表…

Spring Bean作用域

Sping中bean的scope的值可以是singleton、prototype、request、session、global session。默认情况下是singleton。只有在web容器中才能使用request、session、global session。 singleton:单例模式,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次。关闭容器…

简单几步启用Ubuntu root用户密码登录

Ubuntu默认登录用户为ubuntu,且禁用了root用户使用密码方式登录。 若要开起root用户登录,只需要以下几步: 1.使用ubuntu用户登录Linux服务器。 2.使用sudo修改root用户密码。 sudo passwd root 输入新设置的root用户密码,此时…

Mac下Homebrew更新国内源brew update卡死(完美解决)

先更新下brew 有时brew版本太旧也会有问题 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 再更新国内源 #更新Homebrew cd "$(brew --repo)" git remote set-url origin https://mirrors.ustc…

jvisualVM分析jvm内存使用快照dump

服务发生内存溢出,就需要查看服务器上Java服务的jvm堆内存使用情况,可以使用dump命令生成dump文件,然后下载到本地,然后使用jvisualVM工具打开,即可实现可视化分析。 生成dump文件常用的两种方式: 第一种…

6-138 大整数相加

本题要求实现一个函数,实现大整数相加运算。大整数按每4位保存在整数数组中,如果大整数位数不是4的倍数,则将保证低位都按4位一存。如“123456789”保存为1,2345,6789。 函数接口定义: int convert(char a[],int x[]); int add(int x[],int len1,int y[],int len2,int …

[react] useState的一些小细节

1.无限循环 因为setState修改是异步的,加上会触发函数重新渲染, 如果代码长这样 一秒再修改,然后重新触发setTImeout, 然后再触发,重复触发循环 如果这样呢 还是会,因为你执行又会重新渲染 2.异步修改数据 为什么修改多次还是跟不上呢? 函数传参解决 因为是异步修改 ,所以…

代码随想录算法训练营第三十六天| 435. 无重叠区间、 763.划分字母区间、56. 合并区间

435 题目: 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 题目链接:435. 无重叠区间 - 力扣(LeetCode) 思路: …

Nacos 入门篇---服务端如何处理客户端的服务注册请求?(三)

一、引言 ok呀,上个章节我们讲了Nacos客户端的服务自动注册,今天我们来看看服务端接收到了客户端的服务注册请求,服务端都做了哪些事情~ 二、目录 目录 一、引言 二、目录 三、回顾上节内容: 四、Nacos 服务代码入…

工作流引擎项目解析(二)

流程变量设置于获取 Activiti--流程变量_runtimeservice.setvariable-CSDN博客 Process Variables | docs.camunda.org 设置 启动时设置任务完成时设置runtimeService.setvars…()taskservice.setvars…() ProcessEngine processEngine ProcessEngines.getDefaultProcessEn…