java之JVM 内存结构

这里写图片描述

jvm内存结构:堆、方法区、Java栈(虚拟机栈)、本地栈、PC寄存器

  • 堆: 
    线程共享。存放对象实例(new、数组)。堆耗尽的时候,JVM会抛出java.lang.OutOfMemoryError 异常。堆的大小可以通过JVM选项-Xms和-Xmx来进行调整。分为:新生代、老年代、持久代. 注意: 持久代-JDK1.8将换成元空间

    • 新生代: Eden区、from Survivor区、to Survivor区

      Eden区 :存放新对象或者生命周期很短的对象,通过-XX:NewSize和-XX:MaxNewSize参数来调整。 新生代GC(垃圾回 收器)会清理这一区域。 
      Survivor区:历经了Eden区的垃圾回收仍能存活下来的依旧存在引用的对象会待在这个区域。可以由JVM参数-XX:SurvivorRatio来进行调节。(容易发生minor GC:新生代一般的gc策略为mark-copy)

    • 老年代: 
      历经了Eden区和Survivor区的多次GC后仍然存活下来的对象会存储在这个区里。这个 区会由一个特殊的垃圾回 收器来负责。(容易发生majorGC:老年代一般gc策略为mark-compact)

“` 备注:其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,默认为操作系统物理内存的1/64但小于1G,-Xmx为JVM可申请的最大内存,默认为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大 Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列;当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过XX:MaxHeapFreeRation=来指定这个比列,对于运行系统,为避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样。


  • 方法区 线程共享。分为 持久代、代码缓存注意: 持久代-JDK1.8将换成元空间

持久代:存储包括类定义,结构,字段,方法(数据及代码)以及常量在内的类相关数据。它可以通过-XX:PermSize及 - XX:MaxPermSize来进行调节。如果它 的空间用完了,会导致java.lang.OutOfMemoryError: PermGen space的异 常。 
代码缓存:这个缓存区域是用来存储编译后的代码。编译后的代码就是本地代码(硬件相关的),它是由JIT(Just In Time)编 译器生成的,这个编译器是Oracle HotSpot JVM所特有的。

JVM栈: 线程私有

**:异常可能性:对于栈有两种异常情况:如果线程请求的栈深度大于栈所允许的深度,将抛出StackOverflowError异常,如果虚 拟机栈可以动态拓展,在拓展的时无法申请到足够的内存,将会抛出OutOfMemoryError异常存储局部变量以及方法调用的中间结果及返回值。可以通过JVM选项-Xss来进行调整

本地栈  线程私有。 

**:java程序调用native方法

* PC寄存器*  线程私有。 
**: 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来取下一条需要执行的字节码指令,分支、跳转、循环、异常处理、线程恢复等基础功能都需要这个计数器来完成

这里写图片描述

jvm内存结构:堆、方法区、Java栈(虚拟机栈)、本地栈、PC寄存器

  • 堆: 
    线程共享。存放对象实例(new、数组)。堆耗尽的时候,JVM会抛出java.lang.OutOfMemoryError 异常。堆的大小可以通过JVM选项-Xms和-Xmx来进行调整。分为:新生代、老年代、持久代. 注意: 持久代-JDK1.8将换成元空间

    • 新生代: Eden区、from Survivor区、to Survivor区

      Eden区 :存放新对象或者生命周期很短的对象,通过-XX:NewSize和-XX:MaxNewSize参数来调整。 新生代GC(垃圾回 收器)会清理这一区域。 
      Survivor区:历经了Eden区的垃圾回收仍能存活下来的依旧存在引用的对象会待在这个区域。可以由JVM参数-XX:SurvivorRatio来进行调节。(容易发生minor GC:新生代一般的gc策略为mark-copy)

    • 老年代: 
      历经了Eden区和Survivor区的多次GC后仍然存活下来的对象会存储在这个区里。这个 区会由一个特殊的垃圾回 收器来负责。(容易发生majorGC:老年代一般gc策略为mark-compact)

“` 备注:其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,默认为操作系统物理内存的1/64但小于1G,-Xmx为JVM可申请的最大内存,默认为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大 Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列;当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过XX:MaxHeapFreeRation=来指定这个比列,对于运行系统,为避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样。


  • 方法区 线程共享。分为 持久代、代码缓存注意: 持久代-JDK1.8将换成元空间

持久代:存储包括类定义,结构,字段,方法(数据及代码)以及常量在内的类相关数据。它可以通过-XX:PermSize及 - XX:MaxPermSize来进行调节。如果它 的空间用完了,会导致java.lang.OutOfMemoryError: PermGen space的异 常。 
代码缓存:这个缓存区域是用来存储编译后的代码。编译后的代码就是本地代码(硬件相关的),它是由JIT(Just In Time)编 译器生成的,这个编译器是Oracle HotSpot JVM所特有的。

JVM栈: 线程私有

**:异常可能性:对于栈有两种异常情况:如果线程请求的栈深度大于栈所允许的深度,将抛出StackOverflowError异常,如果虚 拟机栈可以动态拓展,在拓展的时无法申请到足够的内存,将会抛出OutOfMemoryError异常存储局部变量以及方法调用的中间结果及返回值。可以通过JVM选项-Xss来进行调整

本地栈  线程私有。 

**:java程序调用native方法

* PC寄存器*  线程私有。 
**: 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来取下一条需要执行的字节码指令,分支、跳转、循环、异常处理、线程恢复等基础功能都需要这个计数器来完成

猜你喜欢

转载自blog.csdn.net/qq_39291929/article/details/80873456