JVM性能调优理论与实践

news2025/1/11 20:57:51

内存模型

方法区,堆是所有线程共有。

栈,本地计数器是线程私有。

方法区

保存class文件加载后的类信息,常量池数据等

1.8后叫metaspace

会OOM,如动态加载类文件时: java.lang.OutOfMemoryError: PermGen space

最大的内存区域,所有线程共享,保存对象和数组。

所有对象都存在堆中吗?

永久代并不属于堆内存中的一部分,jdk1.8之后永久代。

会OOM: java.lang.OutOfMemoryError: Java heap space

虚拟机栈

各个线程私有

保存栈帧

栈帧:每个方法被执行的时候创建,用于存储局部变量表(包括参数)、操作栈、方法出口等信息。

会栈溢出:java.lang.StackOverflowError

会OOM: JVM实现支持动态扩展时会,HotSpot不支持,不会OOM

本地方法栈

  • 保存native方法栈帧

  • 会栈溢出

  • 会OOM

程序计数器

  • 各个线程私有

  • 记录正在执行的JVM字节码指令位置

  • native方法执行时为空

  • 不会OOM

堆外内存

垃圾收集

CMS

  • 标记-清理:标记出垃圾对象,清除垃圾对象

  • 并发收集和清理,停顿较低,碎片多。

G1

  • jdk1.9默认的回收器

  • 控制回收时间:控制回收垃圾的时间,选择回收成本最低的Regions作为回收目标,达到实时收集的目的

  • 空间整理:空间碎片较少,有效的使用了连续空间,不会导致连续空间不足提前造成GC的触发

  • 内存拆分:把内存拆分成多等份(Region),逻辑上存在新生代和老年代的概念,无严格区分

 

什么情况下应该考虑使用G1
  • 实时数据占用超过一半的堆空间

  • 对象分配或者晋升的速度变化大

  • 希望消除长时间的GC停顿(超过0.5-1秒)

区别

  • 使用范围不同

    • CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用

    • G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用

  • STW的时间

    • CMS收集器以最小的停顿时间为目标的收集器。

    • G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)

  • 垃圾碎片

    • CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片。

    • G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。

  • 回收过程

方法与步骤

JVM内存调优主要目标是减少GC频率和耗时。GC包括以下几种

Minor GC:又叫young gc, 年轻代垃圾回收,主要采用复制清理算法。G1 GC也有youngGC

Full GC:又叫Major GC, old GC

监控工具

主要关注GC次数,GC耗时,线程数曲线,内存晋升分配,内存各区域折线

内存

jmap命令

jmap -heap pid //堆及新生代内存占用 
jmap -histo pid | jmap -histo:live pid //查看对象个数及大小 
jmap -dump:format=b,file=heap.hprof pid //导出内存文件 
jmap -dump:live,format=b,file=heapLive.hprof pid//只导出存活的对象

内存dump:Java 线程&内存在线分析 说明文档 

内存分析:VisualVM 或者 JProfiler

线程

  jtack命令

线程状态
线程动作
调用修饰

参考jstack — 查看堆栈信息

jstack -l pid//查看线程状态,打印锁相关日志。 有死锁会打印:Found one Java-level:deadlock

 

top -Hp pid //查看某个进程内各个线程的CPU占用。 jstack pid>thread.txt //dump线程信息到文本文件中。

  • NEW :线程创建未启动,不会出现在Dump中。

  • RUNNABLE:运行状态。

  • BLOCKED:受阻塞状态并等待监视器锁。

  • WAITING:无限期等待另一个线程执行特定操作。

  • TIMED_WAITING:有时限的等待另一个线程的特定操作。

  • TERMINATED:已退出的状态。

  • runnable:状态一般为RUNNABLE。

  • in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING。

  • waiting for monitor entry:进入区等待,状态为BLOCKED。

  • waiting on condition:等待区等待、被park。

  • sleeping:休眠的线程,调用了Thread.sleep()。

  • locked :使用synchronized申请对象加锁成功,成为监视器的拥有者。

  • waiting to lock :使用synchronized申请对象锁未成功,在进入区等待。

  • waiting on :使用synchronized申请对象锁成功后,释放锁幵在等待区等待。

  • parking to wait for 基本的线程阻塞原语,不通过监视器在对象上阻塞。和Concurrent包一起出现,如ReentrantLock

  1. 死锁分析

  2. CPU占用分析

top命令查到的线程号是10进制,jstack中打印的线程号是16进制,要把10进制转为16进制去查看

  1. GC

    1. GC日志开关

       

      -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

      1. PrintGC必须开启,只开启PrintGCDetails、PrintGCTimeStamps不会输出GC

    2. 查看是否开启GC日志打印

       

      admin@M-C02FXLJ1MD6M:~$ jinfo -flag PrintGC 11871 -XX:-PrintGC// 减号说明没有打开日志

    3. 动态设置GC开关: jinfo

          -flag pid:打印指定JVM的参数值

          -flag [+|-] pid:设置指定JVM参数的布尔值

          -flag = pid:设置指定JVM参数的值

     

    //打开GC开关 jinfo -flag +PrintGC 2345

    1. 分析GC日志

       

          GC分析工具:https://gceasy.io/gc-index.jsp

          内存泄露

  1. 标准

  • Minor GC执行耗时小于50ms;

  • Minor GC执行频率较低,小于10秒一次;

  • Full GC执行耗时小于1s;

  • Full GC执行频率较低,小于10分钟1次;

参数调优

参数类型

 

标准类型: -version -help。 各个JVM都会支持,一般不会变动 X参数:非标准参数(变动比较小),并且默认jvm实现这些参数的功能。如-Xcomp、-Xmixed。 XX参数:不稳定参数,各个JVM实现可能不同。 如-XX:+UseConcMarkSweepGC、-XX:+UseG1GC,-XX:MaxGCPauseMillis=500

内存

-Xms(memory start):初始堆大小,一般初始值可以和最大值设一样,避免GC后内存重新分配。

-Xmx(memory max):最大堆大小。

-Xmn(memory new):新生代大小。

-XX:NewRatio:新生代(Eden+2 survivor space)与老年代(除去持久代)的比值

线程

-Xss(stack size):每个线程的堆栈大小。

垃圾回收

-XX:MaxTenuringThreshold:年轻代最大年龄。

-XX:PretenureSizeThreshold:对象超过多大时直接在老年代分配,默认值0,单位字节。

-XX:ParallelGCThreads:并行收集器的线程数。

-XX:+DisableExplicitGC:禁止System.gc(),免得程序员误调用gc方法影响性能。

-XX:CMSFullGCsBeforeCompaction:CMS不对内存空间进行压缩、整理,这里配置多少次FullGC后进行内存压缩

-XX:+PrintGC

-XX:+PrintGCDetails

XX:+PrintGCApplicationStoppedTime:打印GC期间程序暂停时间

-XX:PrintHeapAtGC:打印GC前后的详细堆栈信息

-Xloggc:filename:设置GC日志位置

G1

-XX:MaxGCPauseMillis:最大停顿时间。

不要设置-Xmn, -XX:NewRatio. G1会动态调整年轻代大小,以满足最大停顿时间。

-XX:G1HeapRegionSize = n 设置region大小

-XX:InitiatingHeapOccupancyPercent = 45 设置触发GC的堆占用百分比

-XX:G1NewSizePercent = 5 设置要用作年轻代大小的最小值的堆百分比。默认值为Java堆的5%

-XX:G1MaxNewSizePercent = 60 设置堆大小的百分比,以用作年轻代大小的最大值。默认值为Java堆的60%

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

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

相关文章

22款奔驰GLE450升级香氛负离子 车载香薰功能

相信大家都知道,奔驰自从研发出香氛负离子系统后,一直都受广大奔驰车主的追捧,香氛负离子不仅可以散发出清香淡雅的香气外,还可以对车内的空气进行过滤,使车内的有害气味通过负离子进行过滤,达到车内保持清…

prometheus|云原生|轻型日志收集系统loki+promtail的部署说明

一, 日志聚合的概念说明 日志------ 每一个程序,服务都应该有保留日志,日志的作用第一是记录程序运行的情况,在出错的时候能够记录错误情况,简单来说就是审计工作,例如nginx服务的日志,kuber…

3D旋转tab图

上图 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>3D旋转tab图</title><style>* {margin: 0;padding: 0;}body {height: 100vh;background: linear-gradient(to top, #29323c, #…

CRM选型:避免盲目跟风,要选最适合自己的!

CRM系统品牌繁多&#xff0c;各有优劣。对CRM系统不够了解的企业该如何选到适合的CRM系统&#xff1f;针对这个问题&#xff0c;我们就来聊聊&#xff0c;如何判定CRM系统是否适合自身企业&#xff1f; 一、综合性 CRM系统应该具有很好的综合性能&#xff0c;能够管理客户的整…

SpringTask入门案例

Task cron表达式在线生成网址&#xff1a; https://cron.qqe2.com/ import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** 定时任务类*/ Sl…

中通快递单号查询入口,并分析筛选出揽收中转延误件

批量查询中通快递单号的物流信息&#xff0c;并将其中的揽收中转延误件(从“揽收”至“到达转运中心”之间的时间差超过24小时的单号)分析筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递…

倾斜摄影三维模型的根节点合并的优势分析

倾斜摄影三维模型的根节点合并的优势分析 根节点合并是倾斜摄影三维模型处理中的一项重要技术&#xff0c;它具有许多优势&#xff0c;可以显著提升模型数据的处理效率和渲染性能。在本文中&#xff0c;我们将对倾斜摄影三维模型的根节点合并的优势进行详细分析。 1、数据大小…

网络运维与网络安全 学习笔记2023.12.3

网络运维与网络安全 学习笔记 第三十三天 今日目标 目录-文件基本管理、vim文本编辑、用户账号管理 组账号管理、归属控制、权限控制 目录-文件基本管理 ls 列目录及文档属性 ls - List 格式:ls[选项]…[目录或文件路径] 1.如果不以/开始,表示相对路径(省略了当前所在位置…

深圳找工作用什么招聘网

在深圳找工作&#xff0c;推荐使用吉鹿力招聘网这个招聘网。吉鹿力招聘网是一款主打招聘的App&#xff0c;用户可以通过聊天的方式直接与招聘方进行沟通。在互联网和科技企业用户多的情况下&#xff0c;吉鹿力招聘网提供了中小型企业选择的机会&#xff0c;也有部分大型企业在使…

小红书母婴行业博主投放策略,母婴新消费主义!

变幻莫测的消费市场&#xff0c;如果说有什么十年前存在&#xff0c;十年后不会消亡&#xff0c;甚至潜力始终可观的品类&#xff0c;母婴行业绝对可以排进前三名。那么母婴行业的消费新趋势和发展新风口究竟在哪里呢&#xff0c;今天和大家一起分析下小红书母婴行业博主投放策…

C++知识点总结(7):枚举算法之最大公约数和最小公倍数

一、枚举算法 枚举算法&#xff0c;将问题的所有可能的情况进行逐一列举&#xff0c;然后筛选出符合要求的一种程序处理算法。 枚举算法&#xff08;特别是暴力枚举的时候&#xff09;的缺点是&#xff0c;容易超时。一个计算机一般 1 秒最多运行 1e8 次&#xff0c;一旦超过 1…

fpga rom 初始化文件的一些心得

目录 可能遇到的问题 问题 解决方案 rom的初始化 用途 文件类型 如何生成初始化文件 示例 Altera Xilinx 可能遇到的问题 问题 altera FPGA的rom找不到初始化文件&#xff0c;编译过程会提示类似的问题 Error(127001): Cant find Memory Initialization File or He…

基于Java SSM框架+Vue实现企业公寓后勤管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现企业宿舍后勤管理网站演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所…

React--引入第三方插件时,标签名是小写报错问题

报错信息 报错原因 1.组件名得大写 2.缺少 import 语句 解决方案 declare global{namespace JSX{interface IntrinsicElements {micro-app: any}} }

跨网文件摆渡系统:安全、可控的数字传输桥梁

在企业高度信息化的时代&#xff0c;数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而&#xff0c;在数据流通的过程中&#xff0c;我们经常会遇到各种难题和挑战&#xff0c;尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…

015 OpenCV 霍夫变换(圆检测)

目录 一、环境 二、算法原理 三、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、算法原理 霍夫圆检测&#xff08;Hough Circle Detection&#xff09;是计算机视觉中一种常用的图像处理技术&#xff0c;主要用于检测…

汽车底盘构造之离合器

目录 1.离合器的工作原理 2.离合器的作用 3.对摩擦离合器的基本性能要求 4.离合器的分类 5.膜片弹簧离合器 5.1膜片弹簧离合器结构 5.2膜片弹簧离合器的弹性特性 5.3膜片弹簧离合器的分类 6离合器工作原理 6.1名词解释 6.2工作过程 1.离合器的工作原理 离合器位于发…

问CHAT:怎样保持数据库中数据的完整性?

CHAT回复&#xff1a;保持数据库中数据的完整性有以下一些方法&#xff1a; 1. 使用约束&#xff1a;数据库中的约束可以确保数据遵循特定的规则。 例如&#xff0c;我们可以使用 UNIQUE 约束防止在某列中插入重复值&#xff0c;使用 NOT NULL 约束防止插入空值&#xff0c;或…

含mask的单通道灰度图内容可视化python

输入&#xff1a;单通道的灰度图&#xff0c;灰度图内含不同像素值的掩膜mask 输出&#xff1a;灰度图内的掩膜mask在RGB图像中输出 方法很简单&#xff0c;就是读取灰度图&#xff0c;根据掌握的像素值信息&#xff0c;分别赋予不同的颜色值像素进行保存输出。 如下输入的单…

电容、电感和电阻

一、电感 1&#xff09;图片 2&#xff09;作用 a&#xff09;储存容量 例如dcdc转换器的原理,将一个电压值转换成另外一个电压值 b&#xff09;选择信号 比如空气中弥漫着很多信号&#xff0c;我们应该怎么选取我们所需要的信号。 电感和电容可以看成一个电阻&#xff0c;当电…