JVM怎么清理栈中的引用

「已注销」 2008-10-21 10:02:27
JVM的垃圾回收机制什么时候清理栈中对象引用

我知道它在需要的时候会自动清理堆中的对象所占的空间,但栈中的对象引用虽不占多少空间但存在也确实浪费资源,系统什么时候清理?怎么清理?

栈是先进后出的,如果垃圾是在非垃圾的下面,这块垃圾什么时候清理?
...全文
507 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sunny_kaka 2008-10-22
  • 打赏
  • 举报
回复
高手真多,学习了
ZangXT 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 yinyuan1987 的回复:]
首先:
在第7行:将main()置于栈上
第9行:在栈上创建引用变量d,但Dog对象尚不存在,
第10行:创建新的Dog对象,并将其赋予d引用变量。
第11行:将引用d的一个副本传递给go()方法
第13行:将go()方法置于栈上,并将dog参数作为局部变量
第14行:在堆上创建新的Collar对象,并将其赋予Dog的实例变量
第17行:将setName()添加到栈上,并将dogName参数作为其局部变量。
第18行:name实例变量现在也引用String 对象。

注意…
[/Quote]
不是把方法放在栈上,而是创建一个方法的frame,供当前的方法使用。
参考一下编译原理
「已注销」 2008-10-22
  • 打赏
  • 举报
回复
问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?
  • 打赏
  • 举报
回复
楼主根据上面的例子理解一下,
可是我一行一行敲的啊!
  • 打赏
  • 举报
回复
首先:
在第7行:将main()置于栈上
第9行:在栈上创建引用变量d,但Dog对象尚不存在,
第10行:创建新的Dog对象,并将其赋予d引用变量。
第11行:将引用d的一个副本传递给go()方法
第13行:将go()方法置于栈上,并将dog参数作为局部变量
第14行:在堆上创建新的Collar对象,并将其赋予Dog的实例变量
第17行:将setName()添加到栈上,并将dogName参数作为其局部变量。
第18行:name实例变量现在也引用String 对象。

注意:两个不同的局部变量引用相同的Dog对象。
一个局部变量和一个实例变量都引用相同的String Aiko

第19行执行完之后(name=dogName;这句)将会完成并从栈中清除。
此时局部变量dogName也会消失,尽管它引用的String 对象仍在堆上

下面把栈的存储说下:
从栈顶到栈底依次为:
setName() dogName
go() dog
main() d
堆的图不好画,显示不出来就省略了!
  • 打赏
  • 举报
回复
栈顶指针依次向栈底移动,当前栈顶的数据就认为不在栈里了。
我给楼主举个例子吧(多给分哦,呵呵)

class Collar{}

class Dog{
Clollar c;
String name;

public static void main(String[] args){
Dog d;
d=new Dog();
d.go(d);
}

void go(Dog dog){
c= new Collar();
dogs.setName("Aiko");
}

void setName(String dogName){
name = dogName;

}

}



下面解释,代码在后台,堆和栈的存储及清楚方式:
tiyuzhongxin789 2008-10-22
  • 打赏
  • 举报
回复
什么时候回收垃圾不是固定的 对象的生命周期结束了 理论上是随时都会被回收的
Yanbin_Q 2008-10-22
  • 打赏
  • 举报
回复
栈中的数据你不用考虑,这是由栈数据结构决定的,生命结束自动清除

Java 的操作是基于栈的,而是基于寄存器的,一个简单的道理,如果栈中的数据得不到自动清理,那么程序是无法继续执行了
ZXEOC 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xdbjzhhh 的回复:]
问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?
[/Quote]
你先想想,会不会出现栈顶数据还有用,但是栈中间的数据却没用的情况
ZangXT 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xdbjzhhh 的回复:]
问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?
[/Quote]
栈顶指针向栈底移动一下,当前栈顶的数据就认为不在栈里了。不需要再提供专门的删除机制。
「已注销」 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 xdbjzhhh 的回复:]
引用 28 楼 ZXEOC 的回复:

引用 24 楼 xdbjzhhh 的回复:

引用 16 楼 ZXEOC 的回复:
引用 14 楼 xdbjzhhh 的回复:

问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?

你先想想,会不会出现栈顶数据还有用,但是栈中间的数据却没用的情况


我就是这个意思,栈中间的数据没用怎么删>

唉,论坛发贴没法带语气,楼主,我是让你想想什么情况才能出现栈顶数据有用,中间的数…
[/Quote]


错了错了,谢谢各位了啊

明白了

「已注销」 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 ZXEOC 的回复:]
引用 24 楼 xdbjzhhh 的回复:

引用 16 楼 ZXEOC 的回复:
引用 14 楼 xdbjzhhh 的回复:

问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?

你先想想,会不会出现栈顶数据还有用,但是栈中间的数据却没用的情况


我就是这个意思,栈中间的数据没用怎么删>

唉,论坛发贴没法带语气,楼主,我是让你想想什么情况才能出现栈顶数据有用,中间的数据却没用的情况,你能举个例子…
[/Quote]


栈有几个,应该是一个吧(个人猜的)

如果你在一个方法里建了几个对象,而只把最后那一个对象返回了,前几个对象生存期到就完了,而最后建的那个还得用,

这样就造成中间是垃圾的情况吧
「已注销」 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 ZangXT 的回复:]
引用 24 楼 xdbjzhhh 的回复:

引用 16 楼 ZXEOC 的回复:
引用 14 楼 xdbjzhhh 的回复:

问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?

你先想想,会不会出现栈顶数据还有用,但是栈中间的数据却没用的情况


我就是这个意思,栈中间的数据没用怎么删>

没用放到栈里干什么?
[/Quote]

晕,用过了,不用了,
时光瞄 2008-10-22
  • 打赏
  • 举报
回复
有点迷糊了。。。
ZXEOC 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 xdbjzhhh 的回复:]
引用 16 楼 ZXEOC 的回复:
引用 14 楼 xdbjzhhh 的回复:

问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?

你先想想,会不会出现栈顶数据还有用,但是栈中间的数据却没用的情况


我就是这个意思,栈中间的数据没用怎么删>
[/Quote]
唉,论坛发贴没法带语气,楼主,我是让你想想什么情况才能出现栈顶数据有用,中间的数据却没用的情况,你能举个例子吗?
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ZangXT 的回复:]
引用 20 楼 yinyuan1987 的回复:
首先:
在第7行:将main()置于栈上
第9行:在栈上创建引用变量d,但Dog对象尚不存在,
第10行:创建新的Dog对象,并将其赋予d引用变量。
第11行:将引用d的一个副本传递给go()方法
第13行:将go()方法置于栈上,并将dog参数作为局部变量
第14行:在堆上创建新的Collar对象,并将其赋予Dog的实例变量
第17行:将setName()添加到栈上,并将dogName参数作为其局部变量。
第18行:na…
[/Quote]
对,企鹅兄说的更准确一点,(学习了)
我是让楼主看栈的存储情况更详细点,呵呵,谢谢企鹅兄了
ZangXT 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 xdbjzhhh 的回复:]
引用 16 楼 ZXEOC 的回复:
引用 14 楼 xdbjzhhh 的回复:

问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?

你先想想,会不会出现栈顶数据还有用,但是栈中间的数据却没用的情况


我就是这个意思,栈中间的数据没用怎么删>
[/Quote]
没用放到栈里干什么?
omitlian 2008-10-22
  • 打赏
  • 举报
回复
finalize() 自动回收!!
至于什么时候回收,我们一般不会关注这个问题,一般的在CPU相对空闲或者资源不够的情况下,其会回收!!
「已注销」 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ZXEOC 的回复:]
引用 14 楼 xdbjzhhh 的回复:

问的有问题了,应该是

如何删除栈中的数据??
栈的内存分配是移动栈顶的指针,但栈中间的数据怎么删?

你先想想,会不会出现栈顶数据还有用,但是栈中间的数据却没用的情况
[/Quote]

我就是这个意思,栈中间的数据没用怎么删>
jxxx2967 2008-10-21
  • 打赏
  • 举报
回复
JAVA实现的栈和其它语言的栈有很大的区别。

JAVA虚拟机的所有所有运算是基于栈结构,其它真实的机器是基于寄存器的。

JAVA中所有对象空间都是动态分配的。

分配对象空间可以全部在堆中分配,也可以全部在栈中分配,或者有的在堆中,有的要栈中。

取决于具体的虚拟机实现。

所以,所谓的栈中的对象其实和堆中的对象没有什么区别。
加载更多回复(12)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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