JVM怎么清理栈中的引用

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

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

栈是先进后出的,如果垃圾是在非垃圾的下面,这块垃圾什么时候清理?
...全文
499 32 打赏 收藏 转发到动态 举报
写回复
用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)
一、什么是JVM  JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。二、JVM的组成我们先把JVM这个虚拟机画出来,如下图所示:从这张图我们可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互,我们再来看JVM由哪些部分组成,如下图所示:

62,612

社区成员

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

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