Best mailing list for JVM embedding
Robert Marcano
robert at marcanoonline.com
Sat Jan 19 17:22:40 UTC 2019
Greetings, which is the best mailing list for discussions about
embedding the JVM (via JNI_CreateJavaVM)?
The JVM is being embedded for desktop integration issues, for example to
show the appropriate application name on the process list instead of
java/java.exe, among many other things.
I am experiencing what looks like higher memory usage and/or failure to
garbage collect correctly when OpenJDK 11 is the embedded JVM. Starting
a test application using the java launcher, I get a GC log like this:
> [0.007s][info][gc] Using G1
> [0.389s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 10M->8M(124M) 8.661ms
> [0.705s][info][gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 13M->10M(124M) 6.148ms
> Jan 19, 2019 1:04:26 PM test.Test init
> FINE: Starting application
> [1.376s][info][gc] GC(3) Pause Young (Normal) (G1 Evacuation Pause) 18M->10M(40M) 4.763ms
> [2.288s][info][gc] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 23M->12M(40M) 6.382ms
> [2.444s][info][gc] GC(5) Pause Young (Concurrent Start) (Metadata GC Threshold) 18M->12M(48M) 7.579ms
> [2.444s][info][gc] GC(6) Concurrent Cycle
> [2.481s][info][gc] GC(6) Pause Remark 13M->13M(48M) 5.255ms
> [2.498s][info][gc] GC(6) Pause Cleanup 13M->13M(48M) 0.090ms
> [2.499s][info][gc] GC(6) Concurrent Cycle 54.811ms
> [2.905s][info][gc] GC(7) Pause Young (Normal) (G1 Evacuation Pause) 26M->13M(48M) 12.726ms
> [3.204s][info][gc] GC(8) Pause Young (Normal) (GCLocker Initiated GC) 29M->15M(48M) 11.216ms
> [3.462s][info][gc] GC(9) Pause Young (Normal) (G1 Evacuation Pause) 30M->17M(48M) 18.043ms
> [3.679s][info][gc] GC(10) Pause Young (Normal) (G1 Evacuation Pause) 31M->18M(64M) 15.195ms
> [3.933s][info][gc] GC(11) Pause Young (Normal) (G1 Evacuation Pause) 38M->20M(64M) 9.412ms
> [4.230s][info][gc] GC(12) Pause Young (Normal) (G1 Evacuation Pause) 40M->21M(64M) 16.319ms
> [4.536s][info][gc] GC(13) Pause Young (Normal) (G1 Evacuation Pause) 41M->23M(64M) 23.897ms
> [4.750s][info][gc] GC(14) Pause Young (Normal) (G1 Evacuation Pause) 43M->24M(94M) 8.776ms
> [5.180s][info][gc] GC(15) Pause Young (Normal) (G1 Evacuation Pause) 58M->26M(94M) 15.610ms
> [5.546s][info][gc] GC(16) Pause Young (Normal) (G1 Evacuation Pause) 67M->27M(94M) 18.075ms
> [6.058s][info][gc] GC(17) Pause Young (Normal) (G1 Evacuation Pause) 69M->30M(94M) 32.625ms
> [7.268s][info][gc] GC(18) Pause Young (Normal) (G1 Evacuation Pause) 71M->31M(156M) 18.999ms
> [7.458s][info][gc] GC(19) Pause Young (Concurrent Start) (Metadata GC Threshold) 40M->31M(156M) 20.217ms
> [7.459s][info][gc] GC(20) Concurrent Cycle
> [7.676s][info][gc] GC(20) Pause Remark 35M->35M(156M) 19.304ms
> [7.748s][info][gc] GC(20) Pause Cleanup 36M->36M(156M) 0.183ms
> [7.782s][info][gc] GC(20) Concurrent Cycle 323.765ms
> [8.899s][info][gc] GC(21) Pause Young (Concurrent Start) (G1 Evacuation Pause) 84M->40M(156M) 69.976ms
> [8.899s][info][gc] GC(22) Concurrent Cycle
> [9.152s][info][gc] GC(22) Pause Remark 47M->47M(156M) 21.133ms
> [9.244s][info][gc] GC(22) Pause Cleanup 49M->49M(156M) 0.127ms
> [9.247s][info][gc] GC(22) Concurrent Cycle 348.256ms
> [10.203s][info][gc] GC(23) Pause Young (Normal) (G1 Evacuation Pause) 97M->55M(156M) 74.572ms
> [11.102s][info][gc] GC(24) Pause Full (System.gc()) 100M->21M(77M) 115.166ms
> [15.382s][info][gc] GC(25) Pause Young (Normal) (G1 Evacuation Pause) 48M->22M(154M) 6.371ms
When the same Java 11 JVM is loaded via JNI, with the same VM arguments
than using the java launcher, the log look like this (to reach the same
point at startup)
> [0.015s][info][gc] Using G1
> [0.501s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 6M->1M(124M) 8.550ms
> [0.785s][info][gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 8M->3M(124M) 6.533ms
> [0.940s][info][gc] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 14M->7M(124M) 17.822ms
> [1.212s][info][gc] GC(3) Pause Young (Normal) (G1 Evacuation Pause) 22M->10M(124M) 11.145ms
> [1.462s][info][gc] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 29M->15M(180M) 16.451ms
> [1.695s][info][gc] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 47M->25M(180M) 38.828ms
> [2.041s][info][gc] GC(6) Pause Young (Normal) (G1 Evacuation Pause) 55M->30M(180M) 22.151ms
> [2.346s][info][gc] GC(7) Pause Young (Normal) (G1 Evacuation Pause) 80M->49M(180M) 53.093ms
> Jan 19, 2019 1:01:05 PM test.Test init
> FINE: Starting application
> [4.094s][info][gc] GC(9) Pause Young (Concurrent Start) (Metadata GC Threshold) 64M->40M(258M) 50.663ms
> [4.094s][info][gc] GC(10) Concurrent Cycle
> [4.480s][info][gc] GC(10) Pause Remark 48M->48M(258M) 7.442ms
> [4.652s][info][gc] GC(10) Pause Cleanup 55M->55M(258M) 0.186ms
> [4.656s][info][gc] GC(10) Concurrent Cycle 562.009ms
> [5.174s][info][gc] GC(11) Pause Young (Concurrent Start) (G1 Evacuation Pause) 82M->46M(258M) 24.726ms
> [5.174s][info][gc] GC(12) Concurrent Cycle
> [5.513s][info][gc] GC(12) Pause Remark 56M->56M(258M) 11.695ms
> [5.657s][info][gc] GC(12) Pause Cleanup 62M->62M(258M) 0.176ms
> [5.660s][info][gc] GC(12) Concurrent Cycle 486.466ms
> [6.430s][info][gc] GC(13) Pause Young (Normal) (G1 Evacuation Pause) 107M->58M(258M) 55.665ms
> [7.538s][info][gc] GC(14) Pause Young (Normal) (G1 Evacuation Pause) 107M->63M(258M) 58.642ms
> [8.724s][info][gc] GC(15) Pause Young (Concurrent Start) (Metadata GC Threshold) 91M->68M(496M) 47.374ms
> [8.724s][info][gc] GC(16) Concurrent Cycle
> [9.417s][info][gc] GC(16) Pause Remark 79M->79M(496M) 19.350ms
> [9.557s][info][gc] GC(16) Pause Cleanup 81M->81M(496M) 0.340ms
> [9.575s][info][gc] GC(16) Concurrent Cycle 850.788ms
> [10.954s][info][gc] GC(17) Pause Young (Concurrent Start) (G1 Evacuation Pause) 134M->85M(496M) 162.779ms
> [10.954s][info][gc] GC(18) Concurrent Cycle
> [11.389s][info][gc] GC(19) Pause Young (Normal) (G1 Evacuation Pause) 99M->90M(496M) 79.954ms
> [11.519s][info][gc] GC(18) Pause Remark 93M->92M(496M) 24.636ms
> [11.896s][info][gc] GC(18) Pause Cleanup 102M->102M(496M) 0.326ms
> [11.903s][info][gc] GC(18) Concurrent Cycle 949.231ms
> [17.356s][info][gc] GC(22) Pause Young (Concurrent Start) (G1 Humongous Allocation) 131M->81M(365M) 56.745ms
> [17.357s][info][gc] GC(23) Concurrent Cycle
> [17.706s][info][gc] GC(23) Pause Remark 116M->113M(365M) 31.351ms
> [18.008s][info][gc] GC(23) Pause Cleanup 117M->117M(365M) 0.250ms
> [18.018s][info][gc] GC(23) Concurrent Cycle 661.284ms
> [18.888s][info][gc] GC(24) Pause Young (Normal) (G1 Evacuation Pause) 205M->91M(365M) 93.737ms
> [20.355s][info][gc] GC(25) Pause Young (Normal) (G1 Evacuation Pause) 324M->136M(378M) 125.037ms
> [21.091s][info][gc] GC(26) Pause Young (Normal) (G1 Evacuation Pause) 295M->150M(378M) 93.607ms
> [21.631s][info][gc] GC(27) Pause Young (Concurrent Start) (G1 Humongous Allocation) 261M->164M(516M) 77.013ms
> [21.631s][info][gc] GC(28) Concurrent Cycle
> [21.981s][info][gc] GC(28) Pause Remark 212M->169M(516M) 43.679ms
> [22.243s][info][gc] GC(28) Pause Cleanup 214M->214M(516M) 0.257ms
> [22.250s][info][gc] GC(28) Concurrent Cycle 619.296ms
> [22.827s][info][gc] GC(29) Pause Young (Normal) (G1 Evacuation Pause) 321M->155M(516M) 106.789ms
> [23.758s][info][gc] GC(30) Pause Young (Normal) (G1 Evacuation Pause) 363M->187M(516M) 121.025ms
> [24.957s][info][gc] GC(31) Pause Young (Normal) (GCLocker Initiated GC) 386M->207M(516M) 111.118ms
> [25.697s][info][gc] GC(32) Pause Young (Concurrent Start) (G1 Humongous Allocation) 346M->222M(656M) 104.765ms
> [25.697s][info][gc] GC(33) Concurrent Cycle
> [26.128s][info][gc] GC(33) Pause Remark 270M->192M(656M) 55.681ms
> [26.342s][info][gc] GC(33) Pause Cleanup 203M->203M(656M) 0.371ms
> [26.349s][info][gc] GC(33) Concurrent Cycle 651.801ms
> [27.421s][info][gc] GC(34) Pause Young (Prepare Mixed) (G1 Evacuation Pause) 380M->180M(656M) 195.335ms
> [27.543s][info][gc] GC(35) Pause Young (Mixed) (G1 Evacuation Pause) 195M->172M(656M) 38.254ms
> [28.694s][info][gc] GC(36) Pause Young (Normal) (G1 Evacuation Pause) 427M->214M(656M) 107.817ms
> [31.109s][info][gc] GC(37) Pause Young (Normal) (G1 Evacuation Pause) 486M->239M(656M) 117.275ms
Notice, the higher memory usage. If a more complex applications is
started, the heap continue to grow indefinitely, with long GC pauses and
a growing heap. It is my understanding that the JVM should setup default
GC and or memory related configuration by itself, be it from the java
launcher or JNI_CreateJavaVM.
The same custom launcher does not experience this when the embedded JVM
is version 8.
Note: the launcher is a simple Rust program, not a complex thing, just
locate libjvm.so/jvm.dll, build the VM options, Use JNI_CreateJavaVM,
locate the main class and invoke the main method. These logs are for the
Linux version.
Any help is appreciated, or a pointer to the correct mailing list.
More information about the discuss
mailing list