java虚拟机运行时的所管理的内存模型

虚拟机运行时数据区域:

    java虚拟机在运行java程序的过程中,会把它所管理的内存划分为多个不同的数据区域。这些区域都有各自的用途、创建和销毁的时间,有的区域随着虚拟机进程的启动而存   在,有些区域则依赖用户线程的启动和结束而建立和销毁。

    java虚拟机把所管理的内存划分为5个区域:程序计数器、虚拟机栈、本地方法栈、堆、方法区。如下图所示

    (https://img-blog.csdn.net/20170706183446138?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhlcm9hZG9mYw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

(1)程序计数器:

      程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。

      程序计数器是一个“线程私有内存”。因为,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。

      当程序执行一个java方法时,计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是一个Native方法,计数器的值为空(undefined);

  这个内存区域在java虚拟机中是唯一没有规定任何OutOfMemoryError情况的区域

(2)java虚拟机栈:

      java虚拟机栈和程序计数器一样,都是线程私有的,它的生命周期与线程相同,"同生同死"。

  这个虚拟机栈描述的是java方法执行的内存模型:每一个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。其中每一个方法的调用到执行完成的过程,就对应着一个栈帧在虚拟机栈的入栈到出栈的过程。

(3)本地方法栈:

      本地方法栈和虚拟机栈的作用是一样的,只不过他描述的是本地方法;

(4)堆:

        堆是java虚拟机中最大的一块内存区域,是线程共享的。他主要是用来保存对象的创建的实例;而且垃圾收集器主要收集的也是这部分区域,因此也被叫做GC堆。

(5)方法区:

      方法区和堆一样也是各个线程锁共享的,他主要是存储虚拟机加载的类信息、常量、静态变量、 即时编译器编译后的代码等数据。

      运行时常量池(RuntimeConstant Pool)是方法区的一部分。 Class文件中除了有类的版本、 字段、 方法、 接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

  

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值