JVM内存结构
JVM Java虚拟机是一种虚拟的计算机程序,为Java提供了运行环境来运行源码编译成的字节码文件。
JVM内存结构是指运行Java程序时,JVM组织和管理内存的结构。
JVM内存主要分为5个区域,分别存储不同类型的数据。
方法区
- 主要存储类信息,类加载器,运行时常量池。
- 运行时常量池,存储编译期生成的各种字面量和符号引用。
- jdk7及之前中,方法区的实现是永久代,永久代在堆中。运行时常量池中存储了字符串常量池。
- jdk8中,方法区的实现是元空间,元空间在本地内存中。字符串常量池存储在堆中。
堆
- 堆是线程共享的,需要考虑线程安全问题。
- Java中几乎所有的对象实例都存储在堆中。
- 逃逸分析:如果方法中某些对象不会返回,也没有被外界使用,就会直接在栈上分配内存。
- 堆是垃圾回收器管理的主要区域,从垃圾回收的角度看,Java堆还可以细分为新生代和老年代。
程序计数器
- 每个线程都有一个独立的程序计数器,线程切换时,程序计数器也会切换到相应线程的执行地址。
- 程序计数器存储下一条指令的执行地址,解释器读取下一条指令然后执行。
虚拟机栈
- 虚拟机栈线程私有,生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡。
- 每个方法执行的时候都会创建一个栈帧来存储方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。栈的大小决定了方法调用的可达深度(递归过深会导致StackOverflow)。
本地方法栈
- jvm需要用到c或者c++写的一些本地方法(native修饰),本地方法运行时使用的内存的就是本地方法栈。
- 本地方法被执行的时候,在本地方法栈也会创建一个栈帧,存放本地方法的一些信息。