java内存区域

深入java虚拟机学习笔记-1
刚开始基础java时,对java程序运行的数据区域总是没有特别清楚,每当想到一个问题就到网上百度一下,看看别人写的博客,然后过一段时间就忘记了。
最近看了一下java虚拟机这本书,里面讲的非常详细,的确是一本很好的书,我也把自己看到的总结一下,分享的同时也是为了以后查看。

图1 java虚拟机运行时数据区(书中截图)
1022554-20171022155042381-220402943.png
从上图可知:虚拟机内存主要分为共享的方法区(Mehtod Area)、堆(Heap)及私有的虚拟机栈(VM stack)、本地方法栈(Native Method Stack)、程序计数器(Programe Counter Register)这五大块。
下面就上述五个部分进行说明:
1、程序计数器
从书中的解释,我理解的是,程序计数器是程序当前线程字节码的游标,它记录每一个线程字节码执行到了哪个位置。当多个线程来回切换时,我们得知道程序执行到哪里了,才能接着往下面执行。
那么,程序计数器就是执行这样的功能。它是一块很小的内存空间,java虚拟机规范中没有规定任何OutOfMemoryError的区域。
2、虚拟机栈(编译期间分配大小)
这就是我们常说的栈区,对于栈区的理解,主要把握一下几点:首先是线程私有,生命周期与线程相同。其次,每个方法在执行的过程中都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
每个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。
简单理解,虚拟机栈存放方法执行过程中的局部变量表,包括八大基本数据类型,对象引用等,局部变量表所需要的空间在编译期间完成分配,运行期间不会改变局部变量表大小。
3、本地方法栈
本地方法栈与虚拟机栈作用类似,只不过虚拟机栈针对虚拟机执行java方法服务,而本地方法栈是虚拟机使用Native方法服务。
4、java堆
堆对于java虚拟机来说是虚拟机管理的内存最大的一块,也是GC(垃圾回收)主要的监控区域。java堆是一块线程共享区,在虚拟机启动时创建。该内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里
分配内存。
5、方法区
与java堆一样,方法区也是线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量即使编译器编译后的代码等数据。其中包括一个重要部分是运行时常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

转载于:https://www.cnblogs.com/binjava/p/7710109.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值