我读过一篇博文(对不起,它是用中文写的),作者说:
这是一个与网络相关的应用程序,我们声明了一些私有变量,当用户进行一些操作时,这些变量将被设置为一些值以供以后使用。
通常应用程序运行良好,但是当我们打开一些使用大量 JavaScript 的网站时,我们的应用程序开始出现异常和意外(没有任何 Activity 切换),我们找不到原因。
最后,我们发现这是由一个整数变量被设置为零引起的。但是我们很确定我们的代码不会把它重置为零,所以只有一个可能的结论:“为了满足WebView所需的资源,Garbage Collector已经收集了我们的变量”。所以最后我们设置声明这个变量为静态变量来避免这个问题。
坦率地说,这个“GC 将 int 设置为零”的论点与我的 Java 知识完全相反。
因为据我所知:
- Java GC 的收集单元是对象,而原始类型 int 在 Java 中不是对象。
- 实例变量的生命周期与所有者对象的生命周期相同,并且当该对象被 GC 收集时,该实例变量使用的内存被释放。
- 即使该变量是 Integer 对象而不是原始 int 因此也可以被收集,只要有对它的可访问引用,它就不会被收集。
- 即使我们使用 WeakReference 来存储 Integer 引用以使该 Integer 对象可收集,在 Integer 对象被收集后,我们无论如何也无法访问该已释放对象的内存。
但我也担心是否有一些我没有考虑过的事情。
所以我对以下问题非常感兴趣:
- 由于垃圾收集,是否有任何可能的情况,int 或 Integer 对象可能被重置为零?
- GC是否有可能只释放对象占用的部分内存空间(比如只有一个实例变量),而不是完整的对象?
- 是否可以引用已经被垃圾收集的对象,如果我们取消引用它会发生什么?
- 假设变量随机重置为零,并且不是由他们的代码引起的,这种情况下最可能的情况是什么。虚拟机错误?GC错误?JIT错误或其他什么?