簡體   English   中英

運行和調試程序Java,Eclipse的不同行為

[英]Different behavior running and debugging the program Java, Eclipse

我有這個代碼(暫時擱置它的適當性):

    Class<?> cacheClass = Class.forName("java.lang.Integer$IntegerCache");
    Field cacheField = cacheClass.getDeclaredField("cache");
    cacheField.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(cacheField, cacheField.getModifiers() & ~Modifier.FINAL);

    Integer betterCache[] = new Integer[255];
    for (int i = 0; i < betterCache.length; i++) {
        betterCache[i] = 20;
    }
    cacheField.set(null,  betterCache);
    System.out.println(10);
    System.out.println((Integer) 10);

我希望第二個println打印20,因為我用20替換了緩存的Integers 。當我在Eclipse中調試程序時,它按照我的預期進行,它從緩存中獲取值並打印20,而在兩種情況下,當我只是打印10時從IDE或通過調用java運行它。 如何解釋這種行為?

UPD:如果使用1.8 javac編譯,它會以這種方式工作。 如果使用1.6版本編譯,則打印10和20。

這絕對是由Just in Time Compiler引起的。 您應該將-XX:+ PrintCompilation添加到JVM選項,如果您進行迭代,它也會更加明顯

System.out.println((Integer) 10);

很多時間。 你會注意到編譯

java.lang.Integer::valueOf (32 bytes)

java.nio.ByteBuffer::arrayOffset (35 bytes) 

影響結果。

編輯

我完全錯了

絕對是你玩火,在我看來,這是針對競爭條件(java 8中的不安全線程)。 如果你檢查這個:

    Class<?> cacheClass = Class.forName("java.lang.Integer$IntegerCache");
    Field cacheField = cacheClass.getDeclaredField("cache");
    cacheField.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(cacheField, cacheField.getModifiers() & ~Modifier.FINAL);
    Integer firstCache[] = (Integer[])cacheField.get(null);
    Integer betterCache[] = new Integer[255];
    for (int i = 0; i < betterCache.length; i++) {
        betterCache[i] = 20;
    }
    System.out.println(firstCache == betterCache);
    cacheField.set(null, betterCache);
    System.out.println(10);
    for (int i = 0; i < 1000000; i++) {
        System.out.println((Integer) 10);     
    }

你會看到Java刻錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM