JVM - JVM运行时数据区详解(栈区、堆区、方法区、本地方法栈、程序计数器)

1.下面是JVM运行时数据区

在这里插入图片描述

2.详解数据区
2.1 JVM栈(Java Virtual Machine Stacks)

先了解栈帧的概念。栈帧是随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方法中的局部变量,操作数栈等数据。Java栈也称作虚拟机栈(Java Vitual Machine Stack),JVM栈只对栈帧进行存储,压栈和出栈操作。Java栈是Java方法执行的内存模型。下面我们来看一个Java栈图。

在这里插入图片描述

Java栈中存放的是一个个的栈帧。当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。对于所有的程序设计语言来说,栈这部分空间对程序员来说是不透明的。

栈内存的大小可以有两种设置,固定值和根据线程需要动态增长。在JVM栈这个数据区可能会发生抛出两种错误。

  • StackOverflowError:出现在栈内存设置为固定值时,当程序执行时需要的栈内存超出设定的固定值会抛出此错误。
  • OutOfMemoryError:出现在栈内存动态增长时,当程序执行时需要的栈内存超出JVM可以内存时会抛出此错误。

总结:

  1. 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象本身)。对象都存放在堆区中。
  2. 每个栈中的数据都是私有的,其它栈不能访问。
  3. 栈分为三个部分:基本类型变量,执行环境上下文,指令操作区(存放指令操作)。(都放在栈帧里面)。
  4. 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
  5. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用(局部变量)。
2.2 堆内存(Heap Memory)

堆内存用来存放对象和数组(数组是特殊的对象)。堆内存由多个线程共享。堆内存随着JVM的启动而创建。Java的GC垃圾回收机制就是回收堆内存里面的数据,如果堆内存剩余的内存不足以满足对象的创建,JVM会抛出OutOfMemoryError错误。

总结

  1. 存储的全部是对象,每个对象包含一个与之对应的class信息,class存在的目的是为了得到操作指令(这里的操作指令又是什么东西?)
  2. JVM只有一个堆区,堆区被所有线程共享,堆区不存放基本类型和对象引用,只存放对象本身。
  3. 堆的优势是可以动态的分配内存,生存期也不必事先告诉编译器,因为它是在运行时动态的分配内存的,GC会自动回收这些不在使用的数据,从而释放内存。
  4. 缺点是由于在运行时动态分配内存,存取速度较慢。
2.3 方法区(Method Area)

方法区被所有线程共享。在方法区中,存放每个类的信息(类名、方法信息、字段信息)、静态变量、常量以及编译后的代码等。

在class文件中除了接口和类的字段、方法等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量符号的引用。(字面量就是int a=1中的1,符号的引用就是在class文件中指令使用字符串来表示)。

在方法区中有一个非常重要的部分就是运行时常量池它是每一个类或接口的常量池在运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern()方法。

2.4 本地方法栈(Native Method Stacks)

一个支持native方法调用的JVM实现,需要这样一个数据区,就是本地方法栈。使用非Java语言实现的方法,通常是C/C++,因此也叫C栈。本地方法栈和JVM栈一样,大小可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemoryError错误。HotSopt虚拟机中直接把本地方法栈和Java栈合并了。

2.5 程序计数器(Program Counter(PC) Register)

在通用计算机体系中,程序计数器是用来记录当前正在执行的命令,JVM中也是如此。程序计数器是线程私有的,所以当创建一个新的线程时,程序计数器也会创建。如果当前执行的方法是本地方法,那么程序计数器的值为undefined。注意这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值