您现在的位置是:首页 > 原理深入 > Java虚拟机Java虚拟机

虚拟机内存管理机制

第十三双眼睛2019-05-21【Java虚拟机】人已围观

简介主要介绍java虚拟机内部原理

简述
从事C/C++的开发人员,对于动态内存来说,他们即负责内存的开辟,在使用完毕之后,也负责内存的释放。但是可能由于程序员的疏忽,会导致在程序运行过程中,某快内存已经使用完毕了,但是一致没有释放,这样,程序在开辟内存的时候,可以使用的内存就会越来越少,这样,就可能导致内存的占用率越来越高,最后,导致死机。
对于JAVA程序员来说,程序员完全不用管内存的开辟与回收这件事,因为java虚拟机会处理这件事。

java虚拟机在运行过程中,会把操作系统分配给它的内存划为以下几个不同的部分:
1程序计数器PC
2java虚拟机栈
3本地方法栈
4堆
5方法区
这些不同的部分都有各自的用途,以及他们创建销毁的时机也是不同的,其中程序计数器,虚拟机栈,本地方法栈是每个线程都私有的,他们随着线程对象的创建而创建,线程对象的销毁而销毁,方法区和堆是虚拟机启动时进行创建的,虚拟机关闭的时候销毁,他们在线程之间共享。

程序计数器
程序计数器也叫PC,是一块较小的空间,主要存放下一条要执行的指令的地址。程序的执行流程就是通过改变程序计数器里的值来实现的,比如顺序,选择,循环。如果程序正在执行的是一个JAVA方法,那么程序计数器里的值是下一条指令的地址,如果执行的是本地方法,则程序计数器里的值是空(undefined)

java虚拟机栈
java虚拟机栈也是线程私有的,它描述的是java方法执行时的内存模型:每个方法在开始执行的时候,都会创建一个栈帧,然后将栈帧压入属于当前线程的栈中,栈帧用于存放方法运行时的局部变量表,操作数栈,动态链接,方法出口。方法执行完成后,此栈帧出栈。每一个方法从开始调用到最后退出,都伴随着一个栈帧在所属栈空间的入栈,出栈过程。
局部变量表存放了方法内部的局部变量,包括基本来行和引用类型,其中,基本变量里存放的是值,而引用变量里存放的是对象的地址,也就是堆空间中的一个内存单元地址,这个地址可能是对象的直接地址,也可能是代表对象的一个句柄的地址。其中64位长度的long和double会占用两个局部变量空间,其余的数据类型只占用一个。
在虚拟机规范中,只规定了两种异常情况,如果线程执行过程中的栈深度大于虚拟机允许的栈深度,将抛出StackOverFlow异常,如果虚拟机可以动态扩展,但是无法申请到足够的内存时,就会抛出OutOfMemoryError异常。
本地方法栈
本地方法栈于虚拟机方法栈发挥的作用是相似的,只不过是本地方法栈式为本地方法服务。也会抛出StackOverFlow异常和OutOfMemory异常

Java堆
大多数应用来说,java堆是java虚拟机管理的内存中最大的一块,它是被所有线程共享的,在虚拟机启动的时候进行创建,所有的对象几乎都在此区域存放,此区域也是垃圾收集器主要光临的区域,由于现在内存回收主要采用分代回收算法来实现,因此,此区域还可以分为新生代和老年代,新生代还可以划分为eden,from survivor to survivor,在内存分配的角度来看,线程共享java堆中,可能划分出线程私有的分配缓冲区。

方法区
方法区与java堆一样,都是线程共享的,用于存储已经被虚拟机加载的类信息,常量,静态变量,即使编译器编译后的代码等数据,在hotspt这款虚拟机中,也把它纳入垃圾收集器的管理中,叫做永久代。

运行时常量池
运行时常量池时方法区的一部分,class文件中除了有类的版本字段,方法,接口等描述信息外,还有一项时常量池,用于存放在编译期生成的各种字面量和符号引用,这部分内容在类加载后,进入方法区的运行时常量池中存放。java虚拟机堆类的每一个部分都有严格的规定,每一个字节用于存放哪种数据必须符合规范才会被虚拟机认可,装载,和执行,但是对于运行时常量池没有做严格的细节要求。
运行时常量池相对于class常量池的另外一个特征就是具备动态性,java语言并不要求常量一定只能在编译期产生,即,不是编译时的常量才能进入运行时常量池,而是运行期间也可以将新的常量放入常量池。
既然运行时常量池也是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时,会抛出OutOfMemory异常。

直接内存
直接内存不是java虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但是jdk1.4中,引入了一种新的流对象,它是一种基于通道和缓冲区的方式,可以使用本地函数库的函数直接分配堆外内存,然后用一个在堆中的对象进行操作,这样能避免在本地堆和java堆中来回复制数据。
直接内存不会收到java内存的限制,但是会收到物理机内存的限制,所以,也可能抛出OutOfMemory异常。

对象的创建






 

Tags:java虚拟机   java

很赞哦! ()

上一篇:返回列表

下一篇:返回列表

文章评论

    共有条评论来说两句吧...

    用户名:

    验证码:

本站推荐

站点信息

  • 网站名称:JavaStudy
  • 建站时间:2019-1-14
  • 网站程序:帝国CMS7.5
  • 文章统计69篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 微信公众号:扫描二维码,关注我们