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

由于Java/Android GC,是否可能将整数重置为零?,java,android,garbage-collection,Java,Android,Garbage Collection,我读过一篇文章(很抱歉是用中文写的),作者说: 这是一个与web相关的应用程序,我们声明了一些私有变量,当用户 在完成一些操作后,这些变量将被设置为某个值以供以后使用 通常情况下,应用程序运行良好,但当我们使用 由于使用了大量JavaScript,我们的应用程序开始出现错误行为 意外(没有任何活动切换),我们无法找到原因 最后,我们发现这是由一个整数变量引起的 设置为零。但我们非常确定我们的代码不会将其重置为 零,所以只有一个可能的结论:“为了满足 WebView、垃圾收集器所需的资源已收集 变

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

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

通常情况下,应用程序运行良好,但当我们使用 由于使用了大量JavaScript,我们的应用程序开始出现错误行为 意外(没有任何活动切换),我们无法找到原因

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

坦率地说,这个“GC将int设置为零”参数完全违背了我的Java知识

因为据我所知:

  • Java GC的收集单元是object,而原语类型int在Java中不是object
  • 实例变量的生命周期与所有者对象的生命周期相同,当GC收集该对象时,该实例变量使用的内存将被释放
  • 即使该变量是一个整数对象,而不是原语int,因此也可以被收集,只要有对它的可访问引用,就不会被收集
  • 即使我们使用WeakReference来存储Integer引用以使该Integer对象可收集,但在收集Integer对象之后,我们无论如何都无法访问已释放对象的内存
  • 但我也担心是否有我没有考虑过的事情

    所以我对以下问题很感兴趣:

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

    如果保存
    int
    Integer
    本身的对象是收集的garabage,然后由应用程序代码重新创建,则在外部看来,
    int
    Integer
    已重置

    否则,不会

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

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

    是否有可能引用一个已经被垃圾回收的对象

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

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

    时空连续体将发生断裂,终结我们所知的现实

    有没有可能因为垃圾收集而将int或Integer对象重置为零

    如果保存
    int
    Integer
    本身的对象是收集的garabage,然后由应用程序代码重新创建,则在外部看来,
    int
    Integer
    已重置

    否则,不会

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

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

    是否有可能引用一个已经被垃圾回收的对象

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

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


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

    原因(可能)是他们在背景中的活动被破坏和重建。私有变量将保持最初的状态。@zapl:不,他们说发生这种现象时没有活动切换。然后是使用错误的对象实例或在隐藏位置将变量设置为0。重命名变量,添加一个getter/setter来打印访问权限,并检查是什么改变了它。这是一个外部错误(内存损坏、本机代码写入错误位置等)的可能性非常小,原因可能是(可能)他们在后台的活动被破坏并重新创建。私有变量将保持最初的状态。@zapl:不,他们说发生这种现象时没有活动切换。然后是使用错误的对象实例或在隐藏位置将变量设置为0。重命名变量,添加一个getter/setter来打印访问权限,并检查是什么改变了它。这是一个外部错误(内存损坏、本机代码写入错误位置等)的可能性非常小,所以请不要取消引用您不能拥有的引用!那是严肃的事!所以,请不要取消引用您不能拥有的引用!那是严肃的事!