JAVA虚拟机运行数据区

来源:互联网 发布:部落冲突女巫升级数据 编辑:程序博客网 时间:2024/05/22 06:12

1.程序计数器

程序计数器是一段小的内存空间,可以把它看成当成线程所执行的字节码的行号指示器。这个区域不会出现OUtOfMemoryError异常。

如果线程执行的是Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址;如果是Native方法,则计数器为空。

java虚拟机多线程是使用线程轮流切换并分配处理执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。为了线程切换后能够恢复到正确的执行位置,每条线程都需要一套独立的线程计数器

2.JAVA虚拟机栈

虚拟机栈也是线程私有的,它描述的是Java方法执行的内存模型。每个方法对应一个栈帧,存储这个方法的各种信息。每次一个方法的执行,就对应一个栈帧在虚拟机栈入栈到出栈的过程。

如果线程请求的栈深度大于虚拟机所允许的深度,就会出现StackOverFlowException。如果允许动态扩展,在扩展的过程中,如果无法申请到足够的内存,则会抛出OutOfMemoryException异常。

3.本地方法栈

与虚拟机栈相似,区别是虚拟机栈执行java方法,而本地虚拟机使用到的是native方法服务。

4..Java堆

Java堆是所有线程共享的内存区域,在虚拟机启动的时候创建。此内存区域的目的是存放对象实例,几乎所有对象实例都在这里分配内存。

Java堆是垃圾收集管理的主要区域。

5.方法区

方法区可以看作堆的逻辑部分,是各个线程共享的内存区域,存储着虚拟机加载的常量,静态变量,以及类信息。这个区域的内存回收的目标就是针对常亮池的回收和对类型的卸载,也是较为难处理的部分。

直接内存

直接内存并不是虚拟机运行时数据区的一部分,它是加入的NIO类引入的基于通道的存储方式,它的原理是从用native函数库得到一个堆外内存,然后用一个java类DirectByteBuffer来指向它,使得内存的容量增加。

原创粉丝点击