线程私有:程序计数器 虚拟机栈 本地方法栈
线程共享受: 堆 方法区
程序计数器 :当前线程所执行字节码的行数指示器。没有定义异常
虚拟机栈: java方法执行的内存模型,每一个java方法在执行的时候都会创建一个栈帧用来存储局部变量表、操作数栈、动态链接、方法出口等信息。
局部变量表存放了编译期可知的基本类型和引用类型,局部变量表所需的内存空间在编译期间分配完成,运行期间不会改变大小
操作数栈中存放指令执行时所需要的操作数
动态链接:每个栈帧中都包含一个该栈帧所属方法的引用
方法出口:每一个方法结束无非是正常return或者抛出了Exception并且没有catch语句,在方法执行完之后需要返回到方法被调用的位置,返回时需要在栈帧中保存一些信息,用来帮助恢复它的上层方法的执行状态。可能抛出StackOverflowError或OutOfMemoryError
本地方法栈:为native方法服务(调用非java代码写的接口时会用到native)。可能抛出StackOverflowError或OutOfMemoryError
堆:虚拟机所管理内存中最大的一块,在虚拟机启动时创建,用于存放对象实例和数组,从垃圾回收的角度看分为新生代、老年代;再细致可分为Eden、From Survivor、To Survivor空间、老年代。可能出现OutOfMemoryError
方法区:用来存储虚拟机加载的类信息、常量、静态变量、即时编译后的代码数据。垃圾回收的对象为:常量池的回收和类型的卸载。可能出现OutOfMemoryError
运行时常量池(方法区的一部分):用来存放编译期生成的各种字面量(文本字符串、声明为final的常量)和符号引用(类的全限定名、字段和方法的名称和描述符)
还有一块不属于虚拟机运行时数据区的一部分为直接内存:例如nio中使用native函数库直接分配堆外内存,然后通过堆内的引用直接操作这块内存,避免了java堆和native堆的来回复制,可能抛出OutOfMemory异常

被折叠的 条评论
为什么被折叠?



