JVM内存结构划分
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程序的运行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)