当前位置: 代码迷 >> J2SE >> java虚拟机内存回收 先回收堆,又回收栈?
  详细解决方案

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

热度:134   发布时间:2016-04-23 20:14:37.0
java虚拟机内存回收 先回收堆,再回收栈????
今天看到一朋友空间更新的一说说.很奇怪,想看看大家的见解,

原文:

今天游戏线上报了一个bug,空指针异常,分析到最后只可能是传递的一个对象为空了,但是我很确定这个对象是已经赋值了,然后感觉特别莫名其妙,然后再分析,得出结论,造成这种现象的原因只可能是因为此对象驻存内存已久,栈里面虽然还保留有该对象的引用,但是堆里面真的内容却被java虚拟机给回收了,所以导致该对象为空了,哇,都分析到这里面来了,好高深,又相当于把java内存机制理了一遍……
------解决思路----------------------
栈中存有堆中对象的引用地址,这个堆对象不会被标记为'垃圾'
------解决思路----------------------
 不明觉厉 
之前看过深入理解JVM,但没有自己的理解,自己也没理解多少东西。
JVM回收内存有自己机制,绝对不会根据对象在内存中驻留长短来清理对象的,否则服务启动时加载到缓存的数据都早被清了
应该还是代码不够健壮造成的
------解决思路----------------------
猜测也要有理论支撑不能瞎猜啊。
估计是并发访问没处理好。
前些天看到的类似的问题那个叫高深,有关Java内存模型,JIT编译器对指令重排序使得并发访问下可能读先于写,造成读数为0,解决方法是加内存栅栏。
------解决思路----------------------
2楼的说法有问题:
1.只要强引用存在对象就不会被回收;
2.软引用和弱引用存在,对象也可能会被回收,软引用指向的对象是在发生内存溢出之前被回收,
    弱引用指向的对象是在垃圾收集器工作时被回收;

楼主可以了解一下强引用、软引用、弱引用、虚引用的区别和使用的场景;
------解决思路----------------------
今天刚学了,对象实例化后对象的引用,局部产(栈中)的就消失了,堆中仍然存在
  相关解决方案