笔记一:虚拟机运行时的数据区域

来源:互联网 发布:mac vnc client 编辑:程序博客网 时间:2024/05/16 23:01


                                           虚拟机数据区域
方法区,虚拟机栈,本地方法栈,堆,程序计数器,
方法区和堆是线程共享的。
一程序计数器
程序技术器是线程私有的
可以看作是行号知识器,工作时候指定吓一跳语句的跳转,分支,循环,跳转,异常处理等
在多线程中每条线程都有独立的线程计数器,各个线程之间的计数器互不影响


二java虚拟机栈
java虚拟机栈是线程私有的,他的生命周期和线程是一样的
虚拟机栈是面熟java方法执行的内存模型:每个方法执行的时候都会创建一个栈帧(StackFrame)用于存储局部变量表,操作数栈,动态链接,方法出口等
局部变量表里面有编译期可以知道的各种数据类型(boolean,byte,char,short,int,float,double等),对象引用(reference类型:可以理解为指向其他对象地址的指针 returnAddress:可以理解为指向一条字节码指令的地址)
其中64为长度的long和double会占用两个局部变量的空间,其他占据一个空间。空间在编译的时候完成分配。运行时不会改变
如果线程请求的栈深度大于虚拟机允许的深度。那么就会抛出StackOverflowError这个异常


三本地方法栈
本地方法栈和java虚拟机栈非常相似,只不过是本地方法栈执行的是Native本地方法,例如在awt中的界面UI生成就是执行本地方法,而Swing界面UI是执行java方法
本地方法栈也会抛出相同的异常(原理如上)


四java堆(java Heap)
有一种说法将虚拟机分为堆方法区和栈方法区(其实是不太合理),可以看得出堆的重要性。堆方法区是虚拟机中最大的一块内存,是被所有线程共享的,在虚拟机启动时创建,其唯一目的就是存放对象实例,绝大部分的对象实例都是在堆上完成分配的
java堆是垃圾回收机制管理的主要区域,因此也叫GC堆(Garbage Collected Heap)。怎么感觉翻译过来就是垃圾堆。。。。
和我们的磁盘差不多,java堆可以是物理上不连续的存储空间,但要在逻辑上连续。
既可以固定大小也可变长,当前主流的虚拟机都是变长的,当其空间被占光时候,会抛出OutOfMemoryError异常


五方法区
方法区和java堆一样是线程共享的,用来存储一斤被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码等。方法区可以是堆的一部分,但是他也叫做非堆(Non-Heap),我想就是为了要和堆区分开来吧。

和我们的磁盘差不多,java堆可以是物理上不连续的存储空间,但要在逻辑上连续。还可以选择不执行垃圾回收。垃圾回收在方法区里面难以控制。当其空间被占光时候,会抛出OutOfMemoryError异常



1 0