JVM基础和内存区域剖析

    技术2022-07-16  92

    一、JVM的种类

    Sun Classic VM

    Exact VM(EMM 准确式)

    HotSpot VM

    JVM(Kilobyte)

    JRockit

    号称世界上最快的JVM

    JIT即时编译

    JVM处于世界一流水平

    J9

    Azui VM

    Liquid VM

    Dalvik VM

    Microsoft VM

    二、JVM的结构

    类加载子系统

    Java运行时数据区

    执行引擎

    本地方法接口

    三、JVM运行时数据区

    线程共享

    方法区

    线程私有

    虚拟机栈

    本地方法栈

    程序计数器

    程序计数器(线程私有)

    概念

    一块较小的内存空间,当前线程所执行的字节码的行号指示器,包括分支、循环、跳转、异常处理、线程恢复等

    特点

    1.线程轮流切换CPU时间片后重新回到指令处理位置,故是线程私有的

    2.唯一一个在Java虚拟机中不会出现OutOfMemeryError的区域

    注:因为它只是当前线程执行的字节码的行号指示器

    3.若线程执行的是Java方法,计数器记录的是正在执行的VM字节码指令地址,若执行的是Native方法,则计数器为空

    4.与线程一起存在

    虚拟机栈

    先进后出

    虚拟机栈:用户描述Java方法执行的内存模型

    调整参数:-Xss

    栈帧:虚拟机栈中的栈元素(用于支持虚拟机进行方法调用和方法执行的数据结构)包括局部变量表、操作数栈、动态链接、方法出口

    局部变量表:存放方法参数和方法内的局部变量

    操作数栈:虚拟机的工作区(大多数指令都是从这里弹出数据,执行运算,然后把结果压会操作数栈)

    动态连接:符号引用和直接引用在运行时进行解析和链接的过程,叫动态链接

    方法返回:程序正常完成出口和异常完成出口

    方法区(线程共享)[非堆-Non-Heap]

    JDK1.8前后变化,JDK8取消了方法区,增加了元空间

    1.主要存储:

    类信息

    常量

    静态变量

    即时编译器编译信息

    2.数据过多会导致OutOfMemoryError异常

    < JDK 1.8

    -XX:Permsize; -XX:MaxPermSize

    >=JDK1.8

    -XX:MeteSpaceSize; -XX:MaxMateSpaceSize

    和永久代的区别:

    1.存储位置不同,永久代物理上是堆的一部分,和新手代,老年代地址是连续的,而元空间属于本地内存;

    2.存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中;

    3.相当于永久代的数据被分到了堆和元空间中

    直接内存:避免native空间和java堆中来回进行复制

    通过设置-XX:MaxDirectMemorySize限制大小

    堆(线程共享)

    虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆

    GC主要管理区域,可以通过-Xmx和Xms来设置最大和最小值,也可以通过-XX:NewSize -XX:MaxNewSize设置年轻代初始大小

    超出空间大小会抛出OutOfMemoryError异常

    新生区

    新生区分为两个部分:伊甸区(Eden space)和幸存者区(survivor space)

    伊甸区(Eden space)

    大部分对象都会在Eden区诞生,并且一段时间不使用就会被GC回收

    幸存者区(survivor space)

    存在一段时间还在使用的对象会进入survivor区,survivor区包含一个相对的From区和to区,两者来回copy,回收没用的对象,用来延长对象的生命周期。

    老年区(old FullGC)

    经过多次GC仍然存在的对象会移动到老年区中,若老年区也满了,则会产生MajorGC(Full GC),对老年区进行内存清理(STW),若老年区执行了Full GC之后发现还是无法进行对象的报错,那么就会产生OOM异常”OutOfMemoryError“

    虚拟机栈(线程私有)[VM Stack]

    四、内存模型与回收策略

    垃圾回收算法

    1.标记-清除(Mark-Sweep)

    问题:空间不连续,浪费空间

    复制(copying)

    复制算法有2块一样大小的空间,情况对象时将可用的对象移动到to区里,复制算法内存空间连续

    问题:要用2块空间,所以内存的模型from和to非常的小

    标记整理

    只用一块空间,先进行标记无用对象,然后整理内存空间地址,最后清除

    五、垃圾收集器类型

    串行搜集器(serial collector)

    它只有一条GC线程,且就像前面说的,它在运行的时候需要暂停用户程序(stop the world)STW

    并行搜集器(parallel collector)

    它有多条GC线程,且它也需要暂停用户程序(stop the world)STW

    并发搜集器(concurrent collector)

    它有一条或多条GC线程,且它需要在部分阶段暂停用户程序(stop the world),部分阶段与用户程序并发执行

    六、HotSpot中的垃圾收集器

    串行搜集器的实现

    serial(用于新生代,采用复制算法)、serial old(用于年老代,采用标记/整理算法)

    并行收集器的实现

    parNew(用于新生代,采用复制算法)、Parallel

    Scavenge(用于新生代,采用复制算法)、Parallel

    old(用于年老代,采用标记/整理算法)

    并发搜集器的实现

    concurrent mark sweep[CMS] (用于年老代,采用标记/清除算法)

    七、收集器组合策略

    Processed: 0.027, SQL: 9