对象的前世今生

导读:如果你只是关注上层的使用,那么你可以直接忽略此文,如果你不想做一个只会使用的盲者,就静下来倒一杯咖啡,耐心的读完此文,会有意外的收获。

Obj obj=new Obj();

    这是我们在编写java程序时经常会使用到的语句,对象的声明。声明一个对象,我们就必须对它负责,必须关注它的生命周期。我们可以控制对象何时创建,同样也可以控制对象何时销毁,销毁一个对象并不是将它化为灰烬,它是一个虚拟存在的原子,所谓的销毁其实只是我们放弃了它,当它被放弃后无情的GC(垃圾回收器)就会将它蒸发掉,回收它所占有的空间。如果已被放弃的对象不被消除掉,试想会出现怎样的结果?而对象到底存储在哪里,它又是怎样创建的,这一句简单的语句又做了哪些事情,它的整个生命周期又是如何?

1、  对象生存空间

  在猴子(程序员=程序猿)的世界里,经常会出现未将对象设置到引用实例,为此很烦恼,有经验的猴子就知道是其中的某一个对象设置为null了,问题可以很简单的就被解决掉。然而这个对象为什么会为null,它到底在哪里,我要怎么才能知道它是如何生存的。首先我们来了解两个概念堆和栈。

    栈区(stack— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。

    堆区(heap — 一般由猴子分配释放, 若猴子不释放,程序结束时可能由OS回收。

     这两种存储空间是猴子在乎的两种区域:对象的生存空间堆和方法调用及变量的生存空间栈。当java虚拟机在启动的时候,它就会从底层的操作系统中取得一块内存,并把这块内存作为java程序执行的载体。至于这块内存的取值是多少,以及猴子是否可以对其进行大小的更改等,都需要看java虚拟机和平台版本而定。通常这些事情是我们无法掌控的,如果我们的程序设计的好或许不需要对此过多的关注。

  对象生存在堆上,方法以及变量生存在栈上,我们可以试想一个很大的容器作为操作系统的内存,java虚拟机就是一个规划师,他把这个容器分成不等的区域,这个区域就是作为对象以及方法的载体,就是它孕育了对象和方法以及变量等。

2、对象创建原理

  在上节我们提到过未将对象设置到引用实例的问题,然而很多猴子都有一个通病,就是追溯根源,也就是想知道它的来龙去脉,其实这也是一种不错的学习方法,试想当你知道一个东西的来龙去脉,你还会担心它会出现各种怪异的问题嘛?兵书有云“知己知彼百战百胜”说的应该就是这个道理吧,哈哈,扯远了,回到正题。我们知道了对象的生存空间了,知道它具体在哪里,也就是它的“出生地”,现在我们更感兴趣的就是它是如何被孕育的。

图1 对象创建三部曲

       如图1,很好的说明了对象创建的过程:声明、创建、赋值。每一个对象的创建都是通过这三部进行处理。通过java虚拟机进行给对象分配空间堆进行存储,通过声明的引用变量指向具体的内存空间,最后赋值为一个对象,完成整个的创建。

       现在我们知道了对象的生存空间,也晓得对象是如何创建的,那么它又是如何的成长,到最后的消亡呢,这就需要我们关注对象的生命周期了。

3、对象生命周期

  在生活中每一个事物都有自己的生命周期,原子也不例外。而作为猴子的我们,行业会告诉我们要把每个事物都作为对象进行思考,通过等价代换,就知晓对象肯定也有自己的生命周期。那么对象的生命周期又是如何的呢?其实很简单,归结就是创建前、创建、创建后、销毁前、销毁、销毁后。

  通过上文的阅读我们知道了对象是如何创建的,那么创建后又是如何被销毁的,它是如何成长的呢?猴子们需要java虚拟机给自己一个对象,然后进行各种使用,一直到猴子们放弃这个对象,这样这个对象就过了古稀之年,也就等着上帝来招收自己,这里只是比喻,别认真,哈哈。这就是对象的成长,他的成长过程完全由猴子控制,至于猴子是如何控制,就让猴子自己去想吧。

  当一个对象到了古稀之年是不是就意味着他一定会被消灭呢,不一定然。如果该对象存储于可释放的堆上,GC(垃圾回收器)会自动的去回收,至于GC是如何回收的,这个需要了解虚拟机的原理,在此就不再赘述。而对于不在可释放堆上的资源,比如数据库的连接,这些对象就需要猴子自己去释放,否则如果堆积的对象多了,虚拟机没有释放所存在的资源,而最原始的生存空间有限,这样就会出现对象溢出,后果相当可怕,就像如果不执行计划生育,人口暴涨,地球早晚会罢工,那时……。

4、总结

  此文通过一种思想——对于各种事情都需要知道来龙去脉,这样才能很好的把控各个环节,也容易在各个环节进行自定义来对对象的生命周期进行了讲述,由于自己经验有限,文中会存在很多不足之处,希望各位读者毫不吝啬的指出。

转载于:https://www.cnblogs.com/DreamliCry/archive/2012/11/14/2769982.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值