java 服务jvm参数据配置

2023-09-22 10:35:19

JVM参数设置说明

  • -Xms4g

初始堆大小 默认物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。初始和最大最好设置成一样,避免堆内存在应用运行过程中自动扩容而影响服务稳定性

  • -Xmx4g

最大堆大小 默认物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。初始和最大最好设置成一样,避免堆内存在应用运行过程中自动扩容而影响服务稳定性

  • -Xmn

年轻代大小(1.4or lator) 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小. 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。尽量设置小一点

  • -Xss128k

每个线程的堆栈大小 JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。

  • -XX:SurvivorRatio=8

Eden区与Survivor区的大小比值 Eden区与Survivor区的大小比值 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

  • -XX:+UseG1GC

选择使用G1垃圾收集器,G1日志解析参考:G1日志解析

  • -XX:MetaspaceSize=256M

元数据空间的扩容临界值,元数据空间的内存commited指超过256M,将会发生mixed GC和扩容

  • -XX:MaxMetaspaceSize=1G

元数据空间最大值1G,推荐此值不配置

-XX:MaxDirectMemorySize=1G

这个参数直接干预sun.nio.MaxDirectMemorySize这个属性,会限制nio可用的最大直接内存为1G,最好配置直接内存(也叫对外内存),因为堆外内存一旦泄漏可能会打满整个系统内存,并且很难排查

-XX:InitialBootClassLoaderMetaspaceSize=256M

给每个classloader分配的元数据空间初始值是256M

-XX:+PrintGCDetails

打印GC日志

-XX:+PrintGCDateStamps

打印GC日志附带时间戳

-XX:+PrintHeapAtGC

GC之前和GC之后的堆的内存使用情况要打印出来

-Xloggc:/data/logs/java/gc.log

GC日志的存储路径(前缀)

-XX:+UseGCLogFileRotation

GC日志文件开启滚动存储
-XX:NumberOfGCLogFiles=5
GC日志文件最多保留5个

-XX:GCLogFileSize=30M

每个GC日志文件最大30M,超过30M,生成新的文件

-XX:+HeapDumpOnOutOfMemoryError

当发生内存溢出时dump堆转储文件

-XX:HeapDumpPath=/data/logs/java/heap_dump_%p.hprof

堆转储文件的存放地址

JVM方法区(元空间)大小设置

-XX:MetaspaceSize

设置元空间初始大小
-XX:MaxMetaspaceSize

最大可分配大小
解释

JDK8及以后:可以使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置元空间初始大小以及最大可分配大小。
例子:设置初始大小是100M,最大可分配空间也是100M。-XX:MetaspaceSize=100m -XX:MaxMetaspaceSize=100m。
1.如果不指定元空间的大小,默认情况下,元空间最大的大小是系统内存的大小,元空间一直扩大,虚拟机可能会消耗完所有的可用系统内存。
2.如果元空间内存不够用,就会报OOM。
3.默认情况下,对应一个64位的服务端JVM来说,其默认的-XX:MetaspaceSize值为21MB,这就是初始的高水位线,一旦元空间的大小触及这个高水位线,就会触发Full GC并会卸载没有用的类,然后高水位线的值将会被重置。
4.从第3点可以知道,如果初始化的高水位线设置过低,会频繁的触发Full GC,高水位线会被多次调整。所以为了避免频繁GC以及调整高水位线,建议将-XX:MetaspaceSize设置为较高的值,而-XX:MaxMetaspaceSize不进行设置

Heap Dump文件生成

heap dump进行分析工具

事先需要准备软下软件包:

  • JDK 11+(目前MAT最新版本1.13.0要求使用)
  • Memory Analyzer Tool (MAT)

MAT官方下载页面:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

软件包准备就绪后,解压JDK和MAT到任意目录,无需其他安装操作。

使用命令可以立刻获取某个Java进程的heap dump。

使用jmap命令:

jmap -dump:live,format=b,file=/path/to/heapdump.hprof [pid]

使用jcmd命令:

jcmd [pid] GC.heap_dump /path/to/heapdump.hprof

其中为需要分析的Java进程的pid。/path/to/heapdump.hprof为生成的heap dump文件所在的路径。

在特定时间点生成

考虑到如下场景:我们需要获取Java程序出现异常的时候(例如OOM)的heap dump。这种场景下我们无法使用上面讲解的命令,Java进程出现问题的时候可能已经被系统kill掉。因此我们需要配置JVM,让他能够在特定时间点自动生成heap dump。

下面列出生成heap dump的时间点和对应的JVM参数。

在OOM的时候生成heap dump:

-XX:+HeapDumpOnOutOfMemoryError

在full GC前生成heap dump:

-XX:+HeapDumpBeforeFullGC

在full GC后生成heap dump:

-XX:+HeapDumpAfterFullGC

在按下ctrl+break的时候生成heap dump:

-XX:+HeapDumpOnCtrlBreak

注意: 指定heap dump文件生成的路径需要配置-XX:HeapDumpPath=/path/to/heapdump.hprof。

Heap Dump分析

对于不是很大的heap dump文件(不大于MAT分析机器内存的1.2倍),我们可以将heap dump文件压缩后下载到本地,使用MAT图形界面方式分析。操作方法比较直观(File -> Open Heap Dump…),这里不再赘述。

生产环境中可能遇到特别大的heap dump。比如我们要分析一个30G的heap dump。将其在服务器上压缩之后,空间占用仍有大约10G,下载到本地耗时很长。本地开发机器一般也很少见32G内存机器,分析的时候会出现内存溢出问题。这种情况下我们需要使用MAT提供的命令行功能,在服务器上进行分析并输出分析报告。这些分析报告是静态的web页面,只有几百KB大小。需要在本地做的仅仅是将这些报告下载下来用浏览器打开,这样完美避免了本地开发环境配置不足的问题。

在服务器上使用MAT命令行分析的方法很简单。在MAT安装目录中执行:

./ParseHeapDump.sh xxx.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

其中xxx.hprof在实际使用的时候需要替换为hprof文件的路径。运行完毕后在hprof文件所在目录会生成一系列的index/threads文件和3个压缩文件。这3个压缩文件是我们重点关注的分析报告,分别为:

  • xxx_Leak_Suspects.zip:报告包含怀疑造成内存泄漏的地方,报告中包含了class层级图。对于OOM的场景能够很容易的定位到是哪个对象占用了大量内存不释放。
  • xxx_System_Overview.zip:包含heap dump基本信息,dump进程JVM的相关配置和线程信息等。
  • xxx_Top_Components.zip:查看占用空间最大的几个object/class/classloader/package等。报告以饼图和表格的形式展示。通过这个报告可以定位出Java程序运行时哪些对象占用内存较多,对问题排查和程序优化很有帮助。

这三个报告是分析问题的关键。我们通过报告找出内存占用过大的对象,然后结合日志和项目源代码分析程序逻辑,逐步定位出问题。

jvm配置实例

  1. demo1
export JAVA_OPTS="-Xmx2048m -Xms2048m -Xss128k -XX:SurvivorRatio=8 -XX:MetaspaceSize=256m \
-XX:MaxDirectMemorySize=1G \
-XX:+UseG1GC -XX:MaxGCPauseMillis=300 \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/data/heapdump.hprof \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC \
-Xloggc:/export/Data/gc-%t.log -XX:+UseGCLogFileRotation -XX:GCLogFileSize=100M -XX:NumberOfGCLogFiles=20"

echo "环境变量:"
echo "JAVA_OPTS:$JAVA_OPTS"
echo "JAVA_OPTS_EXT:$JAVA_OPTS_EXT"

echo "应用启动命令:"
echo "java   $JAVA_OPTS $JAVA_OPTS_EXT -jar $MAIN_JAR >/dev/null 2>&1"

java ${PFINDER_AGENT:-}  $JAVA_OPTS $JAVA_OPTS_EXT -jar $MAIN_JAR >/dev/null 2>&1
更多推荐

设计模式之职责链模式

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这些系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。ConcreteHandler

将自己的代码发布成可以pip安装的包

要将自己的Python代码打包并通过pip进行安装,可以按照以下步骤进行操作:创建一个新的文件夹,并将您的Python代码放入其中。确保您的代码结构是标准的Python包结构,即包含__init__.py文件和其他可能的模块文件。结构示例:your_package_name/__init__.pymodule1.pym

2023世界元宇宙大会进行时,智汇云舟携视频孪生技术与产品亮相

9月20日-22日,由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办的“2023第二届世界元宇宙大会”在上海隆重举行。智汇云舟作为探索元宇宙前沿科技的优秀企业代表受邀参会,并携视频孪生技术与产品在特装展区惊艳亮相。图:大会现场智汇云舟展位本届大会以“虚实相生、产业赋能”为主题,邀请到110多位国内外专家、院士和

如何利用播放器节省20%点播成本

点播成本节省的点其实涉及诸多部分,例如:CDN、转码、存储等,而利用播放器降本却是很多客户比较陌生的部分。火山引擎基于内部支撑抖音集团相关业务的实践,播放器恰恰是成本优化中最重要和最为依赖的部分。火山引擎的视频团队做了份数据统计,在一个很经典的视频业务中,我们在2022年至2023年大约1年半的时间里,针对这个业务进行

el-calendar日历 简易排班

公司物流部要个简易的排班功能,由主管去设置线路,线路绑定上负责人。然后直接往日历里添加。1、隐藏了自带的切换月份,改用了日期选择器。2、禁用了非本月的点击事件,防止点击自动跳转到其他月份。3、添加了点击多选,批量处理,也有单日排班处理。4、拖拽删除排班,代码如下exportfunctiongetFirstDay(mon

一定要知道的 NOI 大纲(2023年修订版)变化

近日,中国计算机学会(CCF)正式发布了《NOI大纲(2023年修订版)》,明确地给出了竞赛的知识范围。CCF于2021年制定完成并首次发布了NOI大纲,大纲发布后,对竞赛组织、教师教学和选手学习发挥了很好的引导作用。根据NOI大纲制定之初的安排,大纲每两年修订一次。CCF最新发布的NOI大纲(2023年修订版),是N

信创办公–基于WPS的EXCEL最佳实践系列 (限制可录入内容)

信创办公–基于WPS的EXCEL最佳实践系列(限制可录入内容)目录应用背景操作过程1、数据有效性(支出证明单)2、如何完成数据有效性的使用(差旅报销申请表)3、清除数据验证4、利用圈释无效数据,验证已输入数据的有效性。5、灵活性调整数据有效性。应用背景本章内容主要讲解:如何在WPS上利用excel去获取数据,如何通过手

dockerfile用ENTRYPOINT好还是用CMD好

在Dockerfile中使用`ENTRYPOINT`和`CMD`都有其用途和优劣势,具体取决于你的应用和需求。这两个指令的主要区别在于如何处理容器启动时的命令参数。1.`CMD`指令:-`CMD`用于定义容器启动时的默认命令,但它可以在运行容器时被替代。如果在运行容器时提供了命令参数,那么这些参数会覆盖`CMD`中定义

说下 RESTful API 使用的几个方法

在最近的面试中,有问到说是说一下RESTfulAPI的几个方法。这次面试问的问题还是比较多的,但是很多问题都是开放性问题,说心里话很长时间没有遇到这样比较好的沟通式面试了。不少公司,以上来就做题目,这个让人很反感。不过现在做题目的过程中,很多公司也都强调,我们不需要有完整的方案,不能运行也没有关系,主要是看思路吧。小结

C++之mutex、operator()、lambda应用总结(二百三十一)

简介:CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注:Android系统攻城狮1.前言本篇目的:理解C+

总结分析 | 基于phpmyadmin的渗透测试

一、什么是phpmyadmin?phpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于p

热文推荐