什么是堆:new出来的的对象都会存放在堆当中
堆内存分为两个区:(垃圾回收机制)
新生代:Eden,s0,s1
老年代:
刚new出来的对象存放在Eden区域中
新生代:刚创建对象,先存放在新生代
老年代:如果对象频繁被使用,对象放入老年代
s0,s1大小相同:为了来及回收机制的复制算法
垃圾回收机制需要经常去老年代进行垃圾回收吗?
垃圾回收机制主要是对新生代进行垃圾回收。
堆内存参数配置:
-XX:+PrintGC 每次触发日志的时候打印相关日志
-XX:+UseSerialGC 串行回收
-XX:+printGCDetails 打印更详细的GC日志
-Xms:堆初始值
-Xmx:堆最大可用值
-Xmn:新生代堆最大可用值
-XX:survivorRatio 用于设置新生代Eden空间和from/to空间比例
配置新生代和老年代的调优参数配置
-XX:survivorRatio = 2 Eden是from区(s0)或者to区(s1)的两倍
-XX:NewRatio = 2 设置老年区的内存大小为新生代去的两倍
总结:在实际应用中,我们可以直接将堆的初始值与堆的最大可用值相等,这样可以减少程序运行时垃圾回收的次数,从而提高效率
初始值越小,垃圾回收的次数就越多
堆溢出的解决方案:
java.lang.OutOfMemoryError:Java heap space 堆内存溢出
解决办法:
设置堆内存大小 :
-Xms1m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError(打印内存溢出错误信息)
在实际开发中,可以在Tomcat的catalina.sh文件中设置JVM的堆内存大小
JAVA_OPTS="-Server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
栈溢出:产生于无限递归调用,循环遍历是不会的,但是循环方法里面产生递归调用,也会发生栈溢出。
解决办法:设置线程最大调用深度
设置 -Xss的大小。例如-Xss5m