区域 | 线程隔离 | 作用 |
---|---|---|
方法区 | 所有线程共享 | 用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常 |
运行时常量池(方法区的一部分) | 所有线程共享 | 用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。不止编译期, 运行时也可将常量放入池中, 例如String 的intern() 方法 |
Java堆 | 所有线程共享 | 存放对象实例的区域。几乎所有对象实例以及数组都应当在堆上分配。通过参数-Xmx 和-Xms 设置, GC的主要区域, 若堆中没有内存完成实例分配且堆无法再扩展时,将会抛出OutOfMemoryErro r异常。 |
虚拟机栈 | 线程私有,其生命周期和线程同步,随着线程的启动而创建,随线程的结束而销毁。 | 每个方法被执行时, java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法的被调用直至执行完毕的过程,都对应着一个栈帧在虚拟机栈中入栈到出栈的过程。若线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError 异常;若虚拟机可以动态扩展,而扩展时无法申请到足够的内存,就抛出OutOfMemoryError 异常 |
本地方法栈 | 线程私有 | 虚拟机使用本地(Native)方法时的使用区域, 同虚拟机栈 |
程序计数器 | 线程私有 | 它是程序控制流的指示器, 分支、循环、跳转、异常处理、线程恢复等基本功能都依赖这几计数器来完成, 没有任何OutOfMemoryError
|
网友评论