1

我读过一篇文(对不起,它是用中文写的),作者说:

这是一个与网络相关的应用程序,我们声明了一些私有变量,当用户进行一些操作时,这些变量将被设置为一些值以供以后使用。

通常应用程序运行良好,但是当我们打开一些使用大量 JavaScript 的网站时,我们的应用程序开始出现异常和意外(没有任何 Activity 切换),我们找不到原因。

最后,我们发现这是由一个整数变量被设置为零引起的。但是我们很确定我们的代码不会把它重置为零,所以只有一个可能的结论:“为了满足WebView所需的资源,Garbage Collector已经收集了我们的变量”。所以最后我们设置声明这个变量为静态变量来避免这个问题。

坦率地说,这个“GC 将 int 设置为零”的论点与我的 Java 知识完全相反。

因为据我所知:

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

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

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

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

1 回答 1

7

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

如果持有intorInteger本身的对象被垃圾收集并随后由应用程序代码重新创建,那么外部看起来intorInteger已被重置。

否则,没有。

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

仅当您使用诸如WeakReference与“部分空间”的连接之类的东西时。

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

不,如果你能到达它,它就不能被垃圾收集。

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

时空连续体将发生破裂,结束我们所知道的现实。

于 2012-04-19T15:23:37.193 回答