1:堆内存中分为新生代和老年代,堆内存大小由-xms和-xmx控制
2:新生代分为Eden区和survivor区,survivor区又分为from区和to区,Eden区和survivor区的比列由-xx:survivorRatio控制
3:新生代中mintor GC和老年代中Full GC工作原理。
常见的OOM异常
1:java.lang.OutOfMemoryError: Java heap space
-Xms -Xmx设置JVM Heap大小
2: java.lang.OutOfMemoryError: PermGen space
通过-XX:PermSize和-XX:MaxPermSize设置永久代大小
3: java.lang.StackOverflowError : Thread Stack space
这种通常是单线程需要的内存太大造成 如程序中递归层次过多,很容易造成栈溢出。通过 -Xss: 来设置每个线程的Stack大小。
4:java.lang.OutOfMemoryError: GC overhead limit
这种异常发生的原因是,当前已经没有可用内存,经过多次GC之后仍然没能有效释放内存。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump参数来生产快照,对快照进行分析找到占用内存大的地方进行优化。
介绍JVM很好的博客:
https://blog.youkuaiyun.com/qq_22152261/article/details/79491536
https://www.cnblogs.com/alsf/p/9017447.html
https://blog.youkuaiyun.com/yangyong0717/article/details/78788362
https://blog.youkuaiyun.com/qq_34707744/article/details/79288787
https://www.cnblogs.com/keita/p/8583121.html
https://www.cnblogs.com/manayi/p/9651500.html
JVM性能调优参数配置 https://www.liangzl.com/get-article-detail-17354.html
堆内存大小由 -xms和-xmx设置,新生代分为Eden区和Survivor区(Survivor from 和 Survivor to),Eden和Survivor的比例由 -xx:SurvivorRatio设置
Eden区满了以后会进行一次mintor GC 把存活的对象放入form区 多次mintor GC以后from区满了 。会Eden+form一起进行一次mintor GC把存活的对象放入to区,再把Eden+from清空,然后把form和to内存交换 from剩下一些老对象(多次GC仍然存活) ,若干次GC后幸存的form区满了或者对象达到15岁(对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁),则全部复制到老年代,这样很多次以后老年代满了会进行一次Full GC。
(1)方法区是规范层面的东西,规定了这一个区域要存放哪些东西
(2)永久带或者是metaspace是对方法区的不同实现,是实现层面的东西。