Java虚拟机学习

java虚拟机

java运行时区域

程序计数器(Program Counter Register)

程序计数器,占用较小的一块区域,可以看做当前线程,所执行的字节码行号指示器,字节码解释器工作,就是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成。因为,java是多线程,为了使线程切换后,能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,不同的线程,互不影响。
执行java方法, 才会记录对应的值,如果,对象执行的是native方法,则计数器的值为空。此区域并没有规定,任何的OutOfMemoryError情况的区域。

Java虚拟机栈

Java虚拟机栈是线程私有的,生命周期与线程相同,每个java方法执行的时候,都会创建一个栈帧Stack Frame,用于存储局部变量表,操作数栈,动态链接,方法出口等信息,每个方法,从调用到执行完成的过程, 对应着一个栈帧,在虚拟机中,从入栈到出栈的过程。
局部变量表中存放了编译期可知的:

  • 各种基本数据类型:Boolean、byte、char、short、int、float、long、double,其中 long 和 double 占用了两个局部变量空间slot,其余的变量占据一个
  • 对象引用类型:reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,或者 指向一个代表对象的句柄、或者其他与此对象相关的位置
  • returnAddress类型:指向了一条字节码指令的地址

局部变量表所需的内存空间在编译期间完成分配,进入一个方法时,分配的局部变量空间大小确定,在方法运行期不会改变局部变量表的大小
如果线程请求的栈深度,大于虚拟机所能允许的最大深度,会抛出Stack Overflow Error异常。如果虚拟机栈可以动态扩展,扩展的时候无法申请到足够的内存,则会抛出,Out Of Memory Error异常。目前,大多数虚拟机都是支持动态扩展的。

本地方法栈 Native Method Stack

与Java虚拟机栈的区别是,Java虚拟机栈为虚拟机执行Java方法服务,而本地方法栈,则为虚拟机使用到的Native方法服务。有些虚拟机会将二者放到一起。

Java 堆 Java Heap

Java 堆,是Java虚拟机所管理的内存中最大的一块,对于大多数应用。

特点:

  • Java堆是被所有线程共享的一块内存区域,在虚拟机启动的时候创建。
  • 目的是为了存放对象实例,几乎所有的对象实例,都在这里分配内存。
  • 几乎所有的对象实例和数组,都要在堆上分配内存。(也有一些例外)
  • Java堆可以处于物理上,不连续的内存空间

Java堆是垃圾收集器管理的主要区域,也可以被称为GC堆。如果堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出Out Of Memory Error异常。

方法区

线程共享区域,存储被虚拟机加载的类信息,常量,静态常量,即时编译期编译后的代码数据等。也叫No-Heap。也可以称为永久代。但也不是永久存在,起回收对象主要是,针对常量池和类型的卸载。方法区无法满足内存分配时,也会抛出Out of Memory Error。

运行时常量池 Runtime

是方法区的一部分,用于存放编译期生成的各种字面量和符号引用

直接内存 Direct Memory

不是Java运行时内存,也不是Java虚拟机中定义的内存,但这部分内存也会被频繁使用。

HotSpot虚拟机对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值