如何避免java对象被jvm回收?

如何避免java对象被jvm回收?
如何避免java对象被jvm回收?
如何避免java对象被jvm回收?

你这个问题很刁钻,但我不知道它有什么价值。我们可以反向思考,jvm 不会回收哪些对象。 我能想到的是将对象保存在静态变量中或使用单例模式,可以确保JVM不会在对象不被引用时回收它。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/745913
  • 这篇博客你也可以参考下:JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
  • 除此之外, 这篇博客: Java 虚拟机中的 04、JVM是如何执行方法调用的? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 重载与重写
    重写发生在父类子类之间,比如所有类都是继承与Object类的,Object类中本身就有equals,hashcode,toString方法等.在任意子类中定义了重名和同样的参数列表就构成方法重写.

    重写(override):一般都是表示子类和父类之间的关系或接口与实现类,其主要的特征是:方法名相同,参数相同,但是具体的实现不同。

    重写的特征:

    (1):方法名必须相同,返回值类型必须相同

    (2):参数列表必须相同

    (3):访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。

    (4):子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。

    (5):构造方法不能被重写

    重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数列表,参数的类型有关.

    重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不同。

    (1):方法名必须相同

    (2):方法的参数列表一定不一样。

    (3):访问修饰符和返回值类型可以相同也可以不同。

    其实简单而言:重载就是对于不同的情况写不同的方法。 比如,同一个类中,写不同的构造函数用于初始化不同的参数。

    1. 虚方法调用
    Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用都会被编译成 invokeinterface 指令。这两种指令,均属于 Java 虚拟机中的虚方法调用。

    2. 方法表
    类加载的准备阶段,它除了为静态字段分配内存之外,还会构造与该类相关联的方法表。

    这个数据结构,便是 Java 虚拟机实现动态绑定的关键所在。

    方法表本质上是一个数组,每个数组元素指向一个当前类及其祖先类中非私有的实例方法。

    方法表满足两个特质:其一,子类方法表中包含父类方法表中的所有方法;其二,子类方法在方法表中的索引值,与它所重写的父类方法的索引值相同。

    但实际上仅存在于解释执行中,或者即时编译代码的最坏情况中。这是因为即时编译还拥有另外两种性能更好的优化手段:内联缓存(inlining cache)和方法内联(method inlining)。下面我便来介绍第一种内联缓存。

    3. 内联缓存
    内联缓存是一种加快动态绑定的优化技术。它能够缓存虚方法调用中调用者的动态类型,以及该类型所对应的目标方法。在之后的执行过程中,如果碰到已缓存的类型,内联缓存便会直接调用该类型所对应的目标方法。如果没有碰到已缓存的类型,内联缓存则会退化至使用基于方法表的动态绑定。
    单态(monomorphic)指的是仅有一种状态的情况。

    多态(polymorphic)指的是有限数量种状态的情况。二态(bimorphic)是多态的其中一种。

    超多态(megamorphic)指的是更多种状态的情况。通常我们用一个具体数值来区分多态和超多态。在这个数值之下,我们称之为多态。否则,我们称之为超多态。

  • 您还可以看一下 徐无忌老师的Java进阶高手课-深入JVM虚拟机课程中的 什么是JVM类加载器机制和双亲委派模型?小节, 巩固相关知识点