Может ли собственный образ предупреждать об ошибках связывания JVM?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Может ли собственный образ предупреждать об ошибках связывания JVM?

Сообщение Anonymous »

Классы Java связываются во время выполнения, что означает, что если класс заменяется несовместимым образом, это может привести к ошибке при запуске приложения.
Например , возьмем следующие классы:

Код: Выделить всё

public class Main{
public static void main(String[] args){
SomeClass.doSomething();
}
}
public class SomeClass{
public static void doSomething(){}
}

Если мы скомпилируем оба класса вместе (

Код: Выделить всё

javac Main.java SomeClass.java
) и запускаем Main, он работает успешно.
Однако, если мы изменим SomeClass (по какой-то причине это может быть библиотека) и перекомпиляция без перекомпиляции Main:

Код: Выделить всё

public class SomeClass{
public static void doSomethingNew(){}//name change here
}
мы (как и ожидалось) получаем NoSuchMethodError, потому что Main ссылается на SomeClass. Точно так же мы получаем NoClassDefFoundError, если удаляем SomeClass.class и просто запускаем Main.
Однако при использовании нативного образа GraalVM< /code>, у нас есть предположение о закрытом мире, означающее, что все используемые классы должны быть известны во время сборки образа и не могут быть изменены. Если классы несовместимы или отсутствуют, мы все равно получаем NoSuchMethodError/

Код: Выделить всё

NoClassDefFoundError
(или аналогичные ошибки LinkageError) при запуске изображения, поскольку такое поведение предусмотрено спецификацией:

Код: Выделить всё

$ native-image -Ob Main
========================================================================================================================
GraalVM Native Image: Generating 'main' (executable)...
========================================================================================================================
[1/8] Initializing...                                                                                    (2.9s @ 0.11GB)
Java version: 21.0.2+13-LTS, vendor version: Oracle GraalVM 21.0.2+13.1
Graal compiler: optimization level: b, target machine: x86-64-v3, PGO: off
C compiler: gcc (linux, x86_64, 14.2.0)
Garbage collector: Serial GC (max heap size: 80% of RAM)
1 user-specific feature(s):
- com.oracle.svm.thirdparty.gson.GsonFeature
------------------------------------------------------------------------------------------------------------------------
Build resources:
- 11.27GB of memory (75.6% of 14.92GB system memory, determined at start)
- 8 thread(s) (100.0% of 8 available processor(s), determined at start)
[2/8] Performing analysis...  [******]                                                                   (8.4s @ 0.19GB)
2,133 reachable types   (62.1% of    3,437 total)
2,066 reachable fields  (45.9% of    4,504 total)
10,042 reachable methods (39.3% of   25,580 total)
741 types,   112 fields, and   476 methods registered for reflection
49 types,    34 fields, and    48 methods registered for JNI access
4 native libraries: dl, pthread, rt, z
[3/8] Building universe...                                                                               (1.3s @ 0.22GB)
[4/8] Parsing methods...      [*]                                                                        (0.9s @ 0.22GB)
[5/8] Inlining methods...     [***]                                                                      (1.0s @ 0.25GB)
[6/8] Compiling methods...    [**]                                                                       (4.9s @ 0.25GB)
[7/8] Layouting methods...    [*]                                                                        (0.7s @ 0.32GB)
[8/8] Creating image...        [*]                                                                        (1.5s @ 0.21GB)
2.38MB (37.07%) for code area:     5,565 compilation units
3.61MB (56.37%) for image heap:   58,333 objects and 43 resources
430.86kB ( 6.56%) for other data
6.41MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 origins of code area:                                Top 10 object types in image heap:
1.26MB java.base                                          733.53kB byte[] for java.lang.String
930.06kB svm.jar (Native Image)                             696.27kB byte[] for code metadata
84.88kB com.oracle.svm.svm_enterprise                      390.05kB java.lang.String
19.45kB org.graalvm.nativeimage.base                       389.10kB heap alignment
17.37kB jdk.internal.vm.ci                                 339.78kB java.lang.Class
15.33kB jdk.proxy3                                         157.38kB java.util.HashMap$Node
14.99kB jdk.proxy1                                         114.01kB char[]
14.47kB org.graalvm.collections                            102.19kB byte[] for reflection metadata
4.97kB jdk.internal.vm.compiler                            88.68kB java.lang.Object[]
3.62kB jdk.proxy2                                          83.32kB com.oracle.svm.core.hub.DynamicHubCompanion
471.00B for 1 more packages                                605.70kB for 575 more object types
Use '-H:+BuildReport' to create a report with more details.
------------------------------------------------------------------------------------------------------------------------
Security report:
- Binary does not include Java deserialization.
- Use '--enable-sbom' to embed a Software Bill of Materials (SBOM) in the binary.
------------------------------------------------------------------------------------------------------------------------
Recommendations:
G1GC: Use the G1 GC ('--gc=G1') for improved latency and throughput.
PGO:  Use Profile-Guided Optimizations ('--pgo') for improved throughput.
INIT: Adopt '--strict-image-heap' to prepare for the next GraalVM release.
HEAP: Set max heap for improved and more predictable memory usage.
CPU:  Enable more CPU features with '-march=native' for improved performance.
------------------------------------------------------------------------------------------------------------------------
1.5s (6.7% of total time) in 101 GCs | Peak RSS: 0.77GB | CPU load: 5.29
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:
/tmp/y/main (executable)
========================================================================================================================
Finished generating 'main' in 21.9s.
$ ./main
Exception in thread "main" java.lang.NoSuchMethodError: SomeClass.doSomething()
at Main.main(Main.java:3)
at java.base@21.0.2/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
В выводе сборки я не вижу никаких упоминаний или предупреждений о несовместимости некоторых классов. Я также пробовал использовать такие параметры, как --initialize-at-build-time=Main,SomeClass или --strict-image-heap, но это не изменило этого поведения.
Есть ли какая-либо возможность (например, с помощью параметров CLI или путем реализации пользовательских функций) позволить Native-image предупреждать меня о подобных несовместимостях, поскольку он все равно должен их проверять (для имитации указанной LinkageError< /code>s) (может быть, я просто упускаю из виду вариант)?

Если это принципиально невозможно с помощью нативного изображения или есть проблемы с его реализацией, что это за проблемы ?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-errors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»