JVM:堆概述
Posted liu++
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM:堆概述相关的知识,希望对你有一定的参考价值。
JVM(六):堆概述
堆是线程共享的——》堆相对进程是唯一的。
一个进程对应一个JVM实例,一个JVM实例只有一个运行时数据区,一个运行时数据区只有一个堆。
堆空间虽然是线程共享的但里面的缓冲区是线程私有的,因为线程共享如果用同步来解决多线程问题效率很差,所以用一个区域每个线程私有,TLAB。
几乎所有的对象实例都在堆上。
堆的内存结构
堆在逻辑上按“代”来划分
java7之前逻辑上分为:新生区、养老区、永久区
java8逻辑上分为:新生区、养老区、元空间
新生区=新生代=年轻代 养老区=老年区=老年代 永久区=永久代
永久代(元空间)是方法区,但是它是非堆,所以堆只有新生代、老年代
Xmx设置的大小是新生代+老年代
堆空间大小设置
-Xms:堆起始内存大小,等价于-XX:InitialHeapSize
-Xmx:堆最大内存,等价于-XX:MaxHeapSize
堆区内存大小超出-Xmx指定的最大内存将抛出OutOfMemoryError
默认的堆初始内存大小:电脑物理内存大小的1/64
最大内存大小:电脑物理内存大小的1/4
开发中建议设置初始堆内存==最大堆内存
因为初始堆内存!=最大堆内存可能会让堆自动扩容自动销毁,如果频繁的自动扩容自动销毁会影响性能,设置成一样的就不会扩容减容了。
如何查看具体堆内存分配:方式一:命令行jsp 查进程id jstat -gc 进程id
方式二:-XX:+PrintGCDetails
OOM——》OutOfMemoryError
内存溢出,之前栈里面也有内存溢出,最简单的例子while(true)
说一个工具,可以监控jvm非常好:jvisualvm.exe
就在java的bin目录下,非常好用,也是看视频老师用的。
年轻代老年代——》堆空间的结构
年轻代就是生命周期比较短的,创建之后很快就回收了
老年代就是生命周期长,甚至和JVM生命周期一样长,并不会去回收就放到老年代,以后就不去判断它要不要回收了,直接就不回收了。比如数据库连接,各种连接等。
年轻代又分为Eden、Survivor0、Survivor1
对象最先创建的位置在eden,经过一段时间,不再使用的对象就回收掉,还在使用的对象就放到survivor0或1,survivor就是幸存者区,如果过了一段时间对象还在用就放到老年代了。
控制新生代和老年代的比例
-XX:NewRation,默认为2——》新生代1老年代2,新生代在整个堆占比1/3
Eden和Survivor0、Survivor1的默认比例是8:1:1但是有自动适应所以查看可能不是8:1:1,还是要自己设置一下。
可以通过-XX:SurvivorRatio设置,-XX:SurvivorRatio=8代表8:1:1
几乎所有对象都是在Eden区new出来的,绝大多数(80%)对象销毁发生在新生代。
-Xmn可以设置新生代的大小,一般不设置。
对象分配的一般过程
- 对象首先在Eden区,Eden区满了的话触发垃圾回收(YGC/MinorGC)!
- YGC之后幸存的对象进入Survivor区,S0区空就先放S0区,每个对象上有age年龄计数器,记录熬过来几轮垃圾回收。
- Eden中的对象在S0和S1中,优先放到空的S区,然后S0中上一步留下的对象还活着就转移到S1,age+1。
- S0和S1有from或to区的头衔,哪个空哪个就是to区否则from区,eden中的对象会转移至to区。
- S区中的对象GC也是YGC,当S区的对象age=15就会晋升(Promotion)至老年代,到了老年代就不管age了,15是阈值,默认15可以修改,用 -XX:MaxTenuningThreshold修改。
- 如果S区满了不会触发GC,会根据规则直接晋升到老年区,YGC管Eden和Survivor。
- 有可能对象在老年区new。
这里推荐去看视频,有配图非常好理解
总结:
- 针对S0、S1:复制之后有交换,谁空谁说to
- 关于垃圾回收:频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间收集。
学习途径
视频:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)
本篇内容完全来自宋老师视频,感谢。
以上是关于JVM:堆概述的主要内容,如果未能解决你的问题,请参考以下文章
大数据技术之_30_JVM学习_01_JVM 位置+JVM 体系结构概览+堆体系结构概述+堆参数调优入门+JVM 的配置和优化+Tomcat 的配置和优化
14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段