SORU
28 ŞUBAT 2014, Cuma


Varsayılan yöntem bir süre için true değerini döndürür ve sonra da false değerini döndürür? (Olası JVM hata)

Benim bir sorunum var aşağıdaki kod, ben izole etmek için en iyi kapalı form, ben kullanarak Java 8, neredeyse kalkışa hazır (18 Mart 2014), umarım ciddi bir sorunları uygulama kendisi, bu yüzden olabilir/olmalı benim kendi kod:

Not: kod arayüzleri default yöntem uygulanması da dahil olmak üzere Java yeni özellikler her türlü olan 8, yazılır.

public abstract class Drawable implements DrawableInterface {    

}

interface DrawableInterface {
    default public boolean isShadowReceiver() {
        return false;
    }

    default public boolean isShadowCaster() {
        return false;
    }
}

public interface ShadowDrawable extends DrawableInterface {
    @Override
    default public boolean isShadowReceiver() {
        return true;
    }

    @Override
    default public boolean isShadowCaster() {
        return true;
    }
}

public class Box extends Drawable implements ShadowDrawable {

}

public class IsolatedBug {
    private final Box box;

    private final List<Drawable> drawables;

    public IsolatedBug() {
        this.box = new Box();
        this.drawables = new ArrayList<>();

        drawables.add(box);
        drawables.forEach(drawable -> System.out.println(drawable   " C="   drawable.isShadowCaster()   "/R="   drawable.isShadowReceiver()));
    }

    private void init() throws InterruptedException {
        while (true) {
            drawables.forEach(drawable -> System.out.println(drawable   " C="   drawable.isShadowCaster()   "/R="   drawable.isShadowReceiver()));
            Thread.sleep(100);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new IsolatedBug().init();
    }
}

Kendisi kod en mantıklı olmayabilir, ama diğer alakasız yöntemleri bir sürü elimden var çünkü.

Çıkışı gördüğünüzde ancak, aşağıdaki görüyorum bana 30 saniye sonra şahsen garip bir şey, belli bir noktada, bakın,:

=R=isolatedbug.Box@5acf9800 C true/doğru
isolatedbug.Kutu@5acf9800 C=R=true/doğru
isolatedbug.Kutu@5acf9800 C=R=true/doğru
isolatedbug.Kutu@5acf9800 C=R=true/doğru
isolatedbug.Kutu@5acf9800 C=R=false/yanlış
isolatedbug.Kutu@5acf9800 C=R=false/yanlış
isolatedbug.Kutu@5acf9800 C=R=false/yanlış
isolatedbug.Kutu@5acf9800 C=R=false/yanlış
isolatedbug.Kutu@5acf9800 C=R=false/yanlış
isolatedbug.Kutu@5acf9800 C=R=false/yanlış

false true geçer zaman çağrı sayısı daha çok, daha çok geçiş için gereken arasında uyur gibi olan bu yöntem, bağımlı gibi görünüyor.

Bu, Windows 8 64-bit üzerinde tam bilgi için java -version ile çalışan biriyim

java version "1.8.0"
(TM) SE Runtime Environment (build 1.8.0-b129) Java
Java Fi(TM) 64-Bit Server VM (25.0-b69, karma mod kurmak)

Kimse bana neler olduğunu açıklayabilir mi?
Ayrıca eğer Java 8-herhangi bir ile diğer yapı, çalıştırmak ve eğer aynı sorun varsa görseydi memnun olurum.

Kullandıktan sonra bu kodu: daha fazla bilgi

  Properties p = System.getProperties();
  p.list(System.out);

Çıkış:

-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jdk1.8.0\jre\bin
java.vm.version=25.0-b69
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=NL
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=C:\Users\Frank\Dropbox\NetbeansProjec...
java.runtime.version=1.8.0-b129
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0\jre\li...
os.arch=amd64
java.io.tmpdir=C:\Users\Frank\AppData\Local\Temp\
line.separator=

java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 8.1
sun.jnu.encoding=Cp1252
java.library.path=C:\Program Files\Java\jdk1.8.0\bin;C:...
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=6.3
user.home=C:\Users\Frank
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
user.name=Beheerder
java.class.path=C:\Users\Frank\Dropbox\NetbeansProjec...
java.vm.specification.version=1.8
sun.arch.data.model=64
java.home=C:\Program Files\Java\jdk1.8.0\jre
sun.java.command=isolatedbug.IsolatedBug
java.specification.vendor=Oracle Corporation
user.language=nl
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0
java.ext.dirs=C:\Program Files\Java\jdk1.8.0\jre\li...
sun.boot.class.path=C:\Program Files\Java\jdk1.8.0\jre\li...
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64

Ayrıca bu kullanılmadığında -Xint VM seçeneği, kontrol ettim, beklendiği gibi true döndürür.

Yani sonuç olarak görünüyor ki belirli bir kullanım şekli, yorumlanması ve TAM zamanında derlenmiş/inlined türevleri kod aynı değil ve dolayısıyla bir ihtimal bundan sonra yorumlanmış kod derlenmiş anahtarlarının yorumlanır derlenmiş ve böylece açıklığa anahtarı çıktı.

Hangi hata oluştu gerçek programı -Xint seçeneği ekleyerek, orada da sorun giderildi.

Resmi hata raporu kabul edilmiştir: JIRA Bug JDK-8036100

CEVAP
28 ŞUBAT 2014, Cuma


Bu Java8 bilinen bir hata.

Bu Jira bakın: CHA ignores default methods during analysis leading to incorrect code generation

This blog entry is enlightening....

Update / Özet:


Önceki Notlar

Bu sorunu yeniden var:

Bu sorun çözülene iddia b127 bunu açıkça b129 JVM sürümünü kuralları... şaşırdım sürece) görüyorum, kafa karıştırıcı

C:\Java8\jdk-1.8.0_01\bin>java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b129)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b69, mixed mode)

C:\Java8\jdk-1.8.0_01\bin>

Sistem Ekleme.dışarı.sertifika Sistemi.() getProperties);

{
java.runtime.name=Java(TM) SE Runtime Environment, 
java.runtime.version=1.8.0-b129, 
java.vm.specification.name=Java Virtual Machine Specification, 
java.vm.name=Java HotSpot(TM) 64-Bit Server VM, 
java.vm.version=25.0-b69, 
java.vm.vendor=Oracle Corporation, 
java.vendor.url=http://java.oracle.com/, 
java.vm.specification.version=1.8, 
java.specification.name=Java Platform API Specification, 
java.specification.version=1.8, 
java.specification.vendor=Oracle Corporation, 
java.class.version=52.0, 
sun.boot.library.path=C:\Java8\jdk-1.8.0_01\jre\bin, 
sun.java.launcher=SUN_STANDARD, 
sun.os.patch.level=Service Pack 1, 
java.endorsed.dirs=C:\Java8\jdk-1.8.0_01\jre\lib\endorsed, 
os.arch=amd64, 
java.vm.specification.vendor=Oracle Corporation, 
os.name=Windows 7, 
sun.jnu.encoding=Cp1252, 
java.library.path=C:\Java8\jdk-1.8.0_01\bin;......, 
sun.management.compiler=HotSpot 64-Bit Tiered Compilers, 
os.version=6.1, 
file.encoding=UTF-8, 
sun.java.command=fromso.IsolatedBug, 
java.home=C:\Java8\jdk-1.8.0_01\jre, 
sun.arch.data.model=64, 
user.language=en, 
java.ext.dirs=C:\Java8\jdk-1.8.0_01\jre\lib\ext;C:\windows\Sun\Java\lib\ext,

sun.boot.class.path=C:\Java8\jdk-1.8.0_01\jre\lib\resources.jar;......,
java.vendor=Oracle Corporation, 
file.separator=\, 
java.vendor.url.bug=http://bugreport.sun.com/bugreport/, 
sun.io.unicode.encoding=UnicodeLittle, 
sun.cpu.endian=little, 
sun.desktop=windows, 
sun.cpu.isalist=amd64
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CareyHolzman

    CareyHolzman

    24 Ocak 2008
  • glowpinkstah

    glowpinkstah

    16 Mayıs 2006
  • Soulkiller13 ツ

    Soulkiller13

    30 Mayıs 2013