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

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 2764S0    S1   E    O     M    YGC YGCT FGC FGCT   GCT0.00 0.00 6.20 41.42 47.20 16 0.105 3   0.472 0.577E表示新生代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 pid4.jmap 用于生成堆转储快照dump文件,jmap pid ,jmap -dump:format=b,file=zy.bin 307905.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.io8.JVM参数调优可以应用到eclipse或Idea,如:-XX:+UseParNewGC-XX:+UseConcMarkSweepGC或单独使用-XX:+UseG1GC9.查看JVM运行时长:jcmd process_id VM.uptime10.查看JVM属性:jcmd process_id VM.system_properties 或 jinfo -sysprops process_id11.获取JVM版本:jcmd process_id VM.version12.查看JVM内存:jinfo -flags process_id13.查看每个线程栈信息:jstack process_id

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

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

相关文章

python过滤敏感词

敏感词一般是指带有敏感政治倾向(或反执政党倾向)、暴力倾向、不健康色彩的词或不文明用语,论坛、网站管理员一般会设定一些敏感词,以防不当发言影响论坛、网站环境。若论坛、网站设置了敏感词,用户编辑的内容又含有敏…

Levels - UE5中的建模相关

一些日常的笔记; 可以使用Shapes面板建立基础模型: 可以在PolyModel中继续细分模型: UE5中的建模有PolyGroups概念,可以在Attributes面板中直接编辑: 使用GrpPnt方式可以直接用笔刷设定新的PolyGroups,这样…

抖音SEO矩阵系统源码开发搭建

1. 确定需求和功能:明确系统的主要目标和需要实现的功能,包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构:根据需求和功能确定系统的架构,包括前端、后端、数据库等部分的设计&#xff0…

计算机组成原理之硬件的内部结构,拆开单独的硬件,查看硬件组成部分的结构和功能。

大家好,欢迎阅读《计算机组成原理》的系列文章,本系列文章主要教内容是从零学习计算机组成原理,内容通俗易懂,大家好好学习吧!!! 更多的优质内容,请点击以下链接查看哦~~ ↓ ↓ ↓ …

由于找不到msvcr110.dll 无法继续执行的解决方法分享(最新)

msvcp110.dll 是 Microsoft Visual C 2010 Redistributable Package 中的一个组件,它包含了一些运行时库文件。当计算机缺少这个文件时,可能会出现一些问题,如程序无法正常运行、系统不稳定等。下面是 6 种修复方法: 第1种方法&am…

【注射论文基因,那些年不为人知的AI工具】

我们都知道写论文有很多前期准备工作&#xff0c;例如<任务书>、<文献综述>等等&#xff0c;那么我们能够用什么工具最大限度的提高完成效率的同时还能保证质量呢&#xff0c;让我们接着往下看&#x1f447; 1.文献快速阅读-iTextMaster 文章主题确定了&#xff0…

向建筑人推荐中国建筑出版传媒的《乡村振兴战略下传统村落文化旅游设计》

向建筑人推荐中国建筑出版传媒的《乡村振兴战略下传统村落文化旅游设计》

mysql第二次作业

作业&#xff1a; 创建一个数据&#xff0c;db_classics 创建一张表&#xff1a;t_hero id name nickname age address job weapon group 1 张百川 玉皇大帝 200000 2 孙悟空 齐天大圣 3 林妹妹 创建数据库&#xff0c;创建英雄表 添加对应…

Docker Dockerfile解析

Dockerfile是什么 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 官网&#xff1a;Dockerfile reference | Docker Docs 构建三步骤&#xff1a; 编写Dockerfile文件docker build命令构建镜像docker run依镜像运行容…

基于微信小程的流浪动物救助宠物领养平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

四川天蝶电子商务有限公司可靠吗?真实吗?

​近年来&#xff0c;抖音带货已成为一种日益流行的新零售趋势。而四川天蝶电子商务有限公司作为抖音带货领域的先行者之一&#xff0c;备受消费者关注。但是&#xff0c;我们不能仅凭其名声来评判其可靠性。在对该公司的抖音带货服务进行评估之前&#xff0c;有必要了解和了解…

PHP8的类与对象的基本操作之类常量-PHP8知识详解

php 8引入了一种新的特性&#xff0c;称为类常量&#xff08;class Constants&#xff09;。类常量是在类中定义的常量&#xff0c;类似于全局常量&#xff0c;但作用域仅限于定义它们的类。 在PHP 8中&#xff0c;类常量的作用域被限制在定义它们的类中。这意味着只有类的成员…

【算法思想-排序】根据另一个数组次序排序 - 力扣 1122 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

学习记忆——宫殿篇——记忆宫殿——记忆桩——学校

教室 桶 走道 桌子 暖气 窗台 后背 窗帘 监视器 白盒子 教师 讲台 表 投影仪 音响 窗 喇叭 黑板 门 栏杆 椅子 食堂 桶 刷卡器 柱子 桌子 风扇 灯罩 一列椅子 地面 大门空间 电视 活动室 盘子 纸盒 油桶 称 水桶 展牌 帘子 消防栓 毯子 储物箱 宿舍 梯子 坐垫 挂件 吊兰 君子…

大学宿舍IP一键视频对讲

大学宿舍ip一键视频对讲 大学宿舍一键视频对讲是指在大学宿舍内安装一套视频对讲系统&#xff0c;通过一键操作&#xff0c;实现与宿舍内其他人进行视频通话的功能。 该系统通常包括以下组成部分&#xff1a; 1. 室内终端&#xff1a;每个宿舍内安装一个室内终端&#xff0c;…

前端性能测试工具-lighthouse

Lighthouse简介 Lighthouse 是 Google 的一款开源工具&#xff0c;它可以作为一个 Chrome 扩展程序运行&#xff0c;或从命令行运行。只需要给 Lighthouse 提供一个要审查的网址&#xff0c;它将针对此页面运行一连串的测试&#xff0c;然后生成一个页面性能的报告。 Lightho…

C++ - map 和 set 的模拟实现 - 红黑树当中的仿函数 - 红黑树的迭代器实现

简单了解map 和 set 的实现 首先我们要知道&#xff0c;map 和 set 的底层就是 红黑树&#xff0c;但是 STL 当中 &#xff0c;map 和 set 并不是我们想象的&#xff0c;直接使用一个 pair 对象来存储一个 key-value 或者 是 一个 key。具体如下所示&#xff1a; set&#xff…

QUIC协议报文解析(三)

在前面的两篇文字里我们简单介绍了QUIC的发展历史&#xff0c;优点以及QUIC协议的连接原理。本篇文章将会以具体的QUIC报文为例&#xff0c;详细介绍QUIC报文的结构以及各个字段的含义。 早期QUIC版本众多&#xff0c;主要有谷歌家的gQUIC&#xff0c;以及IETF致力于将QUIC标准…

Spring底层原理之 BeanFactory 与 ApplicationContext

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring底层原理 一、 BeanFactory 与 Appli…

二维码智慧门牌管理系统:提升城市管理效率与服务水平

文章目录 前言一、系统原理及特点二、系统的优势与应用 前言 在当今快速发展的信息化时代&#xff0c;如何有效地管理城市地址信息成为了各大城市面临的重要问题。传统的门牌管理系统已经无法满足现代城市的需求&#xff0c;而二维码智慧门牌管理系统作为全新的解决方案&#…