关于Java的对象的创建和回收机制的小结
来源:互联网 发布:软件需求可行性分析 编辑:程序博客网 时间:2024/06/05 11:28
<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->
关于Java的对象的创建和回收机制的小结
1Java中对象的创建方式
平时我们写的一条创建对象的语句,如:Objecto = newObject();,就是创建了一个Object的对象,并且有o来应用这个对象,必须强调的一点是——Java是没有指针这个概念的,所以这里说的是引用。
当执行过这一条语句之后,在内存中就会出现两个位置,用于保存o和o所引用的对象,这两个地方分别是一个栈和一个堆,在栈里放的是引用o,在堆里放的是o所引用的对象,那么o是怎么引用到那个新创建的对象的呢?这里需要说明一点,其实本质上在栈里的引用变量存放的都是一串代表0或1的位,这一些位组合起来便是在堆里的对象的地址,这有点像是C语言里的指针。
如果又有一个Objecto2 =o;那么o2这个变量也会保存到栈里面,并且o2在栈里的值和o是相同的,也就是说o2和o引用的是同一个对象。但是如果有:Integeri1 = new Integer(1);和Integeri2 = newInteger(1);这两条语句,那么将会在堆里生成两个不同的对象,并且分别由i1和i2引用,也就是说这时候i1和i2内的位组成的数值时不相等的。
2Java中对象的销毁机制
Java对象的销毁机制又称作GC机制,就是垃圾回收的意思,其实在Java中的api中有提供System.gc();这个方法进行垃圾回收,但是必须说明的是System.gc();这个方法只是“建议”JVM进行垃圾回收,但是事实上JVM在调用这个代码的时候是否进行垃圾回收,那是不确定的!一般而言,JVM都会在它认为必要的时候才自动进行GC操作,所以个人认为在代码中人为的调用gc()意义不大。
怎样的对象是JVM认为可以回收的呢?其实就是没有用的对象,JVM就会认为可以回收了。而JVM对没用的对象的定义是——没有有效引用的对象!比较好理解的是没有引用的对象,就是说这个对象没有至少一个引用变量引用了,如上面所创建的o引用的Object对象,现在我们将o= null;这个时候这个Object依然不能被认为是可以GC的,因为还有一个o2在引用它,所以我们再将o2=null;这个时候,JVM可以认为这个Object对象是可以GC的了,当然前提是假设没有其它变量再引用它了,当然也得看JVM什么时候进行GC,所以在这时我们至少可以确认这个Object对象不能被我们调用了,它是否还在内存,这就是JVM做的工作了。
现在我来介绍一下什么叫做有效的引用,请看如下代码:
当23行代码执行完后,smooch和booch是否可以被GC呢?答案是可以的!这是因为虽然booch和smooch互相引用,但是我们已经无法再从外部调用这两个对象了,这就是俗称的孤岛参照,也就是无效的引用!所以JVM会在这个时候发现他们,并认定他们是可以被回收的对象。
- 关于Java的对象的创建和回收机制的小结
- java对象的回收机制
- 关于java的自动回收机制
- 对象的创建、回收、new和malloc
- 关于垃圾回收的小结
- java的回收机制
- JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- 对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制
- 垃圾回收机制(对象的回收)
- 研究垃圾回收机制,计算对象创建占用的内存
- Java的内存和垃圾回收机制
- Java的引用和垃圾回收机制
- java 内存回收和回收机制的算法
- 关于Unity3D中对象池的创建与回收
- java 对象的内存分配和回收
- Java中对象的初始化和回收
- java对象的初始化和回收
- Java对象创建和初始化过程,处理字符串的机制
- 我的子blog: http://blog.csdn.net/BBsync
- Ubuntu 10.04 安装显卡后 调整开机分辨率
- 20.13 计算一个整数的二进制表示中1的个数
- 一个单件模式的模板
- 我的积分没了
- 关于Java的对象的创建和回收机制的小结
- killzone3要进一步成为water标杆?
- 取当前行
- 视频矩阵
- ASP.NET] Session 详解
- DVR概念
- I Swear (我发誓)
- C# 通过窗口句柄获取程序运行路径 通过程序运行路径获取程序图标
- 免密码ssh设置