最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

nacos应用——占用内存过多问题解决(JVM调优初步)

维修 admin 41浏览 0评论

nacos应用——占用内存过多问题解决(JVM调优初步)

问题描述

最近搞了一台1年的阿里云服务器,安装了一下常用的MySQL,Redis,rabbitmq,minio,然后有安装了一下nacos,结果一启动nacos内存占用就很高,就比较限制我继续安装其他镜像或者启动别的服务。

启动nacos之前:

启动nacos之后

问题分析

nacos启动参数初识

nacos本质就是启动了一个jar包,这里有它运行的一些参数

/usr/local/software/jdk/jdk1.8.0_371/bin/
java 
-Djava.ext.dirs=/usr/local/software/jdk/jdk1.8.0_371/jre/lib/ext:/usr/local/software/jdk/jdk1.8.0_371/lib/ext  
-Xms512m -Xmx512m -Xmn256m 
-Dnacos.standalone=true 
-Dnacos.member.list= 
-Xloggc:/usr/local/software/ali/nacos/8848/nacos/logs/nacos_gc.log -verbose:gc 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-XX:+PrintGCTimeStamps 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=100M 
-Dloader.path=/usr/local/software/ali/nacos/8848/nacos/plugins/health,/usr/local/software/ali/nacos/8848/nacos/plugins/cmdb,/usr/local/software/ali/nacos/8848/nacos/plugins/selector 
-Dnacos.home=/usr/local/software/ali/nacos/8848/nacos 
-jar /usr/local/software/ali/nacos/8848/nacos/target/nacos-server.jar  
--spring.config.additional-location=file:/usr/local/software/ali/nacos/8848/nacos/conf/ 
--logging.config=/usr/local/software/ali/nacos/8848/nacos/conf/nacos-logback.xml 
--server.max-http-header-size=524288

这些参数是啥?

java -X

[root@iZuf61wy7p4tbr7lmwv18iZ ~]# java -X-Xmixed           混合模式执行(默认)-Xint             仅解释模式执行-Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>设置引导类和资源的搜索路径-Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>附加在引导类路径末尾-Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>置于引导类路径之前-Xdiag            显示附加诊断消息-Xnoclassgc        禁用类垃圾收集-Xincgc           启用增量垃圾收集-Xloggc:<file>    将 GC 状态记录在文件中(带时间戳)-Xbatch           禁用后台编译-Xms<size>        设置初始 Java 堆大小-Xmx<size>        设置最大 Java 堆大小-Xss<size>        设置 Java 线程堆栈大小-Xprof            输出 cpu 分析数据-Xfuture          启用最严格的检查,预计会成为将来的默认值-Xrs              减少 Java/VM 对操作系统信号的使用(请参阅文档)-Xcheck:jni       对 JNI 函数执行其他检查-Xshare:off       不尝试使用共享类数据-Xshare:auto      在可能的情况下使用共享类数据(默认)-Xshare:on        要求使用共享类数据,否则将失败。-XshowSettings    显示所有设置并继续-XshowSettings:system(仅限 Linux)显示系统或容器配置并继续-XshowSettings:all显示所有设置并继续-XshowSettings:vm 显示所有与 vm 相关的设置并继续-XshowSettings:properties显示所有属性设置并继续-XshowSettings:locale显示所有与区域设置相关的设置并继续-X 选项是非标准选项。如有更改,恕不另行通知。

进一步解析

-XX参数主要有3种:行为参数,调优参数,调试参数行为参数(功能开关)
-XX:-DisableExplicitGC 禁止调用System.gc();但jvm的gc仍然有效
-XX:+MaxFDLimit 最大化文件描述符的数量限制
-XX:+ScavengeBeforeFullGC  新生代GC优先于Full GC执行
-XX:+UseGCOverheadLimit 在抛出OOM之前限制jvm耗费在GC上的时间比例
-XX:-UseConcMarkSweepGC 对老年代采用并发标记交换算法进行GC
-XX:-UseParallelGC 启用并行GC
-XX:-UseParallelOldGC  对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
-XX:-UseSerialGC  启用串行GC
-XX:+UseThreadPriorities  启用本地线程优先级性能调优
-XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
-XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
-XX:MaxNewSize=size 新生成对象能占用内存的最大值
-XX:MaxPermSize=64m 老年代对象能占用内存的最大值
-XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
-XX:NewRatio=2 新生代内存容量与老生代内存容量的比例
-XX:NewSize=size 新生代对象生成时占用内存的默认值
-XX:ReservedCodeCacheSize=32m  保留代码占用的内存容量
-XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
-XX:+UseLargePages 使用大页面内存调试参数
-XX:-CITime 打印消耗在JIT编译的时间
-XX:ErrorFile=./hs_err_pid<pid>.log 保存错误日志或者数据到文件中
-XX:-ExtendedDTraceProbes  开启solaris特有的dtrace探针
-XX:HeapDumpPath=./java_pid<pid>.hprof 指定导出堆信息时的路径或文件名
-XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
-XX:OnError="<cmd args>;<cmd args>" 出现致命ERROR之后运行自定义命令
-XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 当首次遭遇OOM时执行自定义命令
-XX:-PrintClassHistogram  遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
-XX:-PrintConcurrentLocks  遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
-XX:-PrintCommandLineFlags 打印在命令行中出现过的标记
-XX:-PrintCompilation  当一个方法被编译时打印相关信息
-XX:-PrintGC  每次GC时打印相关信息
-XX:-PrintGCDetails  每次GC时打印详细信息
-XX:-PrintGCTimeStamps 打印每次GC的时间戳
-XX:-TraceClassLoading 跟踪类的加载信息
-XX:-TraceClassLoadingPreorder 跟踪被引用到的所有类的加载信息
-XX:-TraceClassResolution  跟踪常量池
-XX:-TraceClassUnloading  跟踪类的卸载信息
-XX:-TraceLoaderConstraints 跟踪类加载器约束的相关信息

回过头分析nacos

# 设置了Java的初始堆大小和最大堆大小,以及新生代大小
-Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -- 单体模式启动
-Dnacos.member.list= 
-Xloggc:/usr/local/software/ali/nacos/8848/nacos/logs/nacos_gc.log -verbose:gc# 和gc相关的参数
-XX:+PrintGCDetails      -- 每次GC时打印详细信息
-XX:+PrintGCDateStamps   -- 应该是打印一下日期
-XX:+PrintGCTimeStamps   -- 打印每次GC的时间戳
-XX:+UseGCLogFileRotation -- GC的日志
-XX:NumberOfGCLogFiles=10 -- 日志文件数量
-XX:GCLogFileSize=100M    -- 日志文件大小

问题解决

尝试设置参数

下面是原来的参数,可以看到似乎初始堆大小和最大堆大小,以及新生代大小遵循 2:2:1的比例,所以尝试把他们都除以2

参数修改如下所示

启动查看

现在启动试试,可以看到内存占用87%,确实少了,还能再运行其他的jar包

前端控制台也能正常启动,后续还需要进一步验证参数是否设置的合适

nacos应用——占用内存过多问题解决(JVM调优初步)

问题描述

最近搞了一台1年的阿里云服务器,安装了一下常用的MySQL,Redis,rabbitmq,minio,然后有安装了一下nacos,结果一启动nacos内存占用就很高,就比较限制我继续安装其他镜像或者启动别的服务。

启动nacos之前:

启动nacos之后

问题分析

nacos启动参数初识

nacos本质就是启动了一个jar包,这里有它运行的一些参数

/usr/local/software/jdk/jdk1.8.0_371/bin/
java 
-Djava.ext.dirs=/usr/local/software/jdk/jdk1.8.0_371/jre/lib/ext:/usr/local/software/jdk/jdk1.8.0_371/lib/ext  
-Xms512m -Xmx512m -Xmn256m 
-Dnacos.standalone=true 
-Dnacos.member.list= 
-Xloggc:/usr/local/software/ali/nacos/8848/nacos/logs/nacos_gc.log -verbose:gc 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-XX:+PrintGCTimeStamps 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=100M 
-Dloader.path=/usr/local/software/ali/nacos/8848/nacos/plugins/health,/usr/local/software/ali/nacos/8848/nacos/plugins/cmdb,/usr/local/software/ali/nacos/8848/nacos/plugins/selector 
-Dnacos.home=/usr/local/software/ali/nacos/8848/nacos 
-jar /usr/local/software/ali/nacos/8848/nacos/target/nacos-server.jar  
--spring.config.additional-location=file:/usr/local/software/ali/nacos/8848/nacos/conf/ 
--logging.config=/usr/local/software/ali/nacos/8848/nacos/conf/nacos-logback.xml 
--server.max-http-header-size=524288

这些参数是啥?

java -X

[root@iZuf61wy7p4tbr7lmwv18iZ ~]# java -X-Xmixed           混合模式执行(默认)-Xint             仅解释模式执行-Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>设置引导类和资源的搜索路径-Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>附加在引导类路径末尾-Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>置于引导类路径之前-Xdiag            显示附加诊断消息-Xnoclassgc        禁用类垃圾收集-Xincgc           启用增量垃圾收集-Xloggc:<file>    将 GC 状态记录在文件中(带时间戳)-Xbatch           禁用后台编译-Xms<size>        设置初始 Java 堆大小-Xmx<size>        设置最大 Java 堆大小-Xss<size>        设置 Java 线程堆栈大小-Xprof            输出 cpu 分析数据-Xfuture          启用最严格的检查,预计会成为将来的默认值-Xrs              减少 Java/VM 对操作系统信号的使用(请参阅文档)-Xcheck:jni       对 JNI 函数执行其他检查-Xshare:off       不尝试使用共享类数据-Xshare:auto      在可能的情况下使用共享类数据(默认)-Xshare:on        要求使用共享类数据,否则将失败。-XshowSettings    显示所有设置并继续-XshowSettings:system(仅限 Linux)显示系统或容器配置并继续-XshowSettings:all显示所有设置并继续-XshowSettings:vm 显示所有与 vm 相关的设置并继续-XshowSettings:properties显示所有属性设置并继续-XshowSettings:locale显示所有与区域设置相关的设置并继续-X 选项是非标准选项。如有更改,恕不另行通知。

进一步解析

-XX参数主要有3种:行为参数,调优参数,调试参数行为参数(功能开关)
-XX:-DisableExplicitGC 禁止调用System.gc();但jvm的gc仍然有效
-XX:+MaxFDLimit 最大化文件描述符的数量限制
-XX:+ScavengeBeforeFullGC  新生代GC优先于Full GC执行
-XX:+UseGCOverheadLimit 在抛出OOM之前限制jvm耗费在GC上的时间比例
-XX:-UseConcMarkSweepGC 对老年代采用并发标记交换算法进行GC
-XX:-UseParallelGC 启用并行GC
-XX:-UseParallelOldGC  对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
-XX:-UseSerialGC  启用串行GC
-XX:+UseThreadPriorities  启用本地线程优先级性能调优
-XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
-XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
-XX:MaxNewSize=size 新生成对象能占用内存的最大值
-XX:MaxPermSize=64m 老年代对象能占用内存的最大值
-XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
-XX:NewRatio=2 新生代内存容量与老生代内存容量的比例
-XX:NewSize=size 新生代对象生成时占用内存的默认值
-XX:ReservedCodeCacheSize=32m  保留代码占用的内存容量
-XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
-XX:+UseLargePages 使用大页面内存调试参数
-XX:-CITime 打印消耗在JIT编译的时间
-XX:ErrorFile=./hs_err_pid<pid>.log 保存错误日志或者数据到文件中
-XX:-ExtendedDTraceProbes  开启solaris特有的dtrace探针
-XX:HeapDumpPath=./java_pid<pid>.hprof 指定导出堆信息时的路径或文件名
-XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
-XX:OnError="<cmd args>;<cmd args>" 出现致命ERROR之后运行自定义命令
-XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 当首次遭遇OOM时执行自定义命令
-XX:-PrintClassHistogram  遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
-XX:-PrintConcurrentLocks  遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
-XX:-PrintCommandLineFlags 打印在命令行中出现过的标记
-XX:-PrintCompilation  当一个方法被编译时打印相关信息
-XX:-PrintGC  每次GC时打印相关信息
-XX:-PrintGCDetails  每次GC时打印详细信息
-XX:-PrintGCTimeStamps 打印每次GC的时间戳
-XX:-TraceClassLoading 跟踪类的加载信息
-XX:-TraceClassLoadingPreorder 跟踪被引用到的所有类的加载信息
-XX:-TraceClassResolution  跟踪常量池
-XX:-TraceClassUnloading  跟踪类的卸载信息
-XX:-TraceLoaderConstraints 跟踪类加载器约束的相关信息

回过头分析nacos

# 设置了Java的初始堆大小和最大堆大小,以及新生代大小
-Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -- 单体模式启动
-Dnacos.member.list= 
-Xloggc:/usr/local/software/ali/nacos/8848/nacos/logs/nacos_gc.log -verbose:gc# 和gc相关的参数
-XX:+PrintGCDetails      -- 每次GC时打印详细信息
-XX:+PrintGCDateStamps   -- 应该是打印一下日期
-XX:+PrintGCTimeStamps   -- 打印每次GC的时间戳
-XX:+UseGCLogFileRotation -- GC的日志
-XX:NumberOfGCLogFiles=10 -- 日志文件数量
-XX:GCLogFileSize=100M    -- 日志文件大小

问题解决

尝试设置参数

下面是原来的参数,可以看到似乎初始堆大小和最大堆大小,以及新生代大小遵循 2:2:1的比例,所以尝试把他们都除以2

参数修改如下所示

启动查看

现在启动试试,可以看到内存占用87%,确实少了,还能再运行其他的jar包

前端控制台也能正常启动,后续还需要进一步验证参数是否设置的合适

发布评论

评论列表 (0)

  1. 暂无评论