JAVA储存,JAVA存储

一、java程序运行时数据保存的位置,内存分配位置

寄存器(register): 位于处理器内部(距离近),保存数据最快,数量有限,编译器分配,和我们代码关联较少

堆栈(stack ):位于常规RAM(Random access memory)区域 ,是一种有效的快速的数据保存方式,仅次于寄存器。可通过“堆栈指针”获得处理的直接支持,栈顶可以向下生长(向低地址),也可以向上生长,对应的栈顶指针加一减一(上下移动)代表内存的新建和释放。创建新程序时,JAVA编译器必现准确知道堆栈内保存的所有数据的“长度”和“所在时间”,以便生成相应的代码,这限制的程序的灵活性。

每一个线程都包含一个栈区,保存这基本数据类型的值和对象的引用(数据都是私有的,其他栈不能访问),储存的局部变量也存在栈中。当一段代码或者一个方法调用完毕后,栈中为这段代码所提供的的基本数据类型或者对象的引用会立即被释放。

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

堆(heap): 位于常规用途的内存池(也在RAM中),其中保存了Java对象。编译器保存数据时不需要知道从堆里分配了多少内存空间,也不必知道存储的数据保留多长时间,存储时,灵活性高,但花费时间长。

堆中存放的都是new出来的对象,每个对象都包含一个与之对应的.class文件,凡是new出来的对象都存放在堆中,堆中不存放基本类型和对象引用,只存放对象本身。非静态成员变量在类的实例化时开辟空间并初始化,所以类的非静态成员变量也放在堆中。于堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理。

整个堆区划分为新生代和老年代;新生代又被划分成Eden 空间、 From Survivor 和 To Survivor 三块区域。我们把Eden : From Survivor : To Survivor 空间大小设成 8 : 1 : 1 ,对象总是在 Eden 区出生, From Survivor 保存当前的幸存对象,To Survivor 为空。一次 gc 发生后:

1)Eden 区活着的对象 + From Survivor 存储的对象被复制到 To Survivor ;

2) 清空 Eden 和 From Survivor ;

3) 颠倒 From Survivor 和 To Survivor 的逻辑关系: From 变 To , To 变 From 。

可以看出,只有在 Eden 空间快满的时候才会触发 Minor GC 。而 Eden 空间占新生代的绝大部分,所以 Minor GC 的频率得以降低。当然,使用两个 Survivor 这种方式我们也付出了一定的代价,如 10% 的空间浪费、复制对象的开销等。

静态存储(static):这里的静态是指“位于固定位置”(尽管也在RAM区域)静态存储里存放程序运行时一直存在的数据。可用关键字static来标识一个对象的特定元素是静态的,但JAVA本身永远不会置于静态存储空间

常数存储(constant) :常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中。

非RAM储存:数据独立于程序之外,无论程序在不在运行仍然可存在,并在程序的控制范围之外。例如 “流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常发给另一台机器。对于固定对象,保存在磁盘或硬盘中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值