java虚拟机自动内存管理机制
java虚拟机的运行是内存区域
java虚拟机在运行时会将它管理的内存区域分成不同职能的内存区域,各区域各司其职。类比中国的皇朝制度,三省六部,来管理整个国家。那来看一下虚拟机的职责。
虚拟机的主要任务是用来运行java程序,即字节码文件,字节码文件有命令坐标(行号),类的信息。而类主要由属性和方法构成。
虚拟机的内存区域就是这些人施展才华的天地,来看看虚拟机怎么人尽其才。
1.虚拟机的内存区域图和字节码文件的对应关系
白嫖使我快乐
看看对应的关系以及职能
oop对应表 | 虚拟机中的内存区域 | 理解 | 职能 |
势 | 程序计数器 | 即下一步需要做什么 | 行号指示器,字节码解释器通过改变这块内存的值来确定要执行的字节码命令。分支,循环跳转,异常处理和线程恢复需要依靠它。native值是undefined且不会发生内存溢出错误。(线程私有) |
计算机的系统函数(一种) | 本地方法栈 | 和线栈类似,调用的不是java方法 | 可以调用其他语言的方法以及java的native方法 |
类中的方法 | 线栈 | 方法的链式调用,栈帧的入栈出栈顺序 | 生命周期和线程相同。 |
类的信息 | 方法区 | 巧妇的米,载舟的水 | 用于存储被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。会有内存泄露等问题, |
对象 | 堆 | 类的代言人聚集地 | 存放类的实例以及数组,虚拟机里最大的内存区域,垃圾处理器的主阵地。几乎所有对象都在这分配内存。实例对象=对象头+属性 |
各种字面常量和符号引用 | 常量池 | 于取于放 | 用于存储各种字面常量,String.intern()方法,也可以存储对象的直接引用 |
场地 | 直接内存 | 堆外内存 | 有一些机制会需要堆外内存,例如nio会建立通道和缓冲区,利用堆外内存可以显著提高效率 |
方法和线栈的对应关系
oop对应表 | 线栈 | 理解 | 职能 |
方法 | 栈帧 | 一帧一方法 | 方法的实体,方法运行时的基本数据结构 |
返回值 | 方法出口 | ||
方法内加减 | 操作数栈 | ||
方法内局部变量 | 局部变量表 | 存了各时期的基本数据类型(8个),对象引用reference和returnAdress | |
动态链接 | |||
2.java虚拟机对象的创建过程
3.OutOfMemoryError错误