Think in Java之内存分配

语言: CN / TW / HK

theme: channing-cyan

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

程序运行时,对象如何安置,内存如何分配?

寄存器

该区域是最快的存储区域,该位置位于处理器内部,但是数量并不是很多,C和C++允许向编译器建议寄存器的分配方式

堆栈

该内存区域位于RAM中,通过堆栈指针可以从处理器获取直接支持。分配内存的方式为控制堆栈指针上下移动,向上移动代表释放内存,向下移动代表分配新的内存。这种分配方式仅次于寄存器分配。这也限制了它的灵活性,JVM必须对存贮在该区域的对象知道他们确切得生命周期,以便销毁释放内存供其他内存使用,该地方存储的对象引用,而不是对象本身

也位于RAM区,该部分地方存放的就是Java对象了。堆区别于堆栈的一个点是:堆不需要了解存储在该区域对象的生命周期,因此提高了程序的灵活性。创建对象的方式是通过new 操作符来创建的,编译器自动存储分配该对象的内存,灵活性带来的代价是其运行时的分析导致效率变慢,其需要分析哪部分对象是无用对象哪部分对象是有用对象,在JVM中是采用的GC Roots的做法,如果一个对象引用的为Roots对象那么这个对象就不是垃圾对象,Roots是Java所定义的;还有一种方式是用引用计数器的方式,这个对象被引用一次就加1,引用释放就减1,不仅要维护这个变量而且还要考虑循环引用的情况

常量存储

常量对应的为变量,常量不会改变,因此将常量的值直接放在程序内部是安全可信的。在嵌入式系统中,存储常量的部分会和其他部分区别开,存在于ROM中(例如字符串处常量池)

## 非RAM存储 该部分区域存活于程序之外,在程序没有运行时也可以存在。比如流对象和持久化对象。 流对象:对象转换为字节流,发送给另外一台机器。 持久化对象:存放与磁盘上。

把对象转换为可以存放在其他媒介上的事务