一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。
堆
堆针对一个JVM进程来说是唯一的。也就是一个进程只有一个JVM实例,一个JVM实例中就有一个运行时数据区,一个运行时数据区只有一个堆和一个方法区。但是进程包含多个线程,他们是共享同一堆空间的。
所有的对象实例以及数组都应当在运行时分配在堆上
在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除 也就是触发了GC的时候,才会进行回收,如果堆中对象马上被回收,那么用户线程就会收到影响,因为有stop the word。
堆,是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域。
堆空间细分为:
- JDK7 划为:新生区+养老区+永久区
- JDK8 划为: 新生区+养老区+元空间
- Young Generation Space 新生区,又被划分为Eden区和Survivor区
- Old generation space 养老区
堆里面容易出现OOM,如何设置堆内存大小
Java堆区用于存储Java对象实例,那么堆的大小在JVM启动时就已经设定好了,大家可以通过选项”-Xms”和”-Xmx”来进行设置。
- **-Xms**用于表示堆区的起始内存,等价于**-XX:InitialHeapSize** 初始化
- **-Xmx**则用于表示堆区的最大内存,等价于**-XX:MaxHeapSize** 最大内存
一旦堆区中的内存大小超过“-Xmx”所指定的最大内存时,将会抛出OutofMemoryError异常。
原因:假设两个不一样,初始内存小,最大内存大。在运行期间如果堆内存不够用了,会一直扩容直到最大内存。如果内存够用且多了,也会不断的缩容释放。频繁的扩容和释放造成不必要的压力,避免在GC之后调整堆内存给服务器带来压力。
初始内存大小:物理电脑内存大小/64 64分之一 ,最大内存大小:物理电脑内存大小/4 四分之一。
JPS/jstat -g 进程id
jps:查看java进程
jstat:查看某进程内存使用情况
SOC: S0区总共容量
S1C: S1区总共容量
S0U: S0区使用的量
S1U: S1区使用的量
EC: 伊甸园区总共容量
EU: 伊甸园区使用的量
OC: 老年代总共容量
OU: 老年代使用的量
设置虚拟机参数
-Xms600m -Xmx600m
常用调优工具 0. JDK命令行 0. Eclipse:Memory Analyzer Tool 0. Jconsole 0. Visual VM(实时监控,推荐) 0. Jprofiler(IDEA插件) 0. Java Flight Recorder(实时监控) 0. GCViewer 0. GCEasy
总结:
针对幸存者s0,s1区的总结:复制之后有交换,谁空谁是to
关于垃圾回收:频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间收集