JVM第十三讲:调试排错 - JVM 调优参数

调试排错 - JVM 调优参数

本文是JVM第十三讲,调试排错 - JVM 调优参数。对JVM涉及的常见的调优参数和垃圾回收参数进行阐述。

文章目录

  • 调试排错 - JVM 调优参数
      • 1、Jvm参数
      • 2、垃圾回收
    • 问题1:线上ECS治理
    • 问题2:白龙马线上服务机JVM参数配置?

1、Jvm参数

  • -Xms

堆最小值

  • -Xmx

堆最大堆值。-Xms与-Xmx 的单位默认字节都是以k、m做单位的。

通常这两个配置参数相等,避免每次空间不足,动态扩容带来的影响

  • -Xmn

新生代大小 (尽量只配置-XX:NewRatio,而不要写死-Xmn的值)

  • -Xss

每个线程池的堆栈大小。在jdk5以上的版本,每个线程堆栈大小为1m,jdk5以前的版本是每个线程池大小为256k。一般在相同物理内存下,如果减少-xss值会产生更大的线程数,但不同的操作系统对进程内线程数是有限制的,是不能无限生成。

  • -XX:NewRatio

设置新生代与老年代比值,-XX:NewRatio=4 表示新生代与老年代所占比例为1:4 ,新生代占比整个堆的五分之一。如果设置了-Xmn的情况下,该参数是不需要在设置的。

  • -XX:PermSize

设置持久代初始值,默认是物理内存的六十四分之一

  • -XX:MaxPermSize

设置持久代最大值,默认是物理内存的四分之一

  • -XX:MaxTenuringThreshold

新生代中对象存活次数,默认15。(若对象在eden区,经历一次MinorGC后还活着,则被移动到Survior区,年龄加1。以后,对象每次经历MinorGC,年龄都加1。达到阀值,则移入老年代)

  • -XX:SurvivorRatio

Eden区与Subrvivor区大小的比值,如果设置为8,两个Subrvivor区与一个Eden区的比值为2:8,一个Survivor区占整个新生代的十分之一

  • -XX:+UseFastAccessorMethods

原始类型快速优化

  • -XX:+AggressiveOpts

编译速度加快

  • -XX:PretenureSizeThreshold

对象超过多大值时直接在老年代中分配

说明:
整个堆大小的计算公式: JVM 堆大小 = 年轻代大小+年老代大小+持久代大小。
增大新生代大小就会减少对应的年老代大小,设置-Xmn值对系统性能影响较大,所以如果设置新生代大小的调整,则需要严格的测试调整。而新生代是用来存放新创建的对象,大小是随着堆大小增大和减少而有相应的变化,默认值是保持堆大小的十五分之一,-Xmn参数就是设置新生代的大小,也可以通过-XX:NewRatio来设置新生代与年老代的比例,java 官方推荐配置为3:8。

新生代的特点就是内存中的对象更新速度快,在短时间内容易产生大量的无用对象,如果在这个参数时就需要考虑垃圾回收器设置参数也需要调整。推荐使用: 复制清除算法和并行收集器进行垃圾回收,而新生代的垃圾回收叫做初级回收。

StackOverflowError和OutOfMemoryException。当线程中的请求的栈的深度大于最大可用深度,就会抛出前者若内存空间不够,无法创建新的线程,则会抛出后者。栈的大小直接决定了函数的调用最大深度,栈越大,函数嵌套可调用次数就越多。

经验 :

  1. Xmn用于设置新生代的大小。过小会增加Minor GC频率,过大会减小老年代的大小。一般设为整个堆空间的1/4或1/3;
  2. XX:SurvivorRatio 用于设置新生代中survivor空间(from/to)和eden空间的大小比例; XX:TargetSurvivorRatio表示,当经历Minor GC后,survivor空间占有量(百分比)超过它的时候,就会压缩进入老年代(当然,如果survivor空间不够,则直接进入老年代)。默认值为50%;
  3. 为了性能考虑,一开始尽量将新生代对象留在新生代,避免新生的大对象直接进入老年代。因为新生对象大部分都是短期的,这就造成了老年代的内存浪费,并且回收代价也高 (Full GC发生在老年代和方法区Perm);
  4. 当Xms=Xmx,可以使得堆相对稳定,避免不停震荡
  5. 一般来说,MaxPermSize设为64MB可以满足绝大多数的应用了。若依然出现方法区溢出,则可以设为128MB。若128MB还不能满足需求,那么就应该考虑程序优化了,减少动态类的产生。

2、垃圾回收

垃圾回收算法 :

  • 引用计数法:会有循环引用的问题,古老的方法;
  • Mark-Sweep:标记清除。根可达判断,最大的问题是空间碎片(清除垃圾之后剩下不连续的内存空间);
  • Copying: 复制算法。对于短命对象来说有用,否则需要复制大量的对象,效率低。如Java的新生代堆空间中就是使用了它(survivor空间的from和to区);
  • Mark-Compact:标记整理。对于老年对象来说有用,无需复制,不会产生内存碎片

GC考虑的指标

  • 吞吐量:应用耗时和实际耗时的比值;
  • 停顿时间:垃圾回收的时候,由于Stop the World,应用程序的所有线程会挂起,造成应用停顿。
吞吐量和停顿时间是互斥的。
对于后端服务(比如后台计算任务),吞吐量优先考虑(并行垃圾回收);
对于前端应用,RT响应时间优先考虑,减少垃圾收集时的停顿时间,适用场景是Web系统(并发垃圾回收)

回收器的JVM参数

  • -XX:+UseSerialGC

串行垃圾回收,现在基本很少使用。

  • -XX:+UseParNewGC

新生代使用并行,老年代使用串行;

  • -XX:+UseConcMarkSweepGC

新生代使用并行,老年代使用CMS(一般都是使用这种方式),CMS是Concurrent Mark Sweep的缩写,并发标记清除,一看就是老年代的算法,所以,它可以作为老年代的垃圾回收器。CMS不是独占式的,它关注停顿时间

  • -XX:ParallelGCThreads

指定并行的垃圾回收线程的数量,最好等于CPU数量

  • -XX:+DisableExplicitGC

禁用System.gc(),因为它会触发Full GC,这是很浪费性能的,JVM会在需要GC的时候自己触发GC。

  • -XX:CMSFullGCsBeforeCompaction

在多少次GC后进行内存压缩,这个是因为并行收集器不对内存空间进行压缩的,所以运行一段时间后会产生很多碎片,使得运行效率降低。

  • -XX:+CMSParallelRemarkEnabled

降低标记停顿

  • -XX:+UseCMSCompactAtFullCollection

在每一次Full GC时对老年代区域碎片整理,因为CMS是不会移动内存的,因此会非常容易出现碎片导致内存不够用的

  • -XX:+UseCmsInitiatingOccupancyOnly

使用手动触发或者自定义触发cms 收集,同时也会禁止hostspot 自行触发CMS GC

  • -XX:CMSInitiatingOccupancyFraction

使用CMS作为垃圾回收,使用70%后开始CMS收集

  • -XX:CMSInitiatingPermOccupancyFraction

设置perm gen使用达到多少%比时触发垃圾回收,默认是92%

  • -XX:+CMSIncrementalMode

设置为增量模式

  • -XX:+CmsClassUnloadingEnabled

CMS是不会默认对永久代进行垃圾回收的,设置此参数则是开启

  • -XX:+PrintGCDetails

开启详细GC日志模式,日志的格式是和所使用的算法有关

  • -XX:+PrintGCDateStamps

将时间和日期也加入到GC日志中

问题1:线上ECS治理

调为可用内存5%报警了。

不是每次报警都调阈值啊,需要有逻辑的。
这个服务比较稳定,调低阈值没有什么风险。

调完观察是否还会持续内存上涨到报警。

  • 如果是,基本上就是持续上涨,可能有泄漏。

  • 如果不是,可能基于它的请求量,会达到稳态,稳态高于当前阈值

问题2:白龙马线上服务机JVM参数配置?

Jdk11 2c/4g

-Xms2048m -Xmx2048m -XX:ThreadStackSize=256 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/home/admin/server/logs/heapdump.%p.hprof 
-XX:MaxMetaspaceSize=256m 
-XX:+UseG1GC 
-Xlog:gc:/home/admin/server/logs/gc.log

观察GC日志,可以看这篇文章:深入理解java虚拟机之垃圾回收算法?CMS垃圾回收的基本流程?对象引用类型? 第5.3节

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

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

相关文章

Qt move和setGeometry的区别

move 和 setGeometry 都是用于管理窗口或小部件的位置的方法,通常在使用 Qt 编程时会用到。它们之间的主要区别在于: move 方法:这个方法用于设置小部件的左上角的坐标位置,它需要两个参数,即横坐标和纵坐标。使用 mov…

idea dubge 详细

目录 一、概述 二、debug操作分析 1、打断点 2、运行debug模式 3、重新执行debug 4、让程序执行到下一次断点后暂停 5、让断点处的代码再加一行代码 6、停止debug程序 7、显示所有断点 8、添加断点运行的条件 9、屏蔽所有断点 10、把光标移到当前程序运行位置 11、单步跳过 12、…

访问 github 问题解决方法

一、macOS版 PS. Windows 版的还没试,不过应该也差不多 1.基本信息 硬件:MacBook Pro 2017 (A1707) 系统:macOS 13.6 (Ventura) 应用:SwitchHosts 4.1.2 (Releases oldj/SwitchHosts GitHub) hosts内容网站:ht…

迅为RK3588开发板Android12单摄方案设备树修改

打开 3588-android12/kernel-5.10/arch/arm64/boot/dts/rockchip/topeet_camera_config.dtsi 设备树,此设备树中对底板上的摄像头接口进行了配置,如下图所示: 如果想要使用 J1 接口打开摄像头 OV5695 或者 摄像头 OV13850,只需要在…

pytorch代码实现之动态蛇形卷积模块DySnakeConv

动态蛇形卷积模块DySnakeConv 血管、道路等拓扑管状结构的精确分割在各个领域都至关重要,确保下游任务的准确性和效率。 然而,许多因素使任务变得复杂,包括薄的局部结构和可变的全局形态。在这项工作中,我们注意到管状结构的特殊…

vue中动态设置source标签

项目中有个视频播放,路径通过接口返回,而且不带后缀,并不确定是什么类型的视频文件,所以要通过source标签去进行设置. 问题:当video中存在source标签的时候,浏览器渲染之后会自动去获取地址,即便地址改变,浏览器也不会再去获取地址。 解决方…

3、Flowable任务分配和流程变量

任务分配和流程变量 1.任务分配 1.1 固定分配 固定分配就是我们前面介绍的,在绘制流程图或者直接在流程文件中通过Assignee来指定的方式 1.2 表达式分配 Flowable使用UEL进行表达式解析。UEL代表Unified Expression Language,是EE6规范的一部分.Flo…

无蓝光的护眼灯有哪些品牌?分享五款优秀的无蓝光护眼台灯

现在儿童近视率越来越高了,用眼过度疲劳是导致近视的主要因素,学习环境的光线是否合适,都会直接影响用眼的疲劳程度。所以给孩子营造一个良好的学习环境非常重要!为大家推荐五大品牌的护眼台灯。 1.书客护眼台灯L1 推荐指数&…

jenkins pipeline使用

1、jenkins全局配置 1.1、maven配置 1.2、jdk配置 1.3、git配置 2、构建环境配置 2.1、安装时间插件 Date Parameter 2.2、Git Parameter 插件安装 3、pipeline如下 pipeline {agent anyenvironment {image_name "192.168.122.150/ken-test/price-service:${date}&…

【大数据】Kafka 入门简介

Kafka 入门简介 1.什么是 Kafka2.Kafka 的基本概念3.Kafka 分布式架构4.配置单机版 Kafka4.1 下载并解压包4.2 启动 Kafka4.3 创建 Topic4.4 向 Topic 中发送消息4.5 从 Topic 中消费消息 5.实验5.1 实验一:Python 实现生产者消费者5.2 实验二:消费组实现…

最新AI创作系统ChatGPT源码+搭建部署教程+支持GPT4.0+支持ai绘画(Midjourney)/支持Prompt

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

FPGA 图像缩放 1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…

使用MinIO Client客户端实现MySQL数据库跨机备份

安装Minio客户端 下载Linux版客户端文件 wget https://dl.min.io/client/mc/release/linux-amd64/mc -P /usr/local/bin/ chmod x /usr/local/bin/mc 添加目标对象 # 给Minio服务【用户名:yourusername,密码:youruserpassword】设置一个…

让iPhone用电脑的网络上网

让iPhone用电脑的网络上网,可以按照以下步骤操作: 在iPhone上找到并点击“设置”选项,进入“蜂窝移动网络”。打开“个人热点”选项。此时下方的弹出对话框会显示“仅USB”。用数据线将你的iPhone与电脑相连,并在电脑上打开“控制…

【Linux】文件IO基础知识——下篇

目录 一,stderr 2. errno全局变量 二,文件系统 1. 软链接 2. 硬链接 三,静态库 1. 制作静态库 2. 自动化生成静态库 & 自动发布库与头文件 3. 如何使用第三方库 法(一):修改系统文件库 …

液压自动化成套设备比例阀放大器

液压电气成套设备的比例阀放大器是一种电子控制设备,用于控制液压动力系统中的液压比例阀1。 比例阀放大器通常采用电子信号进行控制,以控制比例阀的开度和流量,以实现液压系统的可靠控制。比例阀放大器主要由以下组成部分: 驱动…

julia 笔记/论文辅助笔记:T2vec 轨迹处理

deepgtt/harbin/julia/Trip.jl at master boathit/deepgtt (github.com) 1 导入和声明 using HDF5, CSV, DataFrames, Dates, Sockets # 引入几个模块,这些模块用于文件操作、数据处理、日期处理、网络操作等功能。using Distances: euclidean # 从Distances模块…

如何修改模型颜色

1、模型材质颜色介绍 在3D模型中,材质(Material)是指表面质感的特性,包括颜色、光泽、透明度等属性。其中,颜色是最基本的属性之一,它决定了物体表面的外观和感觉。 在现代计算机图形学中,通常…

常用redis-lua脚本

REDIS控制台 1. 进入控制台 E:\soft\Redis-x64-5.0.14.1\redis-cli.exe -h 127.0.0.1 -p 6379 -a password常用redis-lua脚本 在REDIS控制台输入 1. 查询以xxx为前缀的key的数量 local prefix ARGV[1] local keys redis.call(KEYS, prefix .. *) return #keys对应EVAL脚…

网络安全是什么?一文认识网络安全

一、网络安全 1.概念 网络安全从其本质上讲就是网络上的信息安全,指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露,系统可靠正常地运行,网络服务不中断。 (1)基本特征 网络安全根据其本质的界定&#…