【笔记】深入理解 java 虚拟机---运行时数据区域

来源:互联网 发布:数字密码正则表达式js 编辑:程序博客网 时间:2024/06/05 15:26


java 内存 中的区域 一共 5种。 分别是  (既然是区域,就是空间,有大小,放数据用的。)


1   程序计数器(Program Counter  Register )  

当前线程执行字节码的行号计数器。 就是 一个 字节码文件 在虚拟机里被执行的时候,在这个区域内,存放当前线程当前所执行到的行号,每个线程都有唯一的程序计数器,也必须是这样的。该区域不存在 OutOfMemoryError。(就是一个行号计数器

2  虚拟机栈 (Java Vritual Machine Stacks )

Java 方法运行的区域。所有Java方法都在这个区域内运行。Java 方法的运行意味着一个栈帧,从虚拟机栈入栈到出栈的过程。 栈帧在Java方法运行时创建,包含 入口信息,出口信息,局部变量表,操作数栈???,动态连接???。其中局部变量表里存放8大基本数据类型。(我以前一直以为栈上只放 8 大基础类型的)

3  本地方法栈 (Native Method Stacks)

同上,不过运行的native 方法。

4  堆 (Heap)

    对象的创建,都在这里分配内存。(面向对象编程的对象就在这里) 最大的内存区域。又被成为GC(Grabage Collection Heap) ,小名 垃圾堆。可细分为 新生代和老年代。还可继续细分,没接触过,比较陌生就不写了。所有线程共享。GC主要作用域。

5  方法区(Method Area)

存放 被虚拟机加载过的常量,类信息,静态变量,即使编译器编译后的代码???。 小名 永久代。包括运行时常量池(Constant Pool Table),存放编译器生成的字面量?????和符号引用????。


总结,5大区域,3个线程私有,2两个共享。

如图: 

我们的程序都是有线程去执行的,Java代码也是。虚拟机加载字节码文件,分配具体线程去执行机器码,这时就有了 程序计数器,当执行到方法的时候,产生栈帧,一个方法运行需要多大的内存,已经分配好了,线程去跑这个方法,完成入栈到出栈的操作,这时候堆上有,咱的对象。方法区有编译好的类信息和符号引用。然后走完5大区域的线程被销毁。



 

阅读全文
0 0
原创粉丝点击