JVM之选择合适的垃圾收集器(CMS、G1)

news2024/12/24 10:01:56

1.JVM内存模型,栈、本地方法栈、程序计数器、堆、元空间、方法区、本地方法区,除程序计数器外,其他区域都能进行垃圾收集
在这里插入图片描述

2.栈,它的生命周期与线程相同,线程私有,会使用操作系统原生内存,方法内的局部变量、对象引用等,使用的内存会随着方法执行完,线程销毁而被操作系统回收,栈内存默认1M,JVM通过 -Xss256k 命令设置大小,.栈设置的越大,允许的栈深度越深(如递归),如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常

3.本地方法栈是执行本地Native方法的

4.程序计数器,保存代码执行位置,CPU下次再次执行时会从保存的位置处往下执行

5.方法区(元空间)用来存储类型的元数据信息,如:类全限定名、字段信息、方法名、方法代码、方法返回类型、常量池

6.堆,JVM最大内存区域,参数调优主要是该区域,虚拟机把堆内存按 分代 模型划分 新生代、老年代

6.1.新生代中的对象大多数都符合“朝生夕灭”,使用Young GC 往往能快速清理掉大部分垃圾,留下来的会在Survivor1与Survivor2直接来回拷贝,并增加对象的年龄,达到年龄的和大对象一起放到老年代

6.2.老年代存放新生代中多次未被回收的对象和大对象, 使用 Full GC,(1.每次Young GC之前会进行一些判断,看看是否需要老年代先进行一下Full GC,2.Young GC之后,存活对象Survivor区放不下,老年代也放不下了,那么触发一次Full GC)如果收集后还无法申请到内存,则会抛出OutOffMemoryError

6.3.垃圾对象判定标准:1.引用计数法(2个类互相引用时无法释放),2.可达性分析算法(JVM使用此方法)

6.4.垃圾回收算法:堆内存中,JVM根据不同年代(或JDK版本),使用不同垃圾回收算法

  • 标记-清除:标记出垃圾对象,直接清楚掉,会有内存碎片
  • 复制:复制算法速度快,内存使用率不高,新生代回收后只保留少量存活对象,复制到Survivor区
  • 标记-整理:标记所有可达对象,完成后未被标记的对象将会被清理掉,然后将所有存活的对象压缩到内存的一端,标记-整理算法解决复制算法内存减半的高额代价问题

6.5.JVM垃圾回收算法

  • Serial垃圾收集器:单线程回收,进行 Young GC 和 Full GC时所有的应用线程都会被暂停,适用于32位小型机小内存环境,使用 -XX:+UseSerialGC
  • ParallelGC垃圾收集器:多线程回收,进行 Young GC 和 Full GC时所有的应用线程都会被暂停,JDK 7u4 及之后版本的默认该收集器,使用 -XX:+UseParallelGC -XX:+UseParallelOldGC显示指定(前者是收集新生代、后者是收集老年代)
  • CMS收集器:多线程回收,进行 Young GC时所有的应用线程都会被暂停,Full GC 时不再暂停应用线程,(使用多个后台线程收集老年代,付出的代价是更高的 CPU 使用),JDK8中CMS收集器默认是关闭的,使用 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 显示开启(前者是收集新生代、后者是收集老年代)
  • G1垃圾收集器:多线程回收,新生代的垃圾收集仍然采用暂停所有应用线程,它把整个堆分成了2048个小区域,每个区域可能是新生代或老年代,对符合回收的区域进行回收,JDK8中使用 -XX:+UseG1GC 开启
  • ZGC垃圾收集器 :JDK11中可使用的回收算法,在G1上进行了多项优化,使用XX:+UnlockExperimentalVMOptions -XX:+UseZGC ,可以参考腾讯开源的Tencent Kona JDK11

6.6.怎么选择垃圾回收算法,建议如下:

  • CPU核心少,内存1-2GB的,使用JDK默认的收集器即可
  • CPU核心大于4,内存4-6GB的,使用CMS垃圾收集器: ‐XX:+UseParNewGC -XX:+UseConcMarkSweepGC
  • CPU核心大于8,内存6-32GB的,使用G1垃圾收集器: ‐XX:+UseG1GC

与CPU有关是因为CMS、G1都会开启多个后台线程来收集垃圾,如果CPU核心不够,会造成CPU资源竞争、退化为单线程收集,性能更慢

6.7.JVM关键参数设置:

  • 默认启动:java -jar xxx.jar
  • 设置最大内存启动:java -jar -Xms2g -Xmx2g xxx.jar
  • 设置新生代启动:java -jar -Xms4g -Xmx4g -Xmn1g xxx.jar
  • 使用CMS收集器启动:java -jar -Xms6g -Xmx6g ‐XX:+UseParNewGC -XX:+UseConcMarkSweepGC xxx.jar
  • 使用G1收集器启动:java -jar -Xms16g -Xmx16g ‐XX:+UseG1GC -XX:MaxGCPauseMillis=120 -XX:ParallelGCThreads=8 xxx.jar
预期停顿时间是120ms:-XX:MaxGCPauseMillis=120
垃圾收集线程数:-XX:ParallelGCThreads= N ,N = 8 + ((N - 8) * 5 / 8), N代表CPU 的数目
如果服务器上有多个JVM实例,则需要调整ParallelGCThreads数量,过多的线程数会导致争抢CPU资源,ParallelGCThreads = min(CPU数量/JVM实例数, 8+((N-8)*5/8))

更多其他参数请自行查阅

7.直接内存,NIO相关类使用了直接内存,避免数据在内核与JVM之间来回拷贝

8.JVM工具

 1.jps 查看java进程
 2.jstat 虚拟机统计工具
  jstat -gcutil 2764
   S0    S1   E    O     M    YGC YGCT FGC FGCT   GCT
   0.00 0.00 6.20 41.42 47.20 16 0.105 3   0.472 0.577
   E表示新生代Eden区使用了6.2%的空间,2个S0、S1表示Survivor0、Survivor1,老年代(O,表示Old)和元空间(M)则分别使用了41.42%和47.20%的空间。
   程序运行以来共发生Minor GC(YGC,表示YoungGC)16次,总耗时0.105秒;发生Full GC(FGC,表示Full GC)3次,总耗时(FGCT,表示Full GCTime)为0.472秒;
   所有GC总耗时(GCT,表示GC Time)为0.577秒
   
 3.jinfo 实时查看和调整虚拟机各项参数, jinfo pid
 4.jmap 用于生成堆转储快照dump文件,jmap pid ,jmap -dump:format=b,file=zy.bin 30790
 5.jhat 分析jmap生成的快照文件,jhat zy.bin (一般使用VisualVM,不用此命令工具)
 6.jstack 用来查看线程停顿情况,jstack [option] pid ,jstack -l 30790,option有 -F(当正常请求不被响应时,强制输出线程堆栈),-l(除堆栈外还输出锁信息),-m(可以显示c/c++本地方法堆栈)
 7.VisualVM https://visualvm.github.io
 8.JVM参数调优可以应用到eclipse或Idea,如:
   -XX:+UseParNewGC
   -XX:+UseConcMarkSweepGC
   或单独使用-XX:+UseG1GC

 9.查看JVM运行时长:jcmd process_id VM.uptime
 10.查看JVM属性:jcmd process_id VM.system_properties 或 jinfo -sysprops process_id
 11.获取JVM版本:jcmd process_id VM.version
 12.查看JVM内存:jinfo -flags process_id
 13.查看每个线程栈信息:jstack process_id

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

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

相关文章

智慧城市规划与建设中,经常看到的“智慧公厕”是什么?

在智慧城市、智慧机场、智慧园区、智慧服务区、智慧市政、智慧城管、智慧楼宇、智慧旅游等领域,经常看到的智慧公厕究竟是什么?让我们一起来揭秘“智慧公厕”这个常见于智慧城市建设项目的关键词。 从智慧公厕的诞生背景来看,由于智慧城市的…

JAVA 二叉树超详解(1)

树形结构 概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它根朝上,而叶朝下的,具有以下的特点: 1.有一个特殊的结点&…

【C语言】错题本(4)

一. 题目及选项: 答案解析: 知识点: 字符型在内存中的数据存储 char类型数据在内存中的图示: unsigned char类型数据在内存中的图示: 二. 题目及选项: 答案解析: A: B: C: D: 三. 题目及选项: 答案解析: 数据在计算机中是先转换成补码,再进行运算的!

论文笔记:ViTGAN: Training GANs with Vision Transformers

2021 1 intro 论文研究的问题是:ViT是否可以在不使用卷积或池化的情况下完成图像生成任务 即不用CNN,而使用ViT来完成图像生成任务将ViT架构集成到GAN中,发现现有的GAN正则化方法与self-attention机制的交互很差,导致训练过程中…

windows上配置vscode C/C++代码跳转

windows上配置vscode C/C代码跳转 安装插件 C/C 官方的 C/C 插件,必备的插件,是代码跳转、自动补全、代码大纲显示等功能的基础。 Gtags C/C GNU Global GNU Global除了安装该插件之外,还需要在本地下载安装GNU Global工具。多看下插件…

智算创新,美格智能助力智慧支付加速发展

9月21日,以“智算引领创新未来”为主题的紫光展锐2023泛物联网终端生态论坛在深圳举行。作为紫光展锐重要战略合作伙伴,美格智能标准模组产品线总经理郭强华、高级产品总监刘伟鹏受邀出席论坛。美格智能基于紫光展锐5G、4G、智能SoC、Cat.1 bis等芯片平台…

系统集成|第十二章(笔记)

目录 第十二章 沟通管理12.1 沟通的基本概念12.2 主要过程12.2.1 规划沟通管理12.2.2 管理沟通12.2.3 控制沟通 12.3 常见问题 上篇:第十一章、项目人力资源管理 第十二章 沟通管理 沟通管理在项目计划、执行、监控过程中具有重要的作用,项目经理应该拿…

【笔试强训选择题】Day47.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff…

笔试强训

&#x1f449;&#x1f3fb; Day3 字符串中找出最长的字符串 mycode&#xff1a; #include <iostream> #include<vector>using namespace std;int main() {vector<string> v;string str;getline(cin,str);for(int i 0;i<str.size();i){string s;while(i…

手持式静电场测试仪的功能说明

手持式静电场测试仪是一种便携式的测试仪器&#xff0c;能够快速、准确地测量静电场的强度和分布情况。其主要功能包括&#xff1a; 测量静电场强度&#xff1a;手持式静电场测试仪可以测量静电场的强度&#xff0c;包括静电场的电压、电场强度、电势差等参数。 测量静电电荷&…

(搞定)排序数据结构(1)插入排序 选择排序+冒泡排序

目录 本章内容如下 一:插入排序 1.1插入排序 1.2希尔排序 二&#xff1a;选择排序 2.1选择排序 三:交换排序 3.1冒泡排序 一:插入排序 1.1直接插入排序 说到排序&#xff0c;其实在我们生活中非常常见&…

谈谈最近招人的感受!

最近折腾新的项目&#xff0c;面试了很多实习生小伙伴&#xff0c;我说说我的一些「面试」感受&#xff0c; 虽然是一个老生常谈的话题&#xff0c;但是依然提一下。 准时很重要&#xff1a;提前一点时间&#xff0c;踩个点&#xff0c;别迟到&#xff0c;面试的过程中由于每个…

Python 模拟刮刮乐小游戏

"""刮刮乐小游戏知识点&#xff1a;1、随机模块 random2、嵌套循环 while for3、条件语句/跳转语句 if / continue4、列表添加元素函数 append()"""# 随机模块 import randomwhile True:# 奖品信息prize_info [一等奖, 二等奖, 三等奖, 谢谢惠顾…

交易日均千万订单的存储架构设计与实践 | 京东物流技术团队

一、订单系统概述 1.1 业务范围 服务业务线&#xff1a;快递、快运、中小件、大件、冷链、国际、B2B合同物流、CLPS、京喜、三入三出&#xff08;采购入、退货入、调拨入、销售出、退供出、调拨出&#xff09;等 1.2 订单中心价值 1、解耦&#xff08;提升系统稳定性&#…

基于Spring Boot的房屋租赁系统

目录 前言 一、技术栈 二、系统功能介绍 租客功能模块的实现 ​编辑 管理员功能模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 房屋是人类生活栖息的重要场所&#xff0c;随着城市中的流动人口的增多&#xff0c;人们对房屋租赁需求越来越高…

Unity HDR 无线延申的网格效果

无线延申的网格 该项目必须是再HDR项目 shader代码实现 Shader "Unlit/infTutorial1" {Properties{_Alpha ("Alpha", Range(0, 0.5)) 0.5}SubShader{Tags{"RenderPipeline""UniversalRenderPipeline""RenderType""…

【Java】基于物联网技术的智慧工地源码(项目端、监管端、APP端、智慧大屏)

智慧工地是将云计算、大数据、物联网、移动技术和智能设备等信息化技术手段&#xff0c;聚集在建筑工地施工管理现场&#xff0c;围绕人员、机械、物料、环境等关键要素&#xff0c;建立智能信息采集、高效协同管理、数据科学分析、过程智慧预测&#xff0c;最终实现建筑工地的…

工厂漏水怎么预防?教你一招,百试百灵

随着工业化的迅速发展&#xff0c;工厂和生产设施在现代社会中扮演着至关重要的角色。然而&#xff0c;这些设施在日常运营中也面临着各种各样的风险和挑战&#xff0c;其中之一是水浸事件。 水浸事件可能是由于天灾、设备故障、管道泄漏或人为失误等原因引发的&#xff0c;但无…

单片机上软字库换32进制存储,空间占用少20%

在之前的单片机字库建立的推送中: https://blog.csdn.net/platform/article/details/130742775&#xff0c; 存储了GB2312字符集对应的软字库文件&#xff0c;在16*16的编码下总字库的507KB&#xff0c;后来把字体切换成了12*12&#xff0c;软字库缩减到了301KB。当然这里面对…

速卖通商品详情数据接口

速卖通商品详情数据接口&#xff08;aliexpress商品详情API接口&#xff09;可以获取到速卖通商品的详细信息&#xff0c;如商品标题、价格、库存、详情描述、图片等。 速卖通商品详情API接口是速卖通提供的一种产品数据接口&#xff0c;可以帮助速卖通卖家快速地将产品分类、…