JAVA内存区域分布图
2021-10-12 18:34:48 4 举报
JAVA内存区域分布图
作者其他创作
大纲/内容
jvm虚拟机栈(JVM Stack):一个线程的每个方法在执行的同时,都会创建一个栈帧(Statck Frame),栈帧中存储的有当方法被调用时,栈帧在JVM栈中入栈,当方法执行完成时,栈帧出栈。虚拟机栈中定义了两种异常,如果线程调用的栈深度大于虚拟机允许的最大深度,则抛出StatckOverFlowError(栈溢出);不过多数Java虚拟机都允许动态扩展虚拟机栈的大小(有少部分是固定长度的),所以线程可以一直申请栈,直到内存不足,此时,会抛出OutOfMemoryError(内存溢出)。
Old标记清除算法
栈帧
方法区(Method Area):用于存储已经被虚拟机加载的类信息(即加载类时需要加载的信息,包括版本、field、方法、接口等信息)、final常量、静态变量、编译器即时编译的代码等。在内存不足时抛出OutOfMemoryError:PermGen space异常
Surviver:1复制算法
线程私有区域
堆区(Heap):堆区的存在是为了存储对象实例,原则上讲,所有的对象都在堆区上分配内存(不过现代技术里,也不是这么绝对的,也有栈上直接分配的)。堆区是理解Java GC机制最重要的区域,没有之一。在JVM所管理的内存中,堆区是最大的一块,堆区也是Java GC机制所管理的主要内存区域。如果在执行垃圾回收之后,仍没有足够的内存分配,也不能再扩展,将会抛出OutOfMemoryError:Java heap space异常。
线程共享区域
直接内存(Direct Memory):直接内存,就是JVM以外的机器内存,比如,你有4G的内存,JVM占用了1G,则其余的3G就是直接内存,JDK中有一种基于通道(Channel)和缓冲区(Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来引用。由于直接内存受到本机器内存的限制,所以也可能出现OutOfMemoryError的异常。
Eden:8标记整理算法
JAVA内存区域
程序计数器(Program Counter Register):根据单签执行的是否是java方法,如果是则记录其字节码指令行号,如果不是则标为undefined.此区域无异常抛出.
本地方法栈(Native Method Statck):本地方法栈在作用.内存不足时抛出OutOfMemoryError,栈到达一定深度后抛出StatckOverFlowError。唯一的区别是:虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的,在很多虚拟机中(如Sun的JDK默认的HotSpot虚拟机),会将本地方法栈与虚拟机栈放在一起使用。
运行时常量池(Runtime Constant Pool):用于存储编译期就生成的字面常量、符号引用、翻译出来的直接引用
0 条评论
下一页