Java JVM中数据区

一,数据区分类。

栈、堆、方法区、本地方法栈和程序计算器。

二,数据区详解。

1,栈帧:一个栈帧随着一个方法的调用而创建,调用完成而销毁。栈帧内存放着方法中的局部变量,操作数栈等数据。
:Java栈只对栈帧进行存储、压栈和出栈操作。Java栈是Java方法执行的内存模型。
栈内存的大小可以有两种设置,固定值和根据线程需要动态增长。
在JVM栈这个数据区可能会发生抛出两种错误。

  1. StackOverflowError 出现在栈内存设置成固定值的时候,当程序执行需要的栈内存超过设定的固定值会抛出这个错误。
  2. OutOfMemoryError 出现在栈内存设置成动态增长的时候,当JVM尝试申请的内存大小超过了其可用内存时会抛出这个错误。

总结

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

2,堆内存(Heap Memory)
堆数据区是用来存储对象和数组(特殊的对象)。堆内存有多个线程共享,堆内存随着JVM启动而创建。
总结

  1. 存储的全部是对象,每个对象包含一个与之对应的class信息–class的目的是得到操作指令。
  2. jvm只有一个堆区(heap)被所有线程共享,堆区中不存放基本类型和对象引用,只存放对象本身。
  3. 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。
  4. 缺点是,由于要在运行时动态分配内存,存取速度较慢。当堆内存剩余的内存不足以满足于对象创建,JVM会抛出OutOfMemoryError错误。

3,方法区
方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法、信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。
在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中。

4,本地方法栈
一个支持native方法调用的JVM实现,需要有这样一个数据区,就是本地方法栈。本地方法栈基本和JVM栈一样,其大小也是可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemoryError错误。

5,程序计算器
程序计算器用来记录当前正在执行的指令,为线程私有,所以当一个新的线程创建时,程序计算器也会创建。由于java是支持多线程,Java中的程序计算器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计算器的值为undefined。注意这个区域是唯一一个不抛出OutOfMemoryError的运行时数据区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值