java - 在变量之间传递大数据时最大限度地减少内存使用

标签 java image memory loading pass-by-value

我知道 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/

相关文章:

java - 如何获取具有绝对路径的文件的 InputStream 并将其添加到 StreamedContent 对象以便在 p :fileDownload? 中使用它

java - 在 JavaFX 中居中裁剪图像

javascript - 如何处理 jqPlot 内存泄漏?

java - 获取线程的内存使用情况

java - 图像在处理中使用过多的 RAM

java - new 关键字在这里做什么?

java - 需要将外部jar文件复制到glassfish 3.1.2域lib目录中

java - 如何将 .WAV 音频数据样本转换为 double 类型?

php - PHP 有没有好的图像处理 API(ImageMagick 替代品)?

c++ - 如何在 C++ 中从 GDI+ 图像创建 Base64 编码的字符串?