JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。
虚拟机栈
程序执行每个线程时调用许多方法,每个方法对应一个栈帧。一个个栈帧组成了虚拟机栈。也称栈内存,溢出时排除StackOverflowError异常。
栈帧内包括【局部变量表、操作栈、动态链接、返回地址】。

- 局部变量表
方法内的局部变量。包括编译器可知的各种基本数据类型(boolean、byte、char、short、int、long、double)和对象引用reference类型。 - 操作栈
取值、赋值、运算等指令操作。 - 动态链接
调用方法的实际地址。 - 返回地址
方法返回值的返回地址。
程序计数器
记录当前线程所执行的字节码的行号。
本地方法栈
Java具有跨平台特性,是指同一套java源代码可以在不同平台上执行。主要依赖于各个平台适配的JVM。
虚拟机会调用不同的平台的本地方法完成特定功能,这些平台自有的方法通常称为本地方法。
同Java方法一样,执行本地方法时也是通过栈的方式分配内存。
堆内存(线程共享)

也称堆内存,主要存储对象示例和数组,是垃圾收集器的主要管理区域。根据分代收集算法,内部分为新生代和老年代两块区域。
新生代占堆内存1/3,其中又分为伊甸区、S1区和S2区,分别占比8:1:1。
新生代快满了,开始minor GC。
老年代占堆内存2/3,主要存放数组大对象和老对象。当其不够时,则开始STW进行full GC,当其溢出时排除OutOfMemoryError异常。
元空间(线程共享)
又称方法区、永久代。
主要存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
运行时常量池(Runtime Constant Pool)是方法区的一部分。
Class 文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
网友评论