关于变量的生命周期与引用计数

xiaohuh421 2016-01-11 04:39:52
在java的世界中听说一般变量的生命周期存在于代码块.
比如
void fun()
{
String str = new String("aaa"); //fun返回,则str自动释放引用.
boolean isOk = true;
if(isOk)
{
String str2 = new String("bbb"); //出花括号后str2自动释放引用
}
}

前面如果没有错, 那都好理解原理.
现在问题来了.

void fun()
{
for(int i=0; i<100; ++i)
{
String str = new String("str"+i);// str什么时候释放引用呢? 是否有内存泄漏呢?
}

String tempStr = null;
for(int j=0; j<100; ++j)
{
tempStr = new String("str"+j); //tempStr什么时候释放引用? 是否有内存泄漏呢?
}
}

在C++中, for中的临时变量, 每一次循环都会经历创建和销毁. 即如果是一个对象, 那么每次循环都会经历对象的构造和析构.
如果Java中也相同, 那么应该在第一个for循环中, str应该是每执行一次循环就释放一次引用. 每次for循环后没有任何String对象被引用. 第二个for循环内存除了最后一次外, 前面的String对象都将变成"游离对象",

请各位指点. 感激不尽. 回答的都有分

...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2016-01-14
  • 打赏
  • 举报
回复
引用 7 楼 windowsoahil 的回复:
对象引用和对象体保存在不同的内存区段,并且释放都是异步的,也就是在不被使用的情况下只是被视为”可释放“,并不一定会立刻释放
我所说的释放, 都是指释放引用计数, 即减少引用计数
xiaohuh421 2016-01-14
  • 打赏
  • 举报
回复
引用 6 楼 qyp199312 的回复:
看了半天终于看明白你上下两个代码块想表达的意思了. new 出来的是对象, 一旦这个对象没有引用, 他就游离了, 在本次循环(花括号)结尾之后, 就丢在内存里面了. 当需要gc的时候自然就回收啦...没有引用了...上面下面的都一样
关键就是在于什么时候这个new出来的对象才会没有引用. 是全部循环完后,统一释放引用? 还是每次循环完成马上释放当前new出的对象的引用? 如果每次循环加了null, 我认为肯定会释放当前new出来的对象的引用. 但如果不加null呢? 会马上释放引用吗? 或者说要等循环全部完成后才释放引用?
djszero 2016-01-13
  • 打赏
  • 举报
回复
内存空间和类对象释放都在{}结束,你每次循环都释放一次,变量在外部声明就没有在循环中释放!后面加null没什么区别
xiaohuh421 2016-01-13
  • 打赏
  • 举报
回复
有朋友不吝赐教吗
解开者 2016-01-13
  • 打赏
  • 举报
回复
对象引用和对象体保存在不同的内存区段,并且释放都是异步的,也就是在不被使用的情况下只是被视为”可释放“,并不一定会立刻释放
平菇虾饺 2016-01-13
  • 打赏
  • 举报
回复
引用 3 楼 xiaohuh421 的回复:
void fun() { for(int i=0; i<100; ++i) { String str = new String("str"+i); str=null; //加不加这句, 是否等价? 也就是说每次循环完成会不会自动释放引用? } String tempStr = null; for(int j=0; j<100; ++j) { tempStr = new String("str"+j); tempStr=null; //加不不这句是否等价? 不置null, 前面new出来的String对象的引用计数会减小吗? } } [quote=引用 2 楼 qyp199312 的回复:]
引用 1 楼 my_God_sky 的回复:
[/quote] 看了半天终于看明白你上下两个代码块想表达的意思了. new 出来的是对象, 一旦这个对象没有引用, 他就游离了, 在本次循环(花括号)结尾之后, 就丢在内存里面了. 当需要gc的时候自然就回收啦...没有引用了...上面下面的都一样
xiaohuh421 2016-01-12
  • 打赏
  • 举报
回复
void fun() { for(int i=0; i<100; ++i) { String str = new String("str"+i); str=null; //加不加这句, 是否等价? 也就是说每次循环完成会不会自动释放引用? } String tempStr = null; for(int j=0; j<100; ++j) { tempStr = new String("str"+j); tempStr=null; //加不不这句是否等价? 不置null, 前面new出来的String对象的引用计数会减小吗? } }
引用 2 楼 qyp199312 的回复:
引用 1 楼 my_God_sky 的回复:
平菇虾饺 2016-01-11
  • 打赏
  • 举报
回复
同意楼上 void fun() { for(int i=0; i<100; ++i) { String str = new String("str"+i);// 发生GC的时候释放, 每次循环 new String("str"+i)的引用 str都指向了崭新的对象, 因此此时这货已经没有强引用了, 自然而然的被回收. } String tempStr = null; for(int j=0; j<100; ++j) { tempStr = new String("str"+j); //这个跟上面哪个补上一样的么..还是我没看出来区别 } }
_南天北落 2016-01-11
  • 打赏
  • 举报
回复
这个要从作用域开始说起。 像局部变量的作用域就是他的生命周期。 比如if ,for ,switch等等这些。 出了这个结构就销毁了。 方法里的局部变量,在方法调用完就销毁。 如果是类的成员变量,在类的相应的对象销毁的时候销毁。 上面说的是普通变量,如果是静态变量的时候,从程序开始,到程序结束 前面的String对象都将变成"游离对象", 不是游离对象吧。你是指哪个变量是游离对象?

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧