java虚拟机内存回收 先回收堆,再回收栈????

Magical茏 2014-09-29 05:37:00
今天看到一朋友空间更新的一说说.很奇怪,想看看大家的见解,

原文:

今天游戏线上报了一个bug,空指针异常,分析到最后只可能是传递的一个对象为空了,但是我很确定这个对象是已经赋值了,然后感觉特别莫名其妙,然后再分析,得出结论,造成这种现象的原因只可能是因为此对象驻存内存已久,栈里面虽然还保留有该对象的引用,但是堆里面真的内容却被java虚拟机给回收了,所以导致该对象为空了,哇,都分析到这里面来了,好高深,又相当于把java内存机制理了一遍……
...全文
500 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Magical茏 2014-10-12
真是众说纷纭啊
回复
kosora曹 2014-10-11
不可能,栈是立即回收,所有的C系语言,包括python、Js等等动态语言都是立即回收。
回复
张自强 2014-10-11
服了楼主了,如果jvm设计成这样还能用吗,jvm有严格的算法来判定堆里的对象是否“无用”,熟悉的有“根搜索算法”,“对象引用算法“,就算判定无用,还不回立即回收,还有个逃逸机制,一个对象确定死了,跟一个人死了一样,在垂死之前还要挣扎很久的,没你想的那么容易。空指针异常就是没有初始化导致的,要么没有初始化,要么置空了。顺便普及一下,栈里面的空间是分配了多个栈帧,每个栈帧进栈和出栈对应的是一个方法进入和退出,当出栈的时候空间自动释放,所以不管是jvm栈还是本地方法栈都是不需要去关注内存释放的问题的。
回复
AndersZhuo123 2014-10-10
看了大家的评论,我也表示一下我现在的心情: 我是醉了啊
回复
IT_ZSJ5 2014-10-07
厉害,发现自己还要学很多啊
回复
呆呆的蜗牛 2014-10-07
回复
ChangeZ_ 2014-10-07
lostlock说的对,有引用不会被回收(循环引用除外)
回复
xie_zhr 2014-10-06
今天刚学了,对象实例化后对象的引用,局部产(栈中)的就消失了,堆中仍然存在
回复
厉害
回复
java4study 2014-10-05
老师告诉我有引用指向对象,这个对象是不会被回收的,不会被定义为垃圾的。
回复
Yang_outlook 2014-10-05
厉害 越是往高处学习 越是觉得底层的东西还是有必要补!
回复
北落师门_Orz 2014-10-03
不指为空或者system.gc去强制回收堆内存应该是不会被回收的,是不是别的对象引用了 它的地址呢
回复
SerenoShen 2014-10-03
今天游戏线上报了一个bug,空指针异常,分析到最后只可能是传递的一个对象为空了,但是我很确定这个对象是已经赋值了,然后感觉特别莫名其妙,然后再分析,得出结论,造成这种现象的原因只可能是因为此对象驻存内存已久,栈里面虽然还保留有该对象的引用,但是堆里面真的内容却被java虚拟机给回收了,所以导致该对象为空了,哇,都分析到这里面来了,好高深,又相当于把java内存机制理了一遍…… 上面变红的部分真心醉了,可以好好看看《Java编程思想》和《Java7虚拟机规范》这两者对这个问题有很详细的描述,Java垃圾回收机制是不会回收堆空间上哪些被引用着的对象的,不管它何时被声明的。确保初始化是赋值了却出现空指针异常,只能说明在代码中的每个地方将引用置空了(=null)自己却没有发现。
回复
byourfan 2014-09-30
猜测也要有理论支撑不能瞎猜啊。 估计是并发访问没处理好。 前些天看到的类似的问题那个叫高深,有关Java内存模型,JIT编译器对指令重排序使得并发访问下可能读先于写,造成读数为0,解决方法是加内存栅栏。
回复
gaofuqi 2014-09-30
2楼的说法有问题: 1.只要强引用存在对象就不会被回收; 2.软引用和弱引用存在,对象也可能会被回收,软引用指向的对象是在发生内存溢出之前被回收, 弱引用指向的对象是在垃圾收集器工作时被回收; 楼主可以了解一下强引用、软引用、弱引用、虚引用的区别和使用的场景;
回复
whos2002110 2014-09-30
引用 2 楼 lostlock 的回复:
栈中存有堆中对象的引用地址,这个堆对象不会被标记为'垃圾'
+1
回复
Magical茏 2014-09-29
引用 5 楼 tengcong5210 的回复:
都分析到这个份上了,发现自己还有很长的路要走!!!!!!!!!!1
我倒觉的 我这朋友 分析进了误区
回复
血饮 2014-09-29
都分析到这个份上了,发现自己还有很长的路要走!!!!!!!!!!1
回复
蜗牛- 2014-09-29
不明觉厉 之前看过深入理解JVM,但没有自己的理解,自己也没理解多少东西。 JVM回收内存有自己机制,绝对不会根据对象在内存中驻留长短来清理对象的,否则服务启动时加载到缓存的数据都早被清了 应该还是代码不够健壮造成的
回复
Magical茏 2014-09-29
引用 2 楼 lostlock 的回复:
栈中存有堆中对象的引用地址,这个堆对象不会被标记为'垃圾'
\ 恩,说的不错
回复
发动态
发帖子
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
社区公告
暂无公告