我有一个成员MyClass
的班级float[] myArray
。我使用以下内容构建:
public MyClass(float[] initArray) {
myArray = initArray;
}
我想知道幕后发生了什么:JVM是否设置指针相同?我是否有丢失myArray
变量到垃圾收集器的风险?
最好是执行以下操作:
public MyClass(float[] initArray) {
int len = initArray.length;
myArray = new float[len];
System.arraycopy(initArray, 0, myArray, 0, len);
initArray = null;
}
我问,因为我在内存紧张的嵌入式环境中编程,我不想丢失变量(例如第一个示例)或浪费额外空间(例如,通过将initArray
设置为null,我希望GC能够处理它并让我回到RAM中。
initArray
是在其他函数中创建的局部变量会发生什么?
感谢。答案 0 :(得分:4)
JVM是否设置指针相同?
是
我是否有将myArray变量丢失到垃圾收集器的风险?
没有
只要在方法调用后不使用initArray
引用修改数组,就没有理由复制数组。
如果initArray是在其他函数中创建的局部变量,会发生什么?
这很好。只要至少有一个变量指向您的数组(在这种情况下,您拥有myArray
),它就没有资格进行垃圾回收。
答案 1 :(得分:4)
JVM是否设置指针相同?
- >是的,在Java中,它们更好地称为引用。
我是否有将myArray变量丢失到垃圾收集器的风险?
- >不,除非您丢失对MyClass对象的引用。
最好是这样做吗?
- >优先 - 没有。这取决于你需要什么,
在这里你创建一个实际的副本,两者都可以。
在那里设置initArray = null;
是没用的btw
因为initArray
未通过引用传递。在爪哇
一切都是通过价值传递的,甚至是参考文献
(initArray
是此处的参考)
在第一种方法中,如果initArray是一个会发生什么
在其他一些函数中创建的局部变量?
- >当你保存对该局部变量的引用时,可以想一想
在你的MyClass对象中,当你的函数完成时你不会丢失它
执行(我想这是你的关注)。简单地说,它会活着
只要你的MyClass对象(你保存它)就存在。
答案 2 :(得分:0)
指针确实指向同一个数组,只要它指向数组,它就不会被视为垃圾。