java虚拟机(JVM)堆、栈、方法区的详细详解和区别介绍(JDK7及以前版本)

本文针对JDK7及以前版本,JDK8之后结构有变动,将会在另一篇中做介绍

在介绍jvm的堆、栈、方法区的区别之前需要先了解一下JVM的基本结构是什么。

根据《java虚拟机规范》规定,JVM的基本结构一般如下图所示:

由上图可知JVM基本机构包括:类加载器、内存区域、执行引擎、本地库接口 。

这里我们说明一下内存区(也叫运行时数据区),运行时内存区主要可以划分为5个区域:

1. JVM栈 (Java Virtual Machine Stacks) 

2. 堆内存 (Heap Memory) 

3. 方法区 (Method Area) 

4. 本地方法栈 (Native Method Stacks) 

5. 程序计数器 (Program Counter (PC) Register)

接下里就详细说明一下这些区域的区别

1. JVM栈 (Java Virtual Machine Stacks) 

 每当启动一个新线程的时候,java虚拟机都会为它分配一个java栈。java以栈帧为单位保存线程的运行状态。虚拟机只会对java栈执行两种操作:以栈帧为单位的压栈或者出栈。

每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 。

每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 

栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

2. 堆内存 (Heap Memory) 

存储的全部是对象,每个对象包含一个与之对应的class信息–class的目的是得到操作指令。

jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身。  

堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。 

缺点是,由于要在运行时动态分配内存,存取速度较慢。

3. 方法区 (Method Area) 

在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。

当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。虽然JVM规范把方法区描述为堆的一个逻辑部分, 但它却有个别名non-heap(非堆)。

4. 本地方法栈 (Native Method Stacks) 

和java栈的作用差不多,只不过是为JVM使用到的native方法服务的。

Java官方对于本地方法的定义为methods written in a language other than the Java programming language,就是使用非Java语言实现的方法,但是通常我们指的一般为C或者C++,因此这个栈也有着C栈这一称号。一个不支持本地方法执行的JVM没有必要实现这个数据区域。本地方法栈基本和JVM栈一样,其大小也是可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemoryError错误。 

在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。

5. 程序计数器 (Program Counter (PC) Register)

用于保存当前线程执行的内存地址。

由于JVM程序是多线程执行的(线程轮流切换),所以为了保证线程切换回来后,还能恢复到原先状态,就需要一个独立的计数器,记录之前中断的地方,可见程序计数器也是线程私有的。

注意这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

版权声明:本文为博主原创文章,未经博主允许不得转载。 

http://http://blog.csdn.net/heart_mine/article/details/79495032

 

  • 17
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值