我知道 Java 是按引用传递还是按值传递的问题是死马,但我确实有一个关于内存使用的问题。
我现在对Java的理解是:
public class MyInt{
int value;
}
MyInt x;
MyInt y;
x = new MyInt(3); // value of x is now 3
y = x; // y now points to same object that x points to
y.setValue(1); // value of said object is now 1
x.getValue(); // should return 1 instead of 3
但我的问题是设置这个新的 y
需要占用多少内存?例如:如果 MyInt 的值是一些非常非常大的图像而不是整数,
x = new MyImage("very large image"); // eats memory depending on size of image
如果图像很大,自然会占用大量内存来加载该图像。我只是想确保当我打电话时
y = x; // y now points to same image that x does
y
只是对 x
已经指向的对象的引用,对吗?所以当我调用 y = x 时;只要该图像已经通过初始化x
加载,无论图像有多大,它都不会占用大量内存。
这是正确的吗?为了防止同一个非常大的图像被多次加载到内存中,我应该避免哪些陷阱?
最佳答案
是的,你是对的,任何对非原始引用变量的非原始实例赋值都只是引用赋值。
因此,如果 x 有一个内存位置(例如 mem1),那么 y=x 将使 y 指向 mem1。现在,即使 x 指向新的内存位置 mem2,y 仍将指向 mem1。所以这是一个需要避免的陷阱。
您几乎永远无法多次加载一个非常大的对象而不首先注意到它,因为您要么调用构造函数创建新对象,要么使用某种形式的clone()方法。
与大对象无关但与 Java 中的引用传递相关的一个陷阱是传递给方法的引用变量无法取消引用。
因此,假设有一个方法 dereferenceMe(MyInt x) {x = new MyInt();}
它不会更改调用者方法中 x 的实际引用。由于 Java 将按值传递引用,这意味着它会创建引用变量的副本,并将该副本传递给方法。
关于java - 在变量之间传递大数据时最大限度地减少内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34562849/