这是关于Java中内存分配的noob问题。 我想知道它是否有问题"有以下reassignemnts:
例如。
byte[] b = new byte[10];
..
b = new byte[20]
....
b = new byte[4]
这会擦除堆栈并分配新内存吗?我们可以重新调整变量/对象的大小并以这种方式重新标注它吗?
答案 0 :(得分:5)
这会擦除堆栈并分配新内存吗?
是的,如果旧对象没有任何实时参考,则会对其进行GC。
我们可以重新调整变量/对象的大小并以这种方式重新标注它吗?
不,Java阵列无法动态增长。它们的大小总是固定的。
如果是其他对象,则可以更改对象的状态。对于Ex:ArrayList
,您可以在创建列表后更改列表的大小。
可能只是一个额外的问题。如果这只是分配新的 记忆和由GC处理的旧记忆,是否可以做到 以下:
MyObject myobject = new MyObject(byte[20]) ... myobject= new MyObject(byte[10]);
是的,这完全正确。您正在为旧参考myobject
重新分配新对象。
答案 1 :(得分:1)
将新对象分配给变量将使前一个对象有资格进行垃圾回收,如果它没有被任何活动线程引用..并且你可以像你做的那样做...并且将一个对象分配给另一个只分配对象引用(或多或少的指针)。它不会复制成员变量等。例如, B = C;
答案 2 :(得分:0)
是的,这将分配新内存,"擦除"原始数组中的数据。
如果要调整数组大小,但保留数据,请查看Arrays.copyOf()方法和朋友。这使您可以有效地将数据从一个数组移动到另一个数组:
int[] arr = new int[4];
arr = Arrays.copyOf(arr, 8); // Array is now 8 ints long, with the last 4 slots "empty"
通常,如果要自动调整数据结构大小,请查看由常规本机数组支持的ArrayList,但将其包装以便您自动调整大小。
答案 3 :(得分:0)
只要有对该对象的引用,我们使用new
创建的任何对象都将驻留在堆中。
在你的情况下
byte[] b = new byte[10]; // new memory is created in heap
b = new byte[20] // new memory is created in heap
此时堆中的对象(byte[10]
将符合GC条件)
b = new byte[4] //new memory is created here
此时堆中的对象(byte[20]
将符合GC条件)
数组不会动态增长。 new
每次使用新内存初始化一个新数组,旧内存符合GC
答案 4 :(得分:0)
第一个:每当你使用new关键字时,它总会创建新的内存和之前的ref。将被删除,但这并不意味着堆清楚实际上它是分配给GC的任务,它将非常有效地管理它。
第二个:您无法调整数组的大小,但您可以将该数据引用到另一个具有新的和更大的数组的数组中。对象将被GC自动删除。
第三个: arraylist可以在创建后动态增长。答案 5 :(得分:0)
不,一旦创建了新对象,jvm自动gc是旧的。你无法在堆栈中找到它们。
正如@Abiram解释的那样,你无法修改数组的状态。你确实可以尝试使用ArrayList 用于添加动态值。 如果您没有显式初始化实例变量,那么当new返回其引用时,该变量仍将具有其默认初始值。初始值为,
Type Default Value
boolean false
byte (byte) 0
short (short) 0
int 0
long 0L
char \u0000
float 0.0f
double 0.0d
object reference null
您可以参考docs 这里
希望这会有所帮助!!
答案 6 :(得分:0)
new
关键字将始终创建独立于的新实例 指定的类型。
这会擦除堆栈并分配新内存吗?
是的,它会为每个
new
分配一个新内存。和旧的 当下一次垃圾收集完成后,它将被清除 将清除分配的空间。
我们可以重新调整变量/对象的大小并以这种方式重新标注它吗?
不是我的答案,你不能用动态创建一个字节数组 尺寸。实际上,为单个对象分配太多内存会 制造内存问题。所以最好根据机器修复一些尺寸 明智地使用该对象以避免此类问题。