上篇文章代码讲解了tomcat加载以及gc回收流程。
Jvm内存模型剖析优化-JVM(四)
- Jvisualvm
我们可以编写如上代码,之后打开jvm自带的工具jvisualvm。
如果我们看visual不会明显变化,则可以修改睡眠参数,时间改小。
当我们运行程序,通过visual工具可以看到visual GC的运行情况,如我们上篇文章所说,他会从Eden到s0到s1,s0和s1反复拷贝,直到代龄达到15次,则会到old,最后导致OOM。
(如果有的同学没有visual GC则需要去工具->插件自行安装)
当我们老年代里越来越多,放满会怎么办呢,会触发full gc,他回收的整个堆和方法区。
但因为我们代码里对象还在一直引用回收不了,于是发生了OOM。
整个gc的过程中,有STW(stop the world)机制,会暂停用户线程,当用户下单的时候,gc过程可能会触发STW机制,这时候用户体验会受影响,会感受到网络卡顿。
每个年代垃圾收集器是不一样的,后面会一一详解。
元空间是什么,jdk1.8之前叫永久代,之后叫元空间,直接在物理内存。所以方法区是在物理内存里。初始值是21m,最大的会把物理内存全部用完。
二、设置参数大小
堆:-Xms2048M -Xmx2048M 新生代:-Xmn1024M
方法区:-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
设置元空间最大值(默认-1)和初始空间大小(默认21,字节为单位)
建议最大值和初始值元空间设置一样大。
栈:-Xss512k
栈里是给一个线程用的,所以设置小点
可以执行命令
Java -Xms2048M -Xmx2048M -Xmn1024M
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
-Xss512k -jar mic-eureka-server.jar
我们写代码实例-Xss设置的小点,则count打印的更小,因为栈内存变小了,这也意味着可以有更多的线程。