我的意思是java应概提供垃圾自动机制,又提供手工释放,这岂不是更好?
解决方案 »
- 求高手相助,二次曲线与二次曲线的求交算法。
- 关于数据小数位数的四舍五入及小数位数的截断做法
- Text换行
- 请教数据类型如何判断。。。。
- 如何使用 GridBagConstraints 的几个格子来显示一个控件
- 如何 实现 如同jcreator pro3.04 那种窗体
- 请教高手(急)
- 用java写木马程序怎么运行??
- crash-safe 是什么
- 请各位高手帮助,在下有礼了 我自已写了一类似于画图板的工具,可以选择颜色,线条的宽度,可是我上面画的时侯没有问题,可是一改变IE的大小,或者有一个新的窗口覆盖在这个应用上面,在关闭覆盖的窗口,我所画的图形都不见了,请各个高手帮忙,谢谢!
- 异常问题
- 急,急,急呀,怎么把金额大写转换成小写的呀,有那位高手在呀,在线等,高分求助。。。
这句话难理解,并且有点勉强。java跨平台是他的思想,为什么它又提供本地代码模式?
我想主要是因为那样实现起来会很复杂。也可能是因为java设计者认为你已经习惯了自动释放对象了,而且自动释放也能达到运用级的要求,已经不想再去搞手动释放了。
System.gc();
这个是不是立即执行垃圾回收?也就是手工释放么?
TO AiQun(爱麇)
所谓对象应该在他需要被释放的时候就会自动释放,乃是JAVA设计思想之一,JAVA的安全性思想希望你能更多的忘记对象生成与释放的细节而更加关注于实体的工作。所以就像对象的封装性一样,JAVA同样希望籍以封装对象在内存中的一些底层实现而方便大多数的程序员。
但同时我也需要更正自己先前的言论,就是无论JVM在底层的封装性上做得多么完备都无法解决许多特殊的内存释放情况,所以在此你可以调用诸如xxx.close()函数(某些对象有的话,比如File,Connection,Statment对象),并将其至于try-catch-finally块中加以强行调用。
但是最后我们还是得明白,对对象底层的操作确实不是诸如JAVA、C#之类的面向对象的语言所要关注的重点,所以除了异常等可能导致内存隐秘泄露的场所,在大多数情况下他们并不会被特别关注。@.@||~
在另一段代码使用了classA,在classA不使用的时候,我们必须得调用classA.close()吧?如果我们忘记了调用classA.close()呢?会造成什么后果?
如果java提供了手工释放,我们就会省了多写一个close().就算我们忘记了手工释放也有自动释放顶上。我觉得这种模式对程序员来说省了不少事。
...那如果阁下忘了调用close() method 呢?
C++群体中有一个笑话,那就是“是的,我已经在所有该关闭他们的地方,做了稀释”,可糟糕的是在一个并不算大的中小型项目中,忘记在必要时刻调用释放函数都是稀疏平常的事(这就是我说的手动释放对象是许多隐蔽错误的根源),原因是我们编写的是应用域的代码,但稀释则属于解决域的特殊问题,我们当然更加关注于真正需要解决的问题,并由于我们不是万能的上帝而遗漏了许多东西,fire fox的创始人说,如果要吹毛求疵,世界上恐怕只有Hello world才可能没有BUG。
JAVA 从创始开始的一个理念就是要提高程序员的编程效率以及尽可能的自动化降低错误的产生,少写一个CLOSE,多写一个CLOSE,不过是2秒钟的事情,但手工释放对象为此遗留的隐患却可能导致在测试与维护周期中投入大量人力、物力与时间成本(却仅仅是因为几个内存泄露问题),你可以想象在100行代码中找出一个这样的问题已经让你有点感觉麻烦了,更不要说有3、4层结构,7、8个子系统,几十个类组成的类库,以及成千上万行的代码中去找寻一个对象释放问题,如果您有兴趣到可以尝试一下,我想这样您就能明白节省时间成本的概念不是在代码编写过程,而恰恰是在测试与维护的过程中了,呵呵。@.@||~
毕竟,内存不够了,才几毛钱一兆,而通常对于一个项目,开发人员能够节省哪怕一天的时间,这笔钱就省出来了。你可以算算一个小组如果每一个项目都能省一天,一年做这样的3个项目,省下来的员工薪水可以买多少内存。更何况,Java所带来的开发效率的提升对于特别是企业级的项目来说,所节省的时间还不止一天,而且所节省的也远远不只开发期的成本。
当然,最终要看项目的性质,也又好多场合不适合用Java开发,比如单片机、3D引擎等等。那也是因为在这些场合,资源效率对效益的影响远大于开发效率。
那么再又一些需要,本身极其接近底层,无法要求产品的用户都必须先装JVM,或者根本不现实,比如磁盘的驱动,那就更不能采用Java开发了。