4g内存确实太寒碜了……尤其是你还要跑5、6个应用……
可以在docker脚本里指定一下启动的jvm参数
4g内存先要分给操作系统,还有docker本身,剩下的按照你的情况,一个应用能分到512m内存就谢天谢地了,所以可以在docker启动脚本里,给每个应用指定jvm参数:(java8环境)
jdk路径/bin/java -jar -Xmx384m -XX:MaxMetaspaceSize=128m -XX:CompressedClassSpaceSize=24m xxx.jar
这是我个人实践下来最合适的分配,每个人的项目不同,参数当然也不一样,仅供参考。
上面的是鱼,下面开始说渔
关键词:jvm参数调优,jvm内存模型,jstat
那些参数都是啥意思?
-Xmx指定堆内存最大值,这个是最常用的参数,实在懒得理解,光设置这个也凑合了。
-XX:MaxMetaspaceSize指定非堆内存的元空间最大值,这个参数是java8之后才有的,不过现在应该没几个人用更早的版本了吧……对于学习、测试用的小应用,非堆内存基本都占用很小,但是如果不指定,最大值默认1024m,就算Xmx限制了也还会吃很多内存……
-XX:CompressedClassSpaceSize这个是Metaspace的一部分,程序的代码被存储在这里,启动后几乎不会增长,可以根据自己的情况指定一个比较小的值,给Metaspace其他部分留够空间。
其实还有很多jvm参数,请根据需要自行搜索深入学习。
如何知道自己java应用的内存占用来决定最佳分配?
jdk路径/bin/jstat -gccapacity pid
根据pid查看某个应用的当前内存和最大内存。可以知道内存占用量的情况,也可以看出来前面的jvm参数配置有没有生效。
jstat还有很多参数,查出来的数值具体是什么意思也请自行搜索深入学习。
如果是在windows上运行,还可以用jdk路径/bin/jconsole.exe查看可视化的内存使用情况。