注:本篇即作者加深记忆编写
一。Java虚拟机运行时数据区域
1.程序计数器
可以看作为,当前线程执行的字节码的行号指令器
作用:通过改变计数器的值来选取下一个需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能
特点:线程隔离,占用较小的内存空间,执行本地方法(Native)时,值为空,没有规定任何OutOfMemoryError情况区域
2.Java虚拟机栈
每个方法在执行的同时会创建一个栈帧,用于储存局部变量,操作数栈,动态链接,方法出口等信息。
作用:当方法调用时,装载对应栈帧的出栈入栈过程
特点:标准的栈结构空间,线程私有,栈帧有对应深度要求,可动态(容量-Xss参数设置大小)
注:本区域之后需要了解,运行时栈帧
3.java堆
作用:存放对象实例,几乎所有的对象实例都在这里分配(例外情况之后了解逃逸分析与标量)
特点:线程共享,虚拟机最大的内存空间,物理上不连续但逻辑上连续的空间(容量通过-Xms和-Xms控制)
注:本区域之后需要了解,GC回收机制,逃逸分析与标量
4.方法区
作用:储存一般加载的类信息,常量,静态变量,即使编译器便以后的代码等数据(再讲方法调用时,会着重讲解解析及其几种分派)
特点:线程共享,同样会被GC回收,存在内存溢出问题(容量通过-XX:MaxPermSize设置上限)
注:解析及其分派时操作的区域
5.运行时常量池
运行时常量池是方法区的一部分(1.6版本)!!!!
JDK1.7的HotSpot,已经把原本放在永久代的字符串常量池中移出!!!
Class文件除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池。
作用:存放编译期生成的各种字面量和符号引用
特点:这部分内容将在类加载后进入方法区的运行时常量池中存放
6.直接内存
直接内存并不是虚拟机运行时数据的一部分,也不是java虚拟机规范中定义的内存区域。
作用:基于通道与缓冲区的IO,它可以使用Natie函数库直接分配堆外内存。
特点:不受Java堆大小限制