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