java虚拟机-第一篇:Java虚拟机运行时数据区域

注:本篇即作者加深记忆编写

一。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堆大小限制


猜你喜欢

转载自blog.csdn.net/weixin_37352094/article/details/81010565