JDK 1.8 内存模型

1.Java栈

Java栈的区域很小,只有1M,但是特点是存取速度很快,所以在栈中存放的都是快速执行的任务,基本数据类型的数据和对象的引用。

驻留于常规RAM(随机访问存储器)区域,可通过它的“栈指针”获取处理的直接支持。栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在栈里(特别是对象句柄),但Java对象并不妨到其中。

JVM只会直接对JavaStack(Java栈)执行两种操作:①以帧为单位压栈或者出栈;②通过-Xss来设置,若不够会抛出StackOverflowError异常。

1.每个线程包含一个栈区,栈中只保存基本数据类型的数据和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本数据类型的变量区、执行环境上下文、操作指令区(存放操作指令)。

栈是存放线程调用方法时存储局部变量表,操作,方法出口等与方法执行相关的信息,Java栈所占内存的大小由Xss来调节,方法调用层次太多会撑爆这个区域。

2.程序计数器(ProgramCounter)寄存器

PC寄存器(PC Register):每一个线程启动的时候,都会创建一个PC寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。每个线程都有自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

3.本地方法栈

Nativemethodstack(本地方法栈):保存native方法进入区域的地址

4.堆

类的对象存放在heap(堆)中,所有的类对象都是通过new方法创建,创建后,在stack(栈)会创建类对象的引用(内存地址)。

一种常规用途的内存池(也在RAM随机存储器区域中),其中保存了Java对象。和栈不同,“内存堆”或“堆”最吸引人的地方在于编译器不必知道从堆里分配了多少存储空间,也不必知道存储的数据要在堆中停留多久。因此用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编辑相应的代码即可。执行这些代码时,会在堆里自动进行数据的保存,当然为了达到这种灵活性,必然会付出一定的代价:在堆中分配存储空间时会花掉更长的时间。

5.方法区

method(方法区)又叫静态区,存放所有的①:类class,②:静态变量(static变量),③:静态方法,④:常量 ⑤:成员方法

1.跟对一样被所有的线程共享。

2.方法区中存放的都是在整个程序中永远唯一的元素。这也是方法区被所有的线程共享的原因。

6.运行常量池(也属于方法区的)

该区域存放类和接口的常量,除此之外,它还存放成员变量和成员方法的所有引用。当一个成员变量或者成员方法被引用时,JVM就通过运行常量池中的这些引用来找成员变量和成员方法在内存中的实际地址。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值