Java 8 лямбда-ошибок - PullRequest
       6

Java 8 лямбда-ошибок

0 голосов
/ 29 августа 2018

Я пытаюсь профилировать приложение Java с помощью FlightRecorder и MissionControl, и я получаю некоторые ошибки, связанные с лямбда-функциями. Приложение работает отлично - ошибки появляются только в FR / MC.

Простая программа:

import java.util.function.Supplier;

public class TestClass {

  public static void main(String[] args) {
    Supplier<String> s = () -> "VALUE"; // <- error at this line
  }

}

Java-версия:

java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

JVM args:

-XX:+UnlockDiagnosticVMOptions -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=delay=0s,duration=10s,filename=recording.jfr,settings=profile

Ошибка Java, сообщаемая FlightRecorder (откройте recording.jfr в MissionControl и зайдите в События-> Журнал):

Class   java.lang.NoSuchFieldError  thrownClass class   
Message method resolution failed    message text    
Event Thread    main    (thread)    thread  
    Error.<init>(String) line: 71           
    LinkageError.<init>(String) line: 55            
    IncompatibleClassChangeError.<init>(String) line: 55            
    NoSuchFieldError.<init>(String) line: 57            
    MethodHandleNatives.resolve(MemberName, Class)          
    MemberName$Factory.resolve(byte, MemberName, Class) line: 975           
    MemberName$Factory.resolveOrFail(byte, MemberName, Class, Class) line: 1000         
    MethodHandles$Lookup.resolveOrFail(byte, Class, String, MethodType) line: 1386          
    MethodHandles$Lookup.findStatic(Class, String, MethodType) line: 780            
    MethodHandleImpl.findCollector(String, int, Class, Class[]) line: 1387          
    MethodHandleImpl.makeArrays() line: 1427            
    MethodHandleImpl.access$000() line: 49          
    MethodHandleImpl$Lazy.<clinit>() line: 610          
    MethodHandleImpl.varargsArray(int) line: 1506           
    MethodHandleImpl.varargsArray(Class, int) line: 1623            
    MethodHandle.asCollector(Class, int) line: 999          
    MethodHandleImpl$AsVarargsCollector.<init>(MethodType, MethodHandle, Class) line: 460           
    MethodHandleImpl$AsVarargsCollector.<init>(MethodHandle, Class) line: 454           
    MethodHandleImpl.makeVarargsCollector(MethodHandle, Class) line: 445            
    MethodHandle.setVarargs(MemberName) line: 1325          
    MethodHandles$Lookup.getDirectMethodCommon(byte, Class, MemberName, boolean, boolean, Class) line: 1670         
    MethodHandles$Lookup.getDirectMethod(byte, Class, MemberName, Class) line: 1605         
    MethodHandles$Lookup.findStatic(Class, String, MethodType) line: 781            
    CallSite.<clinit>() line: 226           
    MethodHandleNatives.linkCallSiteImpl(Class, MethodHandle, String, MethodType, Object, Object[]) line: 307           
    MethodHandleNatives.linkCallSite(Object, Object, Object, Object, Object, Object[]) line: 297            
    TestClass.main(String[]) line: 6            

Есть мысли? Приветствия.

1 Ответ

0 голосов
/ 29 августа 2018

TL; DR Об этих двух зарегистрированных ошибках не о чем беспокоиться.

FlightRecorder записывает каждый бросок независимо от того, был ли он обработан или нет, и что еще хуже, он может записывать ошибки, которые только что были построены , независимо от того, были ли они фактически выброшены. Например, когда я использую следующую программу,

public class Test {
    static NoSuchFieldError PREPARED = new NoSuchFieldError();

    public static void main(String... args) {
    }
}

FlightRecorder сообщает о следующем событии:

Class   java.lang.NoSuchFieldError  thrownClass class   
Message     message text    
Event Thread    main    (thread)    thread  
    Error.<init>() line: 59         
    LinkageError.<init>() line: 45          
    IncompatibleClassChangeError.<init>() line: 45          
    NoSuchFieldError.<init>() line: 47          
    Test.<clinit>() line: 3         

, поэтому мы даже не можем предположить, что каждый сообщаемый объект throwable отражает реальную ошибку, кроме того, исключения, сгенерированные и обнаруженные в рамках типа java.lang.invoke, не должны беспокоить нас.

В этом отношении обратите внимание, что в сообщаемом стековом трассировщике содержится MethodHandleImpl$Lazy.<clinit>(), инициализатор класса внутреннего класса, инициализация которого была вызвана CallSite.<clinit>(), инициализатором класса CallSite, который не зависит от вашего фактического операция, за исключением того, что инструкция invokedynamic, сгенерированная для лямбда-выражения, вызвала ее.

Когда мы используем

import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

public class Test {
    public static void main(String... args) {
        MethodHandles.Lookup l = MethodHandles.lookup();
        MethodType type = MethodType.methodType(void.class, String[].class);
        try {
            l.findStatic(Test.class, "main", type).asCollector(String[].class, 2);
            l.findStatic(Test.class, "main", type).asCollector(String[].class, 2);
        }
        catch(ReflectiveOperationException ex) {
            throw new RuntimeException(ex);
        }
        Runnable r = Test::main;
    }
}

вместо этого мы получаем

Name    Value   Identifier  Content Type    Relational Key
Class   java.lang.NoSuchFieldError  thrownClass class   
Message method resolution failed    message text    
Event Thread    main    (thread)    thread  
    Error.<init>(String) line: 71           
    LinkageError.<init>(String) line: 55            
    IncompatibleClassChangeError.<init>(String) line: 55            
    NoSuchFieldError.<init>(String) line: 57            
    MethodHandleNatives.resolve(MemberName, Class)          
    MemberName$Factory.resolve(byte, MemberName, Class) line: 975           
    MemberName$Factory.resolveOrFail(byte, MemberName, Class, Class) line: 1000         
    MethodHandles$Lookup.resolveOrFail(byte, Class, String, MethodType) line: 1386          
    MethodHandles$Lookup.findStatic(Class, String, MethodType) line: 780            
    MethodHandleImpl.findCollector(String, int, Class, Class[]) line: 1387          
    MethodHandleImpl.makeFillArrays() line: 1488            
    MethodHandleImpl.access$100() line: 49          
    MethodHandleImpl$Lazy.<clinit>() line: 611          
    MethodHandleImpl.varargsArray(Class, int) line: 1638            
    MethodHandle.asCollector(Class, int) line: 999          
    Test.main(String[]) line: 9         

(два идентичных события в течение миллисекунды)

, который демонстрирует, что фактический триггер инициализации класса действительно не имеет значения, так как мы получаем то же самое поведение для строки 9, l.findStatic(Test.class, "main", type).asCollector(String[].class, 2);, и это единовременная вещь инициализации, поскольку мы не получаем его для идентичного оператора на Следующая строка и ни одна из них не содержит ссылки на несколько строк ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...