JVM内存结构划分
JVM(Java虚拟机)的内存结构主要划分为以下几个部分:
堆(Heap)
-
概述:堆是JVM中最大的一块内存区域,用于存储对象实例和数组。堆内存是垃圾收集器管理的主要区域,因此也被称为“GC堆”。
-
细分:堆内存可以分为年轻代(Young Generation)和老年代(Old Generation)。年轻代又进一步分为Eden区、From Survivor区(也称为S0区)和To Survivor区(也称为S1区)。在JDK 1.8及以后版本中,取消了永久代(PermGen space),将其内容移至元空间(Metaspace)。
-
配置参数
:
-Xms
:设置堆的初始大小。-Xmx
:设置堆的最大值。-XX:NewRatio
:设置年轻代和老年代的比例(默认值为2,即年轻代占1/3,老年代占2/3)。-XX:SurvivorRatio
:设置Eden区与Survivor区的比例(默认值为8,即Eden区与每个Survivor区的比例为8:1)。
方法区(Method Area)
-
概述:方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。它是线程共享的区域。
-
发展:在JDK 1.8之前,HotSpot虚拟机将其实现为永久代(PermGen space)。但从JDK 1.8开始,永久代被移除,取而代之的是元空间(Metaspace),它位于本地内存中,而不是虚拟机内存中。
-
配置参数
:
-XX:MetaspaceSize
:设置元空间的初始大小(默认值为平台依赖,但Oracle JDK 8的默认值为大约20.75MB)。-XX:MaxMetaspaceSize
:设置元空间的最大值(默认值为-1,即没有限制,但会受到物理内存的限制)。
虚拟机栈(VM Stack)
-
概述:每个Java线程都有一个私有的虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。它是线程私有的,生命周期与线程相同。
-
异常:如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出
StackOverflowError
异常;如果虚拟机栈可以动态扩展,但在扩展时无法申请到足够的内存,将抛出OutOfMemoryError
异常。
本地方法栈(Native Method Stack)
-
概述:与虚拟机栈类似,但它是为虚拟机使用到的Native方法(即用其他语言编写的方法)服务的。
-
异常:与虚拟机栈一样,本地方法栈也可能抛出
StackOverflowError
和OutOfMemoryError
异常。
程序计数器(Program Counter Register)
-
概述:程序计数器是一块较小的内存空间,用于存储当前线程所执行的字节码的行号指示器。它是线程私有的,且不会存在内存溢出的情况。
总结
JVM的内存结构主要包括堆、方法区、虚拟机栈、本地方法栈和程序计数器。其中,堆和方法区是线程共享的区域,而虚拟机栈、本地方法栈和程序计数器是线程私有的区域。每个区域都有其特定的作用和配置参数,共同支持Java程序的运行。
标签:虚拟机,划分,线程,内存,JVM,默认值,方法 From: https://www.cnblogs.com/yhy373286277/p/18334336