我想知道Java什么时候在运行时(调用函数时(创建变量。请看下面的例子,并回答这些例子是否相同。
void function someFunction(boolean test) {
if (!test) {
return;
}
int[] myVar = new int[1000000];
...
}
void function someFunction(boolean test) {
int[] myVar = new int[1000000];
if (!test) {
return;
}
...
}
我不想花时间分配内存,只是为了稍后释放它,所以我需要知道Java是否会在函数一开始就为函数所需的某个变量(或数组(分配内存,无论声明发生在哪里,还是在到达声明点时分配内存。
编辑:
我对我造成的混乱深表歉意。当我说变量时,我指的是对象。
可能在方法输入点。通常的编译器优化是分配一个足够大的堆栈帧来包含所有局部。如果是这样的话,那么为它们分配空间就相当于一次减法。但是您必须检查字节码才能确定。
然而,在这个:
int[] myVar = new int[1000000];
"变量"是单个引用,占用4或8个字节。变量引用的对象是在执行中遇到初始化时通过执行"new"运算符分配的。
我怀疑你需要了解变量和对象之间的区别。
通常,Java编译器的编译有点愚蠢,因为它将优化留给运行时JVM。因此,编译主要是将源代码直接转换为字节码。
https://godbolt.org/z/5xT3KchrW
在本例中,使用OpenJDK17.0.0编译器,数组的分配大致在字节码中与源代码指示的位置相同的位置完成。
然而,指向数组的指针的局部变量是"0";分配的";在通过寄存器调用该方法时。虽然JVM使用堆栈框架的方式与C/C++非常相似,但在Android的Dalvik上,它们使用寄存器来保存本地变量,因此它实际上从来没有";分配的";在内存中(这是一个设计决策,因为它关注ARM——它有大量的寄存器——而不是x86——因为它缺乏寄存器而臭名昭著