解决方案 »

  1.   

     不明觉厉 
    之前看过深入理解JVM,但没有自己的理解,自己也没理解多少东西。
    JVM回收内存有自己机制,绝对不会根据对象在内存中驻留长短来清理对象的,否则服务启动时加载到缓存的数据都早被清了
    应该还是代码不够健壮造成的
      

  2.   

    猜测也要有理论支撑不能瞎猜啊。
    估计是并发访问没处理好。
    前些天看到的类似的问题那个叫高深,有关Java内存模型,JIT编译器对指令重排序使得并发访问下可能读先于写,造成读数为0,解决方法是加内存栅栏。
      

  3.   

    今天游戏线上报了一个bug,空指针异常,分析到最后只可能是传递的一个对象为空了,但是我很确定这个对象是已经赋值了,然后感觉特别莫名其妙,然后再分析,得出结论,造成这种现象的原因只可能是因为此对象驻存内存已久,栈里面虽然还保留有该对象的引用,但是堆里面真的内容却被java虚拟机给回收了,所以导致该对象为空了,哇,都分析到这里面来了,好高深,又相当于把java内存机制理了一遍……
    上面变红的部分真心醉了,可以好好看看《Java编程思想》和《Java7虚拟机规范》这两者对这个问题有很详细的描述,Java垃圾回收机制是不会回收堆空间上哪些被引用着的对象的,不管它何时被声明的。确保初始化是赋值了却出现空指针异常,只能说明在代码中的每个地方将引用置空了(=null)自己却没有发现。
      

  4.   

    不指为空或者system.gc去强制回收堆内存应该是不会被回收的,是不是别的对象引用了 它的地址呢
      

  5.   

    lostlock说的对,有引用不会被回收(循环引用除外)
      

  6.   

    不可能,栈是立即回收,所有的C系语言,包括python、Js等等动态语言都是立即回收。
      

  7.   

    服了楼主了,如果jvm设计成这样还能用吗,jvm有严格的算法来判定堆里的对象是否“无用”,熟悉的有“根搜索算法”,“对象引用算法“,就算判定无用,还不回立即回收,还有个逃逸机制,一个对象确定死了,跟一个人死了一样,在垂死之前还要挣扎很久的,没你想的那么容易。空指针异常就是没有初始化导致的,要么没有初始化,要么置空了。顺便普及一下,栈里面的空间是分配了多个栈帧,每个栈帧进栈和出栈对应的是一个方法进入和退出,当出栈的时候空间自动释放,所以不管是jvm栈还是本地方法栈都是不需要去关注内存释放的问题的。