社区
Java EE
帖子详情
在Java编程中,有必要在一个对象完成工作后,用obj = null;吗?
xiaoyue_yu
2003-10-16 02:48:38
和java中自动垃圾回收有什么关系呢?
...全文
91
10
打赏
收藏
在Java编程中,有必要在一个对象完成工作后,用obj = null;吗?
和java中自动垃圾回收有什么关系呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
swinging
2003-10-17
打赏
举报
回复
另外说一点,对object=null操作后,不一定是会使对象被回收的,
对象是否被回收是看一个对象是否还有引用指向它,如果你将对象的引用置为null,
而这个对象还有其它引用在引用它,那么你这么做基本就没有任何意义了,
而且还在程序上给人困扰,因为你使一个变量具有多重意义,
在你不经意的时候,很可能会在将这个变量置为NULL后又使用它(因为开始时这个变量
确实是指向你需要的对象的,所以你后来还用它,而忘了自己中途把它置为NULL了),
于是BUG就爬出来了。
swinging
2003-10-17
打赏
举报
回复
我觉得你们(楼上所有的)思路有问题。
其实如果一个OBJECT使用完了,需要NULL下了,不如让它就在此OVER,
就是说,尽量在使该OBJECT的引用的生存空间只有使用它的那么大,
一个对象引用在使用是一般是最好不用来反复通过赋值指向不同对象的,
这样变量的意义更确定一些,有助于程序的清晰,
因此一旦不使用该对象引用的对象时,最好是同时使这个引用也被丢弃,
给个简单例子:
假设有一个List list,
当使用迭代器遍历它时,最好能这样:
for(Iterator iter = list.iterator; iter.hasNext();) {
// do something
}
这样的话,变量iter的生存空间就只在使用它的范围内,一旦程序流程跑出了循环,那么这个引用就被丢弃了。
一般我们很习惯这样的写法:
Iterator iter = list.iterator;
while(iter.hasNext()) {
// do something
}
其实两个好像没有什么本质区别,最大不同就是变量iter的生存空间不同,
象楼主说的,在使用完后置iter=null,即:
Iterator iter = list.iterator;
while(iter.hasNext()) {
// do something
}
iter=null;
肯定不如上面使用FOR循环来得简洁,而且这里并没有丢弃变量iter,而实际iter将不再被使用了的。
umeshu
2003-10-17
打赏
举报
回复
虽然楼上说的有一定的正确性,但null一下还是有助于垃圾回收得以正确执行的。
songsd
2003-10-17
打赏
举报
回复
object = null有时候很有用,有时候一点用也没有,纯粹是浪费cpu,浪费读你代码人的感情(这点我深有体
会了),object = null的语句的目的是让某个对象的引用数为0,这样的话,当垃圾回收线程运行时候,会将该
对象占用的资源释放,使该对象真正的消失。理解这个目的再加上对变量作用域的理解,就很容易知道什
么时候该用,什么时候不该用了。
这里举几个例子
比如有个方法
void method1()
{
List l= new ArrayList();
向l中加入10000个对象;
使用或处理l; //到此l已经使用完毕
methodX(); //methodX()需要长时间执行;
}
对于这种情况,显然需要执行l = null;否则假如最后执行methodX(); ,执行了很长时间,这段时间gc执行
了好多次,但是l引用的对象一直却得不到释放,于是造成了白白的内存浪费,显然这样的代码不是最好
的。
假如后面的mehodX()换成了执行时间很短的代码(即使很多行),那就没有必要执行l = null了。
是不是需要使用l=null需要衡量的是,l是否占用足够多的内存空间。2,使用完后,l作用域范围内还需要执行的时间。3,使用l = null会使代码看起来很别扭。
再举一个不需要执行 "=null"的例子
method2()
{
.....
for(int i = 0;i<n;i++)
{
MyClass m ....
process(m);
m=null;
}
.....
}
littlecpu
2003-10-17
打赏
举报
回复
只要你的函数原子性足够细,那有这些烦心事
littlecpu
2003-10-17
打赏
举报
回复
放屁
happyegg
2003-10-16
打赏
举报
回复
null一下没有用的,java中的垃圾回收是自动完成,自己null一下,内存还是不会释放的
Mars_wx
2003-10-16
打赏
举报
回复
觉得还是null一下
zeeler
2003-10-16
打赏
举报
回复
java中的GC可以自动回收作废类的对象,但是只回收Heap中存储的对象,所以在java编程中尽量都使用new来生成对象,例如: String hello = new String("");
另外,还要注意GC回收的标准是Heap中的对象没有相关的reference指向它,具体的内容请参考《Java编程思想(第二版)》
xiaoyue_yu
2003-10-16
打赏
举报
回复
up
基于Web的酒店客房管理系统的设计与实现+论文+开题
管理员模块功能分析 对于管理员而言,一个好的管理系统总是能让酒店的管理
工作
事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住...
iOS开发之
Obj
ective-C
编程
基础
本系列课程视频提供iOS培训之
Obj
ective-C基础视频,第一个
Obj
-C程序 Hello world,面向
对象
编程
,面向过程
编程
,类和
对象
,self使用详解, property基础,synthesize基础,propertyNam,Property的setter和getter,...
OpenGL专题课程-模型与骨骼动画精讲
目前很多公司已经开始构建自己的底层图形引擎,其
中
动画就是重要的一个版块,本课程可以让学员从原理层面以及底层代码层面了解FBX、
OBJ
模型的读取本质,并且梳理程序架构,编写骨骼动画。 2 课程解决优势: 很多同学...
飞歌G6IV刷机包,恢复出厂解决车机问题
飞歌G6IV刷机包,恢复出厂解决车机问题
人工智能大作业-无人机图像目标检测.zip
无人机最强算法源码,易于部署和学习交流使用
Java EE
67,513
社区成员
225,878
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章