на некоторых иногда выпадает VerifyError. Работает всё и компилируется под 1.8. Заметили что VerifyError бывает только на лямбдах которые реализуют интерфейс Runnable: “java.lang.VerifyError: (class org/springframework/web/context/request/async/WebAsyncManager$$Lambda$1677, method: run signature : ()V)Illegal use of nonvirtual function call”. Падает как на спринговом коде, так и иногда на нашем.
Грешим на DynaTrace - который на лету много чего пытается инструментировать.
Что сделано - написали маленького агента, который умеет подключаться и высасывать инструментированные классы - там действительно DynaTrace много чего перелопатил. Декомпилированное непонятно как читать - искать место где некорректно используется invokevirtual?
Непонятно почему это не повторяется на всех серверах. Есть ли какие-то эвристики по компиляции лямбд - компилировать их в “анонимный класс” только через 1000 вызовов, а до этого как-то по-другому обходиться?Что можно почитать и в какую сторону можно дебажить? Уже неделю бьёмся.
Читал про https://bugs.openjdk.java.net/browse/JDK-8004967 - но он, вроде уже давно исправлен(не знаю правда про оракловую JDK) и Runnable живёт без всяких дефолтных методов.
Так вы пробовали лямбды анонимными классами заменить? Либо отдельными классами?
Ну верифай error может выскочить перед загрузкой класса, лямбда вроде как пропускается
с вызовами может быть связана только со стороны того, кто инструментирует, хотя это странно. Verify же в самом начале, никаких 1000 вызовов до этого ещё не было. можно взять байткод и декомпильнуть (procyon/jetbrains) или повтыкать в него, если небольшой. может можно сказать, чтобы инструментировал при загрузке?
Обсуждают сегодня