单台服务器8G内存,2核
系统里装了redis, rocketmq, mysql, zookeeper, 还有20个左右的微服务,每个微服务的jvm 参数 -Xms128m -Xmx256m -Xmn64m -XX:PermSize=64m -XX:MaxPermSize=128m
redis,rocketmq,zookeeper 基本是用最小配置
执行free 只有100m左右的free内存,经常执行一些java命令就返回无法分配内存错误
通过ps -aux|sort -4knr|head -10 查看10个最占用内存的进程, 基本占用内存比是5%左右(300多M)
PS:300m是我们使用的堆内存(128m or 256m)+ 非堆内存(64m)
PS2:如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值, 所以可能是128M,也可能是256M
由于这些微服务使用频率不会太高,特别一些CMS服务的微服务,占用内存低,使用内存低,即使GC STW也影响不大,决定要调整参数,为系统腾出更多内存
通过 jstat -gc pid命令,可以看每个java进程的内存(新生代,老年代,永久代)的使用状况, 发现不少老年代都占用100M以上,调整JVM参数为 -Xms128m -Xmx128m -Xmn64m -XX:PermSize=64m -XX:MaxPermSize=64m