Java内存区域

JVM 在执行Java程序的时候, 会把他所管理的内存划分为若干个不同的数据区域, 有些呢,随着JVM启动便存在, 伴随程序的整个生命周期, 有些呢, 随着线程的创建而出现, 随着线程的结束而销毁。

程序计数器(Program Counter Register)

当前线程所执行字节码的行号指示器, 字节码解释器就是通过程序计数器的值来选取下一条需要执行的字节码指令, JVM中的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的, 所以,就需要记录当前线程执行到哪一行, 这也是程序计数器的作用, 由此也能知道, 程序计数器是线程私有的。

Java虚拟机栈(JVM Stacks)

线程私有, 用来描述Java方法执行的内存模型: 每个方法在执行的时候都会创建一个栈帧(Stack Frame)用于储存局部变量表, 操作数栈, 动态链接, 方法出口, 等一些与方法本身有关的信息。
局部变量表存放了各种基本类型, 以及对象引用, 和returnAddress类型, 局部变量表里所需的内存在一开始执行便确定了

本地方法栈(Native Method Stacks)

与虚拟机栈一样, 只是这里保存的是Native方法, 有的虚拟机会将两栈并为一栈使用。

Java堆(又名GC堆) (Java Heap)

几乎所有的对象都在这里分配空间, 是垃圾收集器管理的主要区域, 所以又称GC堆(Garbage Collected Heap), 从内存回收方面来看Java堆可以细分为新生代和老年代, 内存分配角度来看, Java堆可能会划分出多个线程私有的分配缓冲区, 这些分配的作用都是为了能更快的GC, 这里线程共享

方法区(Method Area)

与Java堆一样, 线程共享, 这里用来存储已被加载的类信息, 常量, 静态变量, 即时编译器编译后的代码等等

运行时常量池, 是方法区的一部分Class文件中,除了有类的版本, 字段, 接口等描述信息外, 还有一项是常量池, 用于存放编译期生成的各种字面量和符号引用, 这部分在类加载后会进入到方法区的常量池, 运行时常量池相较于Class文件的常量池, 有一个特征是具备动态性,例如String.intern()

你可能感兴趣的:(Java内存区域)