java - 通过方法推送对象时是否会创建对象的副本?

标签 java memory garbage-collection benchmarking heap-memory

假设我的对象状态中有一个private static Integer i = 0。假设我通过某种方法将其推送,该方法将此 i 作为参数,如下所示:pushThroughMethod(i)

i 是否被复制到堆上并有资格进行垃圾回收?

最佳答案

Java 基本类型(int、long、float 等)而非其对象对应类型(Integer、Long、Float 等)按值传递。另外,对对象的引用是按值传递的。但对象本身是通过引用传递的。

因此,如果您使用对象 O 调用方法 x(),则:

O o = new O(); // Create an O on the heap, put a reference to it on the stack

x(o); // Pass a copy of the reference into x, the reference still points to O

X 内部:

void x(O o) {
    // o is a separate reference, so if you do o = null; it does not chance the reference in the calling function.
    // but the o itself is shared, so if you do o->doSomething() the calling function will be able to see the results of doSomething().
}

在您的示例中,当您调用 pushThroughMethod(i) 时,会创建对 i 的新引用,但它指向相同的 Integer >.

i 只有在所有强引用都消失后才有资格进行垃圾回收。在这种情况下,即使当pushThroughMethod()删除它对i的引用时,静态引用也将保留并阻止收集。

关于java - 通过方法推送对象时是否会创建对象的副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21040409/

相关文章:

java - 等待两个 Observable 完成后再继续?

java - 如何一起使用 mapstruct 和 springboot bean? @autowired

c# - 更好的 Dispose 方法(通过 ComponentModel.IContainer ??)

java - 数据库对象在没有先关闭的情况下被GC释放

java - 为什么这会抛出InputMismatchException?

java - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException :3

c++ - SDL_Renderer 使用 100% CPU 和 RAM 什么也不做

c++ - 如何确定 C++ 应用程序中的可用 RAM 量?

c# - IsDisposed 是如何工作的?

java - Java 中的对象分配和 GC 行为