一段话系列-JVM运行时内存分布

1.堆

主要用于存放new出来的对象;对于堆中对象的回收,收集器基本都采用分代收集算法,基于此算法,堆可被划分为新生代和老年代。java

2. 虚拟机栈

主要用来描述Java方法执行的内存模型,是线程私有的;每一个方法在执行的同时都会建立一个栈帧用于存储局部变量表操做数栈动态连接方法返回地址等信息,每个方法从调用到执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。算法

PS:每一个方法都会建立一个栈帧,因此,若是方法调用嵌套层数过大,则会出现StackOverflowError异常,java虚拟机栈的默认大小是1024KB。优化

3.本地方法栈

与虚拟机栈功能相似,但主要是为Native方法的服务(如何服务?spa

4.程序计数器

主要用于记录程序执行到了哪里;程序计数器是一块较小的内存空间,在未优化的编译器中它用来指向当前线程执行的字节码的行号,由于是指向当前线程的程序,因此程序计数器是线程私有的,每一个线程都有一份程序计数器。线程

5.方法区

主要用于存储被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后(JIT)的代码等数据,基于分代收集算法,也可视做永久代(JDK7之前)。对象

    a.运行时常量池

    主要是用于在运行时存放被JVM加载进来的各类字面量和符号引用,是方法区的一部分。blog

    PS:这里须要提一下常量池这个概念,在Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各类字面量和符号引用(即类在被JVM加载进来以前,各类字面量和符号引用是放在字节码文件里面,静态存储的)。如今看来,运行时常量池和常量池存储的内容是同样的,那么为何还要有运行时常量池呢?由于其具备动态性:java语言并不要求常量必定只有编译器才能产生,也就是并不是预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,好比String类的intern方法就为此类操做。运行时常量池为咱们提供了一种可以在运行时动态操做常量池的方法。接口

 

相关文章
相关标签/搜索