由于Java/Android GC,是否可能将整数重置为零?

Bri*_*Hsu 1 java android garbage-collection

我读过一篇博文(抱歉用中文写的),作者说:

这是一个与web相关的应用程序,我们声明了一些私有变量,当用户做了一些操作时,这些变量将设置为某个值供以后使用.

通常应用程序运行良好,但是当我们使用繁重的JavaScript打开某个网站时,我们的应用程序开始表现错误且意外(没有任何活动切换),我们无法找到原因.

最后,我们发现这是由整数变量设置为零引起的.但我们非常肯定我们的代码不会将其重置为零,因此只有一个可能的结论:"为了满足WebView所需的资源,垃圾收集器已经收集了我们的变量".所以最后我们设置将此变量声明为静态变量以避免此问题.

坦率地说,这个"GC设置为零到零"的论点完全违背了我的Java知识.

因为据我所知:

  1. Java GC的收集单元是对象,而原始类型int在Java中不是对象.
  2. 实例变量的生命周期与所有者对象的生命周期相同,并且当GC收集该对象时,将释放该实例变量使用的内存.
  3. 即使该变量是一个Integer对象而不是原始int因此可以被收集,只要有一个可达的引用,它就不会被收集.
  4. 即使我们使用WeakReference来存储Integer引用以使Integer对象可收集,在收集Integer对象之后,无论如何我们都无法访问已经释放的对象的内存.

但我也担心是否有一些我没有考虑过的事情.

所以我对以下问题非常感兴趣:

  1. 我有任何可能的情况,由于垃圾收集,int或Integer对象可以重置为零?
  2. 是否有可能GC只释放一个对象占用的部分内存空间(如只有一个实例变量),而不是完整对象?
  3. 是否可以引用已经被垃圾收集的对象,如果我们取消引用它会发生什么?
  4. 对于这种情况,最可能的情况是假设变量随机重置为零,而不是由它们的代码引起的.VM错误?GC错误?JIT错误或其他什么?

Com*_*are 7

我有任何可能的情况,由于垃圾收集,int或Integer对象可以重置为零?

如果对象持有intInteger本身garabage收集的,后来被应用程序代码重新创建,它似乎是,外界intInteger重置.

否则,没有.

GC是否可以释放对象占用的部分空间,而不是完整的对象?

只有当你使用的东西,如WeakReference你与"部分空间"的连接.

是否可以引用已经垃圾回收的对象

不可以.如果你能够达到它,它就不能被垃圾收集.

如果我们取消引用会发生什么?

时空连续体将会破裂,我们所知道的结束现实.