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 的配置和优化

JVM08_堆

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

一篇文章帮你搞定JVM中的堆

JVM运行时数据区篇(方法区基本概述)

JVM之堆空间