JAVA内存调小

1.背景
当前,后台架构方案流行微服务架构。把一个大系统拆成多个服务,服务之间通过rpc或http restful方式相互通信。微服务拆分方式有业务模块或功能。我司采用业务模块。大概公共服务,微服务,api,注册发现配置等。预发布环境模拟商用,搭建所有的微服务。预发布用于测试或压测等。预发布的硬件条件没有商用好或配置低。预发布在大部分情况下,空闲或使用量小。所以配置低,尽量不多花钱。
2.目的
为了减少阿里云资源费用,提高服务器利用率,在一台2核心8G内存的ECS服务器上,同时运行6个微服务应用。
3.环境
jdk8、centos7、spring clound微服务架构、单一部署。
4.当前运行java进程信息

/bin/java -server -Xms1G -Xmx1G -Xss512k -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=128m   
-classpath /opt/app/micro-acs/conf:/opt/app/micro-acs/boot/*:/opt/app/micro-acs/lib/*:   
-Dbasedir=/opt/app/micro-acs -Dfile.encoding=UTF-8 -Djava.awt.headless=true   
-Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000   
-Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300   
-XX:+UseG1GC -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError   
-XX:-OmitStackTraceInFastThrow -XX:HeapDumpPath=/data/logs/   
-XX:ErrorFile=/data/logs/micro-acs/javadump_error_%p.log -Dons.client.logRoot=/data/ons   
-Dons.client.logLevel=INFO -Dons.client.logFileMaxIndex=10 com.zhht.BootstrapApplication  

5.查看内存

命令:jstat -gccapacity 14114  
命令结果:
NGCMN    NGCMX     NGC         S0C  S1C     EC      OGCMN OGCMX     OGC      OC       MCMN  MCMX       MC        CCSMN  CCSMX      CCSC      YGC    FGC   
0.0    1048576.0   660480.0    0.0 10240.0 650240.0  0.0  1048576.0 388096.0 388096.0 0.0   1138688.0  102016.0  0.0    1048576.0  12416.0   3286     0  
列名说明
NGCMN 新生代最小值(KB)  
NGCMX 新生代最大值(KB)  
NGC   当前新生代大小(KB)  
  
S0C  Survivor0(幸存区0)大小(KB)  
S1C  Survivor1(幸存区1)1大小(KB)  
EC   Eden(伊甸区)大小(KB)  
  
OGCMN  老年代最小值(KB)  
OGCMX  老年代最大值(KB)  
OGC    当前老年代大小(KB)  
OC     老年代大小(KB)  
OU     老年代已使用大小(KB)  
  
MCMN   最小元数据容量(KB)  
MCMX   最大元数据容量(KB)  
MC     当前元数据空间大小(KB)  
  
CCSMN  最小压缩类空间大小(KB)  
CCSMX  最大压缩类空间大小(KB)  
CCSC   当前压缩类空间大小(KB)  
  
YGC  新生代GC个数  
FGC  Full GC次数 
当前使用空间: CCSC + MC + OC + EC+ +S1C =  12416 + 102016 + 388096 + 650240 + 10240 = 1135.7500M  
总结:  
CCSC和MC分别代表当前压缩类空间大小、当前元数据空间大小 加在一起125M左右,对应-XX:MaxMetaspaceSize=128m  
这个使用合理,没有多余空间。OC、EC、S1C代表年老代、伊甸、S1区。其中伊甸、S1区加一起等于年轻代。  
年老代、年轻代分别是388M、660M左右。堆空间设置-Xmx1G。  
再看YGC、FGC参数,分别代表年轻代回收和年老代回收次数。我们发现年老代回收次数为0。    
我认为年老代回收频率低,压缩内存的方式提升回收。或者年轻代的回收频率提升。  
调整内存大小后的进程信息
root      9053     1  1 May22 ?        02:54:53 /bin/java -server -Xms400m -Xmx400m -Xss512k -XX:MetaspaceSize=60m -XX:MaxMetaspaceSize=128m -classpath /opt/app/micro-acs/conf:/opt/app/micro-acs/boot/*:/opt/app/micro-acs/lib/*: -Dbasedir=/opt/app/micro-acs -Dfile.encoding=UTF-8 -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+UseG1GC -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -XX:HeapDumpPath=/data/logs/ -XX:ErrorFile=/data/logs/micro-acs/javadump_error_%p.log -Dons.client.logRoot=/data/ons -Dons.client.logLevel=INFO -Dons.client.logFileMaxIndex=10 com.zhht.BootstrapApplication  
root     11671 11645  0 18:23 pts/0    00:00:00 grep --color=auto java  
`总结:内存设置400后,单台服务器上运行了6个应用,没有内存溢出等情况。关键是使用率低。
[root@notice_ips_shedulejob_busiconf01 ~]# jstat -gccapacity 9053  
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC   
 0.0 409600.0 229376.0    0.0 7168.0 222208.0        0.0   409600.0   180224.0   180224.0      0.0 1136640.0  98252.0      0.0 1048576.0  11980.0   2756     0  ``


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值