Java对象内存分配简记

Java对象内存分配

Java在运行时,会对对象的不同部分进行内存分配,这里进行一个简单的分析。

  1. 寄存器

寄存器作为计算机中I/O操作最快的内存区域,弊端是容量很小,因此开发者不能直接控制寄存器,Java程序开发中也不会在这上面进行操作。

  1. 堆栈(stack)

平常就称其为堆,位于RAM中,但通过堆栈指针可以直接获取变量引用,堆栈指针如果向下移动,则会分配新的内存,如果向上移动,则会释放那些内存(速度仅次于寄存器)。创建Java程序时,Java系统知道所有项的生命周期,以便于指针的上下移动。

类似于
String str = null;
中的str变量将会存储与堆栈中

  1. 堆(heap)

用于存放所有的Java对象

new String();

根据如何确定JVM堆中哪些对象是可以被回收的一文中分享

垃圾回收器在对堆进行回收之前,需要确定堆中哪些对象是可以继续存活的,哪些是可以被回收的,Java采用可达性分析算法来判定对象是否可以继续存活。

这个算法的过程是通过一系列的称为“GC Roots”的对象作为起点,从这些起始点开始向下搜索,搜索过程中所有走过的路径称为引用链,当一个对象和引用链没任何连接的时候,则表明这个对象是可以被回收的。

当在执行堆中的对象代码的时候,Java会在堆中自动进行存储分配。(显然,在堆中执行操作将会比在堆栈中花费更多的时间)

  1. 常量存储

一个基本的例子是字符串对象中,常常会提到常量池这个概念,类似于

String str = "abc";

这样的字面量,"abc"将会存储在常量池中(直接存储在程序内部,永远不被改变)。

  1. 非RAM存储

一个基本的例子是I/O流操作,将Java程序中在内存中操作的数据通过流传输到硬盘上,进行永久性存储。


对象利用结束后的清理工作

Java在对象利用之后,会对已经废弃的对象进行垃圾回收,这个过程通过GC(Garbage Collection)机制进行,无需程序员手动管理,但是除开 new 的对象,还有一块特殊的内存区,对于它们,程序员可以用 finalize()方法,在GC之前,Java会先执行它,因此程序员可以在GC前做一些预备工作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值