I have code like this:
public class TestGC {
private static final int _10MB = 10 * 1024 * 1024; // 10MB
public static void main(String[] args) {
test1();
// test2();
}
public static void test1() {
int i = 1;
if (i > 0) {
byte[] data = new byte[_10MB];
}
System.gc();
}
public static void test2() {
if (true) {
byte[] data = new byte[_10MB];
}
System.gc();
}
}
我使用jvm选项-verbose:gc
运行它,我的Java环境如下:
java版本号为"1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
CASE-1:
通过调用test1()
方法运行,控制台输出:
[GC 13312K->616K(116736K), 0.0014246 secs]
[Full GC 616K->554K(116736K), 0.0125266 secs]
data
变量由 JVM 收集。
CASE-2:
运行时调用 test2()
方法,控制台输出:
[GC 13312K->10936K(116736K), 0.0092033 secs]
[Full GC 10936K->10788K(116736K), 0.0155626 secs]
data
变量未被收集。
我使用javap
命令为方法生成字节码:
test1()
public static void test1();
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=2, args_size=0
0: iconst_1
1: istore_0
2: iload_0
3: ifle 11
6: ldc #3 // int 10485760
8: newarray byte
10: astore_1
11: invokestatic #4 // Method java/lang/System.gc:()V
14: return
LineNumberTable:
line 11: 0
line 12: 2
line 13: 6
line 15: 11
line 16: 14
LocalVariableTable:
Start Length Slot Name Signature
11 0 1 data [B
2 13 0 i I
StackMapTable: number_of_entries = 1
frame_type = 252 /* append */
offset_delta = 11
locals = [ int ]
测试2()
public static void test2();
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=0
0: ldc #3 // int 10485760
2: newarray byte
4: astore_0
5: invokestatic #4 // Method java/lang/System.gc:()V
8: return
LineNumberTable:
line 20: 0
line 22: 5
line 23: 8
LocalVariableTable:
Start Length Slot Name Signature
5 0 0 data [B
我的猜测是:当方法
test1()
执行到堆栈映射帧时,局部变量被重置,导致slot_1(保存data
的位置)被清除。有人能详细解释一下吗?
test2()
和它的变体我想已经明白了,因为它们在字节码上是等价的。但是我仍然对test1()
及其变体感到困惑,我猜这篇论文可以给出答案,但我还没有理解。 - Spiro Huang-Xcomp
是一个比较古老的选项,它是在分层编译出现之前的时期使用的。它只是强制编译,或者更容易理解为禁止解释执行。这与-Xint
相反,后者强制解释执行。我认为-Xcomp
不会对C1
和C2
产生任何影响。堆栈映射功能并不难理解,它只是为验证器提供提示,但不会影响任何其他内容。正如本答案所述,这些提示 可能 有助于 JVM(快速)了解哪些变量未被使用,但目前还没有使用。 - Holger-Xcomp
就有了很多意义,在这里关于这个主题的最高评价问题实际上比这个评论更糟糕... - Eugene