├── .gitignore ├── socket-read.png ├── GC_PARALLEL.md ├── GC_SHENANDOAH.md ├── src └── main │ └── java │ └── pbouda │ └── jfr │ ├── ClassLoaderStatistics.java │ ├── JavaThreadStatistics.java │ ├── ClassLoadingStatistics.java │ ├── Shutdown.java │ ├── Exceptions.java │ ├── MonitorEnter.java │ ├── ThreadAllocation.java │ ├── FileJFR.java │ ├── Certificates.java │ ├── SocketClient.java │ ├── NamedThreadFactory.java │ ├── SocketServer.java │ ├── Jfr.java │ └── AllocationStress.java ├── GC_PHASE_CONCURRENT.md ├── GC_PROMOTION.md ├── GC_REFERENCES.md ├── GC_EVACUATION.md ├── RESERVED_STACK.md ├── pom.xml ├── EXCEPTION.md ├── VM_OPTIONS.md ├── GC_G1_REGIONS.md ├── HEAP.md ├── GC_CONFIGURATION.md ├── SYSTEM.md ├── GC_G1_SPECIFIC.md ├── MODULE.md ├── NATIVE.md ├── JFR_EVENTS.md ├── TABLES.md ├── GC_G1_IHOP.md ├── OLD_OBJECT_SAMPLE.md ├── OBJECT_COUNT.md ├── SAFEPOINT.md ├── EXECUTE_VM_OPERATION.md ├── SHUTDOWN.md ├── OBJECT_ALLOCATION.md ├── SOCKETS.md ├── FILE.md ├── CLASSES.md ├── CODE_CACHE.md ├── GC_Z.md ├── MONITOR.md ├── GC_BASICS.md ├── METASPACE.md ├── COMPILER.md ├── README.md ├── THREADS.md ├── profile-jre.txt ├── default-jre.txt ├── THREAD_DUMP.md ├── CERTIFICATES.md └── custom-profile.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # Project exclude paths 2 | /target/ 3 | .idea 4 | *.iml -------------------------------------------------------------------------------- /socket-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/petrbouda/jfr-playground/HEAD/socket-read.png -------------------------------------------------------------------------------- /GC_PARALLEL.md: -------------------------------------------------------------------------------- 1 | # PARALLEL GC 2 | 3 | ``` 4 | jdk.ParallelOldGarbageCollection { 5 | startTime = 12:46:43.906 6 | duration = 205 ms 7 | gcId = 86 8 | densePrefix = 0xF0D80000 9 | } 10 | ``` 11 | -------------------------------------------------------------------------------- /GC_SHENANDOAH.md: -------------------------------------------------------------------------------- 1 | # SHENANDOAH GC 2 | 3 | ``` 4 | jdk.ShenandoahHeapRegionInformation#enabled: false 5 | jdk.ShenandoahHeapRegionInformation#period: everyChunk 6 | jdk.ShenandoahHeapRegionStateChange#enabled: false 7 | ``` -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/ClassLoaderStatistics.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | public class ClassLoaderStatistics { 4 | 5 | public static void main(String[] args) { 6 | Jfr.start("jdk.ClassLoaderStatistics"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/JavaThreadStatistics.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | public class JavaThreadStatistics { 4 | 5 | public static void main(String[] args) { 6 | Jfr.start("jdk.JavaThreadStatistics"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/ClassLoadingStatistics.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | public class ClassLoadingStatistics { 4 | 5 | public static void main(String[] args) { 6 | byte[] data = new byte[Integer.MAX_VALUE]; 7 | System.out.println(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/Shutdown.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | public class Shutdown { 4 | 5 | public static void main(String[] args) throws InterruptedException { 6 | Jfr.start("jdk.Shutdown"); 7 | Thread.sleep(5_000); 8 | throw new RuntimeException("SCHLUSS"); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/Exceptions.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | public class Exceptions { 4 | 5 | public static void main(String[] args) throws InterruptedException { 6 | Jfr.start("jdk.ExceptionStatistics", "jdk.JavaErrorThrow"); 7 | 8 | while (true) { 9 | try { 10 | throw new Error("My Error"); 11 | } catch (Error ex) { 12 | } 13 | 14 | Thread.sleep(1000); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/MonitorEnter.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | public class MonitorEnter { 4 | 5 | public static void main(String[] args) { 6 | Jfr.start("jdk.CPUInformation"); 7 | 8 | // while (true) { 9 | // innerMethod(); 10 | // } 11 | } 12 | 13 | private static void innerMethod() { 14 | System.out.println("Protected Area - " + Thread.currentThread().getName()); 15 | int i = 1; 16 | System.out.println(i); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /GC_PHASE_CONCURRENT.md: -------------------------------------------------------------------------------- 1 | # GC PHASE CONCURRENT 2 | 3 | ``` 4 | jdk.GCPhaseConcurrent { 5 | startTime = 12:41:53.363 6 | duration = 0.0299 ms 7 | gcId = 138 8 | name = "Concurrent Clear Claimed Marks" 9 | } 10 | 11 | 12 | jdk.GCPhaseConcurrent { 13 | startTime = 12:41:53.363 14 | duration = 15.0 ms 15 | gcId = 138 16 | name = "Concurrent Scan Root Regions" 17 | } 18 | 19 | 20 | jdk.GCPhaseConcurrent { 21 | startTime = 12:41:53.378 22 | duration = 265 ms 23 | gcId = 138 24 | name = "Concurrent Mark From Roots" 25 | } 26 | ``` -------------------------------------------------------------------------------- /GC_PROMOTION.md: -------------------------------------------------------------------------------- 1 | # GC_PROMOTION 2 | 3 | ``` 4 | jdk.PromoteObjectInNewPLAB { 5 | startTime = 12:18:49.302 6 | gcId = 200 7 | objectClass = pbouda.jfr.AllocationStress$Contact (classLoader = app) 8 | objectSize = 24 bytes 9 | tenuringAge = 0 10 | tenured = true 11 | plabSize = 30.9 kB 12 | } 13 | ``` 14 | 15 | ``` 16 | jdk.PromoteObjectOutsidePLAB { 17 | startTime = 12:19:53.604 18 | gcId = 210 19 | objectClass = pbouda.jfr.AllocationStress$Contact[] (classLoader = app) 20 | objectSize = 322.9 kB 21 | tenuringAge = 0 22 | tenured = false 23 | } 24 | ``` -------------------------------------------------------------------------------- /GC_REFERENCES.md: -------------------------------------------------------------------------------- 1 | # GC_REFERENCES 2 | 3 | - `jdk.GCReferenceStatistics` 4 | 5 | ``` 6 | jdk.GCReferenceStatistics { 7 | startTime = 10:56:48.668 8 | gcId = 268 9 | type = "Soft reference" 10 | count = 0 11 | } 12 | 13 | 14 | jdk.GCReferenceStatistics { 15 | startTime = 10:56:48.668 16 | gcId = 268 17 | type = "Weak reference" 18 | count = 227 19 | } 20 | 21 | 22 | jdk.GCReferenceStatistics { 23 | startTime = 10:56:48.668 24 | gcId = 268 25 | type = "Final reference" 26 | count = 0 27 | } 28 | 29 | 30 | jdk.GCReferenceStatistics { 31 | startTime = 10:56:48.668 32 | gcId = 268 33 | type = "Phantom reference" 34 | count = 5 35 | } 36 | ``` -------------------------------------------------------------------------------- /GC_EVACUATION.md: -------------------------------------------------------------------------------- 1 | # GC_EVACUATION 2 | 3 | - `jdk.EvacuationFailed` 4 | - `jdk.EvacuationInformation` 5 | 6 | ``` 7 | jdk.EvacuationFailed { 8 | startTime = 10:59:35.351 9 | gcId = 252 10 | evacuationFailed = { 11 | objectCount = 23812 12 | firstSize = 3 bytes 13 | smallestSize = 3 bytes 14 | totalSize = 97.6 kB 15 | } 16 | } 17 | 18 | 19 | jdk.EvacuationInformation { 20 | startTime = 10:59:35.351 21 | gcId = 252 22 | cSetRegions = 12 23 | cSetUsedBefore = 12.0 MB 24 | cSetUsedAfter = 10.0 MB 25 | allocationRegions = 7 26 | allocationRegionsUsedBefore = 0 bytes 27 | allocationRegionsUsedAfter = 7.0 MB 28 | bytesCopied = 7.0 MB 29 | regionsFreed = 2 30 | } 31 | ``` -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/ThreadAllocation.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | import java.util.concurrent.Executors; 4 | import java.util.concurrent.TimeUnit; 5 | 6 | public class ThreadAllocation { 7 | 8 | public static void main(String[] args) throws InterruptedException { 9 | Jfr.start("jdk.OldObjectSample"); 10 | 11 | var scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("allocator")); 12 | scheduler.scheduleWithFixedDelay(ThreadAllocation::allocate, 0, 10, TimeUnit.MILLISECONDS); 13 | 14 | Thread.currentThread().join(); 15 | } 16 | 17 | private static String allocate() { 18 | byte[] allocation = new byte[1024 * 512]; 19 | return new String(allocation); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/FileJFR.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | import java.io.IOException; 4 | import java.nio.file.Files; 5 | import java.nio.file.Path; 6 | 7 | public class FileJFR { 8 | 9 | public static void main(String[] args) throws IOException, InterruptedException { 10 | // Jfr.start("jdk.FileRead", "jdk.FileWrite", "jdk.FileForce"); 11 | Jfr.start("jdk.NativeMethodSample"); 12 | Path movie = Path.of("/home/pbouda/movie.avi"); 13 | 14 | Thread.sleep(5_000); 15 | 16 | byte[] bytes = Files.readAllBytes(movie); 17 | 18 | Thread.sleep(5_000); 19 | 20 | Files.write(Path.of("/home/pbouda/copy.avi"), bytes); 21 | 22 | Thread.sleep(5_000); 23 | 24 | System.out.println("COMPLETED - " + bytes.length); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /RESERVED_STACK.md: -------------------------------------------------------------------------------- 1 | # RESERVED_STACK_ALLOCATION 2 | 3 | `jdk.ReservedStackActivation` 4 | 5 | ``` 6 | Reserve extra space on thread stacks for use by critical sections, 7 | so that they can complete even when stack overflows occur. 8 | ``` 9 | 10 | ``` 11 | Provide a mechanism to mitigate the risk of deadlocks caused by 12 | the corruption of critical data such as java.util.concurrent locks 13 | (such as ReentrantLock) caused by a StackOverflowError being 14 | thrown in a critical section. 15 | 16 | The solution must be mostly JVM-based in order not to require 17 | modifications to java.util.concurrent algorithms or published 18 | interfaces, or existing library and application code. 19 | 20 | The solution must not be limited to the ReentrantLock case, 21 | and should be applicable to any critical section in privileged code. 22 | ``` -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/Certificates.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | import java.net.URI; 4 | import java.net.http.HttpClient; 5 | import java.net.http.HttpRequest; 6 | import java.net.http.HttpResponse; 7 | 8 | public class Certificates { 9 | 10 | public static void main(String[] args) throws InterruptedException { 11 | Jfr.start("jdk.TLSHandshake", "jdk.X509Validation"); 12 | 13 | HttpClient client = HttpClient.newHttpClient(); 14 | HttpRequest request = HttpRequest.newBuilder() 15 | .uri(URI.create("https://www.google.cz/")) 16 | .build(); 17 | client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) 18 | .thenApply(HttpResponse::body) 19 | .thenAccept(System.out::println) 20 | .join(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/SocketClient.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | import java.io.DataInputStream; 4 | import java.io.DataOutputStream; 5 | import java.net.Socket; 6 | import java.util.Scanner; 7 | 8 | public class SocketClient { 9 | public static void main(String[] args) throws Exception{ 10 | Jfr.start("jdk.SocketRead", "jdk.SocketWrite"); 11 | Scanner scn = new Scanner(System.in); 12 | 13 | try (Socket socket = new Socket("localhost", 5056); 14 | DataInputStream dis = new DataInputStream(socket.getInputStream()); 15 | DataOutputStream dos = new DataOutputStream(socket.getOutputStream())) { 16 | 17 | while (true) { 18 | System.out.println(dis.readUTF()); 19 | String name = scn.nextLine(); 20 | dos.writeUTF(name); 21 | 22 | String received = dis.readUTF(); 23 | System.out.println(received); 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | pbouda 8 | jfr-playground 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 3.8.1 13 | UTF-8 14 | 15 | 16 | 17 | 18 | 19 | org.apache.maven.plugins 20 | maven-compiler-plugin 21 | ${maven-compiler-plugin.version} 22 | 23 | 14 24 | 14 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /EXCEPTION.md: -------------------------------------------------------------------------------- 1 | # EXCEPTION 2 | 3 | #### JAVA_EXCEPTION_STATISTICS 4 | 5 | - `#period: 1000 ms` 6 | 7 | ``` 8 | jdk.ExceptionStatistics { 9 | startTime = 15:56:23.646 10 | throwables = 11 11 | eventThread = "JFR Periodic Tasks" (javaThreadId = 16) 12 | } 13 | ``` 14 | 15 | #### JAVA_EXCEPTION_THROW 16 | 17 | - by default `disabled` 18 | 19 | ``` 20 | jdk.JavaExceptionThrow { 21 | startTime = 15:56:23.949 22 | message = "My Exception" 23 | thrownClass = java.lang.Exception (classLoader = bootstrap) 24 | eventThread = "main" (javaThreadId = 1) 25 | stackTrace = [ 26 | java.lang.Throwable.(String) line: 274 27 | java.lang.Exception.(String) line: 67 28 | pbouda.jfr.Exceptions.main(String[]) line: 10 29 | ] 30 | } 31 | ``` 32 | 33 | #### JAVA_ERROR_THROW 34 | 35 | - by default `enabled` 36 | 37 | ``` 38 | jdk.JavaErrorThrow { 39 | startTime = 15:58:31.383 40 | message = "My Error" 41 | thrownClass = java.lang.Error (classLoader = bootstrap) 42 | eventThread = "main" (javaThreadId = 1) 43 | stackTrace = [ 44 | java.lang.Error.(String) line: 72 45 | pbouda.jfr.Exceptions.main(String[]) line: 10 46 | ] 47 | } 48 | ``` -------------------------------------------------------------------------------- /VM_OPTIONS.md: -------------------------------------------------------------------------------- 1 | # VM_OPTIONS 2 | 3 | - VM Options loaded at the startup 4 | - Possibility to handle changes of `Ergonomic` options 5 | 6 | ``` 7 | jdk.IntFlag#enabled: true 8 | jdk.IntFlag#period: beginChunk 9 | jdk.UnsignedIntFlag#enabled: true 10 | jdk.UnsignedIntFlag#period: beginChunk 11 | jdk.LongFlag#enabled: true 12 | jdk.LongFlag#period: beginChunk 13 | jdk.UnsignedLongFlag#enabled: true 14 | jdk.UnsignedLongFlag#period: beginChunk 15 | jdk.DoubleFlag#enabled: true 16 | jdk.DoubleFlag#period: beginChunk 17 | jdk.BooleanFlag#enabled: true 18 | jdk.BooleanFlag#period: beginChunk 19 | jdk.StringFlag#enabled: true 20 | jdk.StringFlag#period: beginChunk 21 | 22 | jdk.IntFlagChanged#enabled: true 23 | jdk.UnsignedIntFlagChanged#enabled: true 24 | jdk.LongFlagChanged#enabled: true 25 | jdk.UnsignedLongFlagChanged#enabled: true 26 | jdk.DoubleFlagChanged#enabled: true 27 | jdk.BooleanFlagChanged#enabled: true 28 | jdk.StringFlagChanged#enabled: true 29 | ``` 30 | 31 | ``` 32 | jdk.LongFlag { 33 | startTime = 09:52:40.647 34 | name = "ObjectAlignmentInBytes" 35 | value = 8 36 | origin = "Default" 37 | } 38 | 39 | jdk.LongFlag { 40 | startTime = 09:52:40.647 41 | name = "CICompilerCount" 42 | value = 4 43 | origin = "Ergonomic" 44 | } 45 | 46 | ... 47 | ``` -------------------------------------------------------------------------------- /GC_G1_REGIONS.md: -------------------------------------------------------------------------------- 1 | #### HEAP REGIONS 2 | 3 | - type of the region changed 4 | - after the evacuation OLD Region change to FREE Region 5 | 6 | ``` 7 | jdk.G1HeapRegionTypeChange { 8 | startTime = 12:27:05.633 9 | index = 224 10 | from = "Old" 11 | to = "Free" 12 | start = 0xFE000000 13 | used = 0 bytes 14 | } 15 | ``` 16 | 17 | - FREE Region changed to EDEN type 18 | 19 | ``` 20 | jdk.G1HeapRegionTypeChange { 21 | startTime = 12:27:07.590 22 | index = 246 23 | from = "Free" 24 | to = "Eden" 25 | start = 0xFF600000 26 | used = 0 bytes 27 | } 28 | ``` 29 | 30 | #### HEAP REGION INFORMATION 31 | 32 | ``` 33 | jdk.G1HeapRegionInformation { 34 | startTime = 12:30:33.773 35 | index = 70 36 | type = "Old" 37 | start = 0xF4600000 38 | used = 1024.0 kB 39 | } 40 | 41 | 42 | jdk.G1HeapRegionInformation { 43 | startTime = 12:30:33.773 44 | index = 71 45 | type = "Free" 46 | start = 0xF4700000 47 | used = 0 bytes 48 | } 49 | 50 | 51 | jdk.G1HeapRegionInformation { 52 | startTime = 12:30:33.773 53 | index = 254 54 | type = "OpenArchive" 55 | start = 0xFFE00000 56 | used = 328.0 kB 57 | } 58 | 59 | 60 | jdk.G1HeapRegionInformation { 61 | startTime = 12:30:33.773 62 | index = 255 63 | type = "ClosedArchive" 64 | start = 0xFFF00000 65 | used = 504.0 kB 66 | } 67 | ``` -------------------------------------------------------------------------------- /HEAP.md: -------------------------------------------------------------------------------- 1 | # HEAP 2 | 3 | ``` 4 | jdk.GCHeapSummary#enabled: true 5 | jdk.PSHeapSummary#enabled: true 6 | jdk.G1HeapSummary#enabled: true 7 | ``` 8 | 9 | #### HEAP_SUMMARY 10 | 11 | ``` 12 | jdk.GCHeapSummary { 13 | startTime = 12:13:47.734 14 | gcId = 15 15 | when = "Before GC" 16 | heapSpace = { 17 | start = 0xC0000000 18 | committedEnd = 0xE8200000 19 | committedSize = 642.0 MB 20 | reservedEnd = 0x100000000 21 | reservedSize = 1.0 GB 22 | } 23 | heapUsed = 427.8 MB 24 | } 25 | 26 | 27 | jdk.GCHeapSummary { 28 | startTime = 12:13:47.771 29 | gcId = 15 30 | when = "After GC" 31 | heapSpace = { 32 | start = 0xC0000000 33 | committedEnd = 0xEE300000 34 | committedSize = 739.0 MB 35 | reservedEnd = 0x100000000 36 | reservedSize = 1.0 GB 37 | } 38 | heapUsed = 332.8 MB 39 | } 40 | ``` 41 | 42 | #### G1_HEAP_SUMMARY 43 | 44 | ``` 45 | jdk.G1HeapSummary { 46 | startTime = 12:13:47.734 47 | gcId = 15 48 | when = "Before GC" 49 | edenUsedSize = 151.0 MB 50 | edenTotalSize = 152.0 MB 51 | survivorUsedSize = 24.0 MB 52 | numberOfRegions = 642 53 | } 54 | 55 | 56 | jdk.G1HeapSummary { 57 | startTime = 12:13:47.771 58 | gcId = 15 59 | when = "After GC" 60 | edenUsedSize = 0 bytes 61 | edenTotalSize = 163.0 MB 62 | survivorUsedSize = 22.0 MB 63 | numberOfRegions = 739 64 | } 65 | ``` -------------------------------------------------------------------------------- /GC_CONFIGURATION.md: -------------------------------------------------------------------------------- 1 | # GARBAGE_COLLECTION 2 | 3 | ### Configuration 4 | 5 | - `jdk.GCConfiguration` 6 | - `jdk.GCHeapConfiguration` 7 | - `jdk.YoungGenerationConfiguration` 8 | - `jdk.GCTLABConfiguration` 9 | - `jdk.GCSurvivorConfiguration` 10 | - execution: `#period: beginChunk` 11 | 12 | ``` 13 | jdk.GCConfiguration { 14 | startTime = 23:38:17.951 15 | youngCollector = "G1New" 16 | oldCollector = "G1Old" 17 | parallelGCThreads = 8 18 | concurrentGCThreads = 2 19 | usesDynamicGCThreads = true 20 | isExplicitGCConcurrent = false 21 | isExplicitGCDisabled = false 22 | pauseTarget = N/A 23 | gcTimeRatio = 12 24 | } 25 | 26 | 27 | jdk.GCSurvivorConfiguration { 28 | startTime = 23:38:17.951 29 | maxTenuringThreshold = 15 30 | initialTenuringThreshold = 7 31 | } 32 | 33 | 34 | jdk.GCTLABConfiguration { 35 | startTime = 23:38:17.951 36 | usesTLABs = true 37 | minTLABSize = 2.0 kB 38 | tlabRefillWasteLimit = 64 bytes 39 | } 40 | 41 | 42 | jdk.GCHeapConfiguration { 43 | startTime = 23:38:17.951 44 | minSize = 8.0 MB 45 | maxSize = 4.8 GB 46 | initialSize = 310.0 MB 47 | usesCompressedOops = true 48 | compressedOopsMode = "Zero based" 49 | objectAlignment = 8 bytes 50 | heapAddressBits = 32 51 | } 52 | 53 | 54 | jdk.YoungGenerationConfiguration { 55 | startTime = 23:38:17.951 56 | minSize = 1.3 MB 57 | maxSize = 2.9 GB 58 | newRatio = 2 59 | } 60 | ``` -------------------------------------------------------------------------------- /SYSTEM.md: -------------------------------------------------------------------------------- 1 | # SYSTEM 2 | 3 | #### SYSTEM_PROCESS 4 | 5 | - `#period: endChunk` 6 | - set of all system processes 7 | 8 | ``` 9 | jdk.SystemProcess { 10 | startTime = 16:10:52.744 11 | pid = "2500" 12 | commandLine = "/home/pbouda/.local/share/JetBrains/Toolbox/bin/jetbrains-toolbox --minimize " 13 | } 14 | 15 | 16 | jdk.SystemProcess { 17 | startTime = 16:10:52.744 18 | pid = "2496" 19 | commandLine = "usr/share/jetbrains-toolbox/jetbrains-toolbox --minimize " 20 | } 21 | 22 | 23 | jdk.SystemProcess { 24 | startTime = 16:10:52.744 25 | pid = "6772" 26 | commandLine = "/opt/google/chrome/chrome --type=renderer --disable-webrtc-apm-in-audio-service --field-trial-handle=9262132349396412343,11079563146144832410,131072 --lang=en-US --disable-oor-cors --enable-auto-reload --num-raster-threads=4 --enable-main-frame-before-activation --service-request-channel-token=8394591454617458873 --renderer-client-id=745 --no-v8-untrusted-code-mitigations --shared-files=v8_context_snapshot_data:100,v8_natives_data:101 " 27 | } 28 | 29 | ... 30 | ``` 31 | 32 | #### NETWORK_UTILIZATION 33 | 34 | - `#period: 5 s` 35 | 36 | ``` 37 | jdk.NetworkUtilization { 38 | startTime = 16:14:21.542 39 | networkInterface = "wlp61s0" 40 | readRate = 376 bps 41 | writeRate = 720 bps 42 | } 43 | ``` 44 | 45 | #### PHYSICAL_MEMORY 46 | 47 | - `#period: everyChunk` 48 | 49 | ``` 50 | jdk.PhysicalMemory { 51 | startTime = 16:14:10.605 52 | totalSize = 19.4 GB 53 | usedSize = 16.4 GB 54 | } 55 | ``` 56 | -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/NamedThreadFactory.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | import java.util.concurrent.ThreadFactory; 4 | import java.util.concurrent.atomic.AtomicInteger; 5 | 6 | public class NamedThreadFactory implements ThreadFactory { 7 | 8 | private final AtomicInteger counter = new AtomicInteger(); 9 | private final String prefix; 10 | private final Thread.UncaughtExceptionHandler exceptionHandler; 11 | 12 | /** 13 | * Creates new ThreadFactory instance with a predefined prefix of a thread's name. 14 | * 15 | * @param prefix thread's prefix. 16 | */ 17 | public NamedThreadFactory(String prefix) { 18 | this(prefix, null); 19 | } 20 | 21 | /** 22 | * Creates new ThreadFactory instance with a predefined prefix of a thread's name and a handler when completes 23 | * exceptionally. 24 | * 25 | * @param prefix thread's prefix. 26 | * @param exceptionHandler handler to process when thread completes exceptionally. 27 | */ 28 | public NamedThreadFactory(String prefix, Thread.UncaughtExceptionHandler exceptionHandler) { 29 | this.prefix = prefix; 30 | this.exceptionHandler = exceptionHandler; 31 | } 32 | 33 | @Override 34 | public Thread newThread(Runnable runnable) { 35 | Thread thread = new Thread(runnable, prefix + "-" + counter.getAndIncrement()); 36 | if (exceptionHandler != null) { 37 | thread.setUncaughtExceptionHandler(exceptionHandler); 38 | } 39 | return thread; 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/SocketServer.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | import java.io.DataInputStream; 4 | import java.io.DataOutputStream; 5 | import java.io.IOException; 6 | import java.net.ServerSocket; 7 | import java.net.Socket; 8 | 9 | public class SocketServer { 10 | public static void main(String[] args) throws IOException { 11 | Jfr.start("jdk.SocketRead", "jdk.SocketWrite"); 12 | 13 | try (ServerSocket ss = new ServerSocket(5056)) { 14 | while (true) { 15 | Socket socket = ss.accept(); 16 | System.out.println("A new client is connected : " + socket); 17 | 18 | new ClientHandler(socket).start(); 19 | } 20 | } 21 | } 22 | 23 | 24 | private static class ClientHandler extends Thread { 25 | private final Socket socket; 26 | 27 | public ClientHandler(Socket socket) { 28 | this.socket = socket; 29 | } 30 | 31 | @Override 32 | public void run() { 33 | try (DataInputStream dis = new DataInputStream(socket.getInputStream()); 34 | DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 35 | socket) { 36 | 37 | while (true) { 38 | dos.writeUTF("Tell me your name"); 39 | String name = dis.readUTF(); 40 | dos.writeUTF("Hello " + name); 41 | } 42 | } catch (IOException e) { 43 | e.printStackTrace(); 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /GC_G1_SPECIFIC.md: -------------------------------------------------------------------------------- 1 | # G1_SPECIFIC 2 | 3 | ``` 4 | jdk.G1EvacuationYoungStatistics { 5 | startTime = 11:02:49.668 6 | statistics = { 7 | gcId = 146 8 | allocated = 2.0 MB 9 | wasted = 800 bytes 10 | used = 2.0 MB 11 | undoWaste = 0 bytes 12 | regionEndWaste = 0 bytes 13 | regionsRefilled = 2 bytes 14 | directAllocated = 0 bytes 15 | failureUsed = 0 bytes 16 | failureWaste = 0 bytes 17 | } 18 | } 19 | 20 | 21 | jdk.G1EvacuationOldStatistics { 22 | startTime = 11:02:49.668 23 | statistics = { 24 | gcId = 146 25 | allocated = 5.8 MB 26 | wasted = 1.0 kB 27 | used = 5.8 MB 28 | undoWaste = 0 bytes 29 | regionEndWaste = 21.0 kB 30 | regionsRefilled = 7 bytes 31 | directAllocated = 220.5 kB 32 | failureUsed = 3.9 MB 33 | failureWaste = 6.1 MB 34 | } 35 | } 36 | 37 | 38 | jdk.G1MMU { 39 | startTime = 11:02:49.668 40 | gcId = 146 41 | timeSlice = 201 ms 42 | gcTime = 66.0 ms 43 | pauseTarget = 200 ms 44 | } 45 | ``` 46 | 47 | #### G1 SPECIFIC EVENTS 48 | 49 | ``` 50 | jdk.G1GarbageCollection { 51 | startTime = 00:06:26.297 52 | duration = 8.54 ms 53 | gcId = 206 54 | type = "During Mark" 55 | } 56 | 57 | 58 | jdk.G1GarbageCollection { 59 | startTime = 00:06:26.547 60 | duration = 19.1 ms 61 | gcId = 208 62 | type = "Normal" 63 | } 64 | 65 | 66 | jdk.G1GarbageCollection { 67 | startTime = 00:06:26.572 68 | duration = 11.2 ms 69 | gcId = 209 70 | type = "Initial Mark" 71 | } 72 | 73 | ``` 74 | 75 | #### CONCURRENT_MODE_FAILURE 76 | 77 | ``` 78 | jdk.ConcurrentModeFailure { 79 | startTime = 12:21:08.568 80 | gcId = 267 81 | } 82 | ``` -------------------------------------------------------------------------------- /MODULE.md: -------------------------------------------------------------------------------- 1 | # MODULE 2 | 3 | - `#period: endChunk` 4 | 5 | #### MODULE_REQUIRE 6 | 7 | ``` 8 | jdk.ModuleRequire { 9 | startTime = 16:36:17.394 10 | source = { 11 | name = "java.transaction.xa" 12 | version = "14-ea" 13 | location = "jrt:/java.transaction.xa" 14 | classLoader = jdk.internal.loader.ClassLoaders$PlatformClassLoader (id = 4) 15 | } 16 | requiredModule = { 17 | name = "java.base" 18 | version = "14-ea" 19 | location = "jrt:/java.base" 20 | classLoader = null } 21 | } 22 | 23 | 24 | jdk.ModuleRequire { 25 | startTime = 16:36:17.394 26 | source = { 27 | name = "jdk.charsets" 28 | version = "14-ea" 29 | location = "jrt:/jdk.charsets" 30 | classLoader = jdk.internal.loader.ClassLoaders$PlatformClassLoader (id = 4) 31 | } 32 | requiredModule = { 33 | name = "java.base" 34 | version = "14-ea" 35 | location = "jrt:/java.base" 36 | classLoader = null } 37 | } 38 | 39 | ... 40 | ``` 41 | 42 | #### MODULE_EXPORT 43 | 44 | ``` 45 | jdk.ModuleExport { 46 | startTime = 16:38:34.186 47 | exportedPackage = { 48 | name = "javax/swing/colorchooser" 49 | module = { 50 | name = "java.desktop" 51 | version = "14-ea" 52 | location = "jrt:/java.desktop" 53 | classLoader = null } 54 | exported = true 55 | } 56 | targetModule = N/A 57 | } 58 | 59 | 60 | jdk.ModuleExport { 61 | startTime = 16:38:34.186 62 | exportedPackage = { 63 | name = "java/time/format" 64 | module = { 65 | name = "java.base" 66 | version = "14-ea" 67 | location = "jrt:/java.base" 68 | classLoader = null } 69 | exported = true 70 | } 71 | targetModule = N/A 72 | } 73 | 74 | ... 75 | ``` -------------------------------------------------------------------------------- /NATIVE.md: -------------------------------------------------------------------------------- 1 | # NATIVE 2 | 3 | #### NATIVE_METHOD_SAMPLE 4 | 5 | - `#period: 20 ms` 6 | - `ctrl-break` just waits on read operation 7 | 8 | ``` 9 | jdk.NativeMethodSample { 10 | startTime = 16:02:33.251 11 | sampledThread = "Monitor Ctrl-Break" (javaThreadId = 12) 12 | state = "STATE_RUNNABLE" 13 | stackTrace = [ 14 | sun.nio.ch.SocketDispatcher.read0(FileDescriptor, long, int) line: 0 15 | sun.nio.ch.SocketDispatcher.read(FileDescriptor, long, int) line: 0 16 | sun.nio.ch.NioSocketImpl.tryRead(FileDescriptor, byte[], int, int) line: 0 17 | sun.nio.ch.NioSocketImpl.implRead(byte[], int, int) line: 0 18 | sun.nio.ch.NioSocketImpl.read(byte[], int, int) line: 0 19 | ... 20 | ] 21 | } 22 | 23 | 24 | jdk.NativeMethodSample { 25 | startTime = 16:02:33.304 26 | sampledThread = "main" (javaThreadId = 1) 27 | state = "STATE_RUNNABLE" 28 | stackTrace = [ 29 | sun.nio.ch.FileDispatcherImpl.read0(FileDescriptor, long, int) line: 0 30 | sun.nio.ch.FileDispatcherImpl.read(FileDescriptor, long, int) line: 0 31 | sun.nio.ch.IOUtil.readIntoNativeBuffer(FileDescriptor, ByteBuffer, long, boolean, int, NativeDispatcher) line: 0 32 | sun.nio.ch.IOUtil.read(FileDescriptor, ByteBuffer, long, boolean, int, NativeDispatcher) line: 0 33 | sun.nio.ch.FileChannelImpl.read(ByteBuffer) line: 0 34 | ... 35 | ] 36 | } 37 | ``` 38 | 39 | #### NATIVE_LIBRARY 40 | 41 | ``` 42 | jdk.NativeLibrary { 43 | startTime = 16:05:56.569 44 | name = "13502329" 45 | baseAddress = 0x00400000 46 | topAddress = 0x00401000 47 | } 48 | 49 | 50 | jdk.NativeLibrary { 51 | startTime = 16:05:56.569 52 | name = "13502329" 53 | baseAddress = 0x00401000 54 | topAddress = 0x00402000 55 | } 56 | 57 | ... 58 | ``` -------------------------------------------------------------------------------- /JFR_EVENTS.md: -------------------------------------------------------------------------------- 1 | # JFR_EVENTS 2 | 3 | ``` 4 | jdk.ActiveRecording#enabled: true 5 | jdk.ActiveSetting#enabled: true 6 | jdk.Flush#enabled: true 7 | jdk.Flush#threshold: 0 ns 8 | jdk.FlushStorage#enabled: true 9 | jdk.FlushStorage#threshold: 0 ns 10 | jdk.FlushStacktrace#enabled: true 11 | jdk.FlushStacktrace#threshold: 0 ns 12 | jdk.FlushStringPool#enabled: true 13 | jdk.FlushStringPool#threshold: 0 ns 14 | jdk.FlushMetadata#enabled: true 15 | jdk.FlushMetadata#threshold: 0 ns 16 | jdk.FlushTypeSet#enabled: true 17 | jdk.FlushTypeSet#threshold: 0 ns 18 | jdk.DataLoss#enabled: true 19 | jdk.DumpReason#enabled: true 20 | ``` 21 | 22 | ``` 23 | jdk.ActiveRecording { 24 | startTime = 16:19:41.508 25 | id = 1 26 | name = "1" 27 | destination = N/A 28 | maxAge = 106751991167 d 7 h 29 | flushInterval = 1.00 s 30 | maxSize = 0 bytes 31 | recordingStart = 16:19:41.237 32 | recordingDuration = 106751991167 d 7 h 33 | eventThread = "jfr-0" (javaThreadId = 14) 34 | } 35 | ``` 36 | 37 | ``` 38 | jdk.Flush { 39 | startTime = 16:19:42.336 40 | duration = 1.60 ms 41 | flushId = 1 42 | elements = 1148 43 | size = 284.8 kB 44 | } 45 | ``` 46 | 47 | 48 | ``` 49 | jdk.FlushStorage { 50 | startTime = 16:22:13.454 51 | duration = 1.55 ms 52 | flushId = 3 53 | elements = 21 54 | size = 263.4 kB 55 | } 56 | ``` 57 | 58 | ``` 59 | jdk.FlushStacktrace { 60 | startTime = 16:22:13.455 61 | duration = 0.218 ms 62 | flushId = 3 63 | elements = 9 64 | size = 938 bytes 65 | } 66 | ``` 67 | 68 | ``` 69 | jdk.FlushMetadata { 70 | startTime = 16:23:36.835 71 | duration = 0.136 ms 72 | flushId = 1 73 | elements = 1 74 | size = 80.5 kB 75 | } 76 | ``` 77 | 78 | ``` 79 | jdk.FlushTypeSet { 80 | startTime = 16:23:36.835 81 | duration = 0.816 ms 82 | flushId = 1 83 | elements = 1013 84 | size = 23.0 kB 85 | } 86 | ``` -------------------------------------------------------------------------------- /TABLES.md: -------------------------------------------------------------------------------- 1 | ``` 2 | jdk.SymbolTableStatistics { 3 | startTime = 16:32:55.983 4 | bucketCount = 32768 5 | entryCount = 10363 6 | totalFootprint = 798.8 kB 7 | bucketCountMaximum = 4 8 | bucketCountAverage = 0.31625366 9 | bucketCountVariance = 0.31322214 10 | bucketCountStandardDeviation = 0.5596625 11 | insertionRate = 2551.0 12 | removalRate = 2.0 13 | } 14 | 15 | 16 | jdk.StringTableStatistics { 17 | startTime = 16:32:55.985 18 | bucketCount = 65536 19 | entryCount = 2221 20 | totalFootprint = 686.5 kB 21 | bucketCountMaximum = 2 22 | bucketCountAverage = 0.03388977 23 | bucketCountVariance = 0.03353471 24 | bucketCountStandardDeviation = 0.18312486 25 | insertionRate = 1468.0 26 | removalRate = 0.0 27 | } 28 | 29 | 30 | jdk.PlaceholderTableStatistics { 31 | startTime = 16:32:55.985 32 | bucketCount = 1009 33 | entryCount = 0 34 | totalFootprint = 7.9 kB 35 | bucketCountMaximum = 0 36 | bucketCountAverage = 0.0 37 | bucketCountVariance = 0.0 38 | bucketCountStandardDeviation = 0.0 39 | insertionRate = 235.0 40 | removalRate = 235.0 41 | } 42 | 43 | 44 | jdk.LoaderConstraintsTableStatistics { 45 | startTime = 16:32:55.985 46 | bucketCount = 107 47 | entryCount = 14 48 | totalFootprint = 1.2 kB 49 | bucketCountMaximum = 2 50 | bucketCountAverage = 0.13084112 51 | bucketCountVariance = 0.1511049 52 | bucketCountStandardDeviation = 0.38872215 53 | insertionRate = 1.0 54 | removalRate = 0.0 55 | } 56 | 57 | 58 | jdk.ProtectionDomainCacheTableStatistics { 59 | startTime = 16:32:55.985 60 | bucketCount = 1009 61 | entryCount = 3 62 | totalFootprint = 8.0 kB 63 | bucketCountMaximum = 1 64 | bucketCountAverage = 0.0029732408 65 | bucketCountVariance = 0.0029644007 66 | bucketCountStandardDeviation = 0.05444631 67 | insertionRate = 1.0 68 | removalRate = 0.0 69 | } 70 | ``` -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/Jfr.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | import jdk.jfr.Configuration; 4 | import jdk.jfr.consumer.EventStream; 5 | import jdk.jfr.consumer.RecordingStream; 6 | 7 | import java.io.IOException; 8 | import java.nio.file.Path; 9 | import java.text.ParseException; 10 | import java.util.concurrent.ExecutorService; 11 | import java.util.concurrent.Executors; 12 | 13 | public class Jfr { 14 | 15 | public static void main(String[] args) throws InterruptedException { 16 | Jfr.start("jdk.LongFlag"); 17 | Thread.currentThread().join(); 18 | } 19 | 20 | public static void start(String... events) { 21 | Configuration config; 22 | try { 23 | config = Configuration.create(Path.of("custom-profile.xml")); 24 | // config = Configuration.getConfiguration("profile"); 25 | } catch (IOException | ParseException e) { 26 | throw new RuntimeException(e); 27 | } 28 | 29 | System.out.println(config.getDescription()); 30 | System.out.println("settings:"); 31 | config.getSettings().forEach((key, value) -> System.out.println(key + ": " + value)); 32 | 33 | ExecutorService executor = Executors.newSingleThreadExecutor(new NamedThreadFactory("jfr")); 34 | executor.submit(() -> { 35 | try (EventStream es = new RecordingStream(config)) { 36 | for (String event : events) { 37 | es.onEvent(event, System.out::println); 38 | } 39 | 40 | Runtime.getRuntime().addShutdownHook(new Thread(() -> { 41 | try { 42 | es.awaitTermination(); 43 | } catch (InterruptedException e) { 44 | e.printStackTrace(); 45 | } 46 | })); 47 | 48 | es.start(); 49 | } 50 | }); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /GC_G1_IHOP.md: -------------------------------------------------------------------------------- 1 | # IHOP (The Initiating Heap Occupancy Percent) 2 | 3 | The Initiating Heap Occupancy Percent (IHOP) is the threshold at which an 4 | Initial Mark collection is triggered and it is defined as a percentage of 5 | the old generation size. 6 | 7 | G1 by default automatically determines an optimal IHOP by observing how 8 | long marking takes and how much memory is typically allocated in the old 9 | generation during marking cycles. This feature is called Adaptive IHOP. 10 | If this feature is active, then the option `-XX:InitiatingHeapOccupancyPercent` 11 | determines the initial value as a percentage of the size of the current old 12 | generation as long as there aren't enough observations to make a good 13 | prediction of the Initiating Heap Occupancy threshold. Turn off this 14 | behavior of G1 using the option `-XX:-G1UseAdaptiveIHOP`. In this case, 15 | the value of `-XX:InitiatingHeapOccupancyPercent` always determines this threshold. 16 | 17 | Internally, Adaptive IHOP tries to set the Initiating Heap Occupancy 18 | so that the first mixed garbage collection of the space-reclamation 19 | phase starts when the old generation occupancy is at a current maximum 20 | old generation size minus the value of `-XX:G1HeapReservePercent` as the 21 | extra buffer. 22 | 23 | 24 | ``` 25 | jdk.G1BasicIHOP { 26 | startTime = 11:06:11.545 27 | gcId = 201 28 | threshold = 115.2 MB 29 | thresholdPercentage = 45.00% 30 | targetOccupancy = 256.0 MB 31 | currentOccupancy = 121.9 MB 32 | recentMutatorAllocationSize = 31.2 MB 33 | recentMutatorDuration = 14.0 ms 34 | recentAllocationRate = 2.1 GB/s 35 | lastMarkingDuration = 0 s 36 | } 37 | 38 | 39 | jdk.G1AdaptiveIHOP { 40 | startTime = 11:06:11.545 41 | gcId = 201 42 | threshold = 115.2 MB 43 | thresholdPercentage = 52.94% 44 | ihopTargetOccupancy = 217.6 MB 45 | currentOccupancy = 40.0 MB 46 | additionalBufferSize = 121.9 MB 47 | predictedAllocationRate = 3.9 GB/s 48 | predictedMarkingDuration = 0 s 49 | predictionActive = false 50 | } 51 | 52 | ``` -------------------------------------------------------------------------------- /OLD_OBJECT_SAMPLE.md: -------------------------------------------------------------------------------- 1 | # OLD_OBJECT_SAMPLE 2 | 3 | - `jdk.OldObjectSample` 4 | - execution: `#cutoff: 0 ns` (how long to search for references) 5 | - JFR contains internal priority queue that keeps 256 objects (by default) 6 | - the priority becomes higher for neighbours when an object is garbage-collected 7 | - weak-references - objects are collected and automatically deleted from the queue 8 | - the latest ones (survivals) become `OldObjectSample` 9 | - paths-to-gc-roots you also get the reference chains: 10 | - `-XX:StartFlightRecording=path-to-gc-roots=true` 11 | - `jcmd JFR.dump path-to-gc-roots=true` 12 | - the number of objects to track: 13 | - `-XX:FlightRecordingOptions=old-object-queue-size=256` 14 | - dump the queue at the end of the recording. 15 | 16 | Information from the event: 17 | - Time of allocation 18 | - The thread doing the allocation 19 | - The last known heap usage at the time of allocation 20 | - Which can be used to plot the live set, 21 | even if we don’t have data from the time of allocation anymore 22 | - The allocation stack trace (In other words, where was this object allocated?) 23 | - The reference chain back to the GC root at the time of dumping the recording 24 | - In other words, who is still holding on to this object? 25 | - The address of the object 26 | 27 | ``` 28 | jdk.OldObjectSample { 29 | startTime = 14:21:37.294 30 | allocationTime = 14:21:36.222 31 | objectAge = 1.07 s 32 | lastKnownHeapUsage = 59.2 MB 33 | object = [ 34 | byte[31] 35 | ] 36 | arrayElements = 31 37 | root = N/A 38 | eventThread = "pool-1-thread-2" (javaThreadId = 16) 39 | stackTrace = [ 40 | jdk.internal.misc.Unsafe.allocateUninitializedArray(Class, int) line: 1387 41 | java.lang.StringConcatHelper.newArray(long) line: 458 42 | java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Object, long) 43 | java.lang.invoke.LambdaForm$MH.141200640.invoke(Object, int, Object) 44 | java.lang.invoke.Invokers$Holder.linkToTargetMethod(int, Object, Object) 45 | ... 46 | ] 47 | } 48 | ``` -------------------------------------------------------------------------------- /OBJECT_COUNT.md: -------------------------------------------------------------------------------- 1 | # OBJECT_COUNT 2 | 3 | ``` 4 | jdk.ObjectCount#enabled: false 5 | jdk.ObjectCount#period: everyChunk 6 | jdk.ObjectCountAfterGC#enabled: false 7 | ``` 8 | 9 | ``` 10 | jdk.ObjectCount { 11 | startTime = 12:18:00.960 12 | gcId = 19 13 | objectClass = int[] (classLoader = bootstrap) 14 | count = 1119 15 | totalSize = 4.0 MB 16 | } 17 | 18 | 19 | jdk.ObjectCountAfterGC { 20 | startTime = 12:18:00.960 21 | gcId = 19 22 | objectClass = int[] (classLoader = bootstrap) 23 | count = 1119 24 | totalSize = 4.0 MB 25 | } 26 | 27 | 28 | jdk.ObjectCount { 29 | startTime = 12:18:00.960 30 | gcId = 19 31 | objectClass = byte[] (classLoader = bootstrap) 32 | count = 2395455 33 | totalSize = 111.3 MB 34 | } 35 | 36 | 37 | jdk.ObjectCountAfterGC { 38 | startTime = 12:18:00.960 39 | gcId = 19 40 | objectClass = byte[] (classLoader = bootstrap) 41 | count = 2395455 42 | totalSize = 111.3 MB 43 | } 44 | 45 | 46 | jdk.ObjectCount { 47 | startTime = 12:18:00.960 48 | gcId = 19 49 | objectClass = pbouda.jfr.AllocationStress$Contact (classLoader = app) 50 | count = 1088824 51 | totalSize = 24.9 MB 52 | } 53 | 54 | 55 | jdk.ObjectCountAfterGC { 56 | startTime = 12:18:00.960 57 | gcId = 19 58 | objectClass = pbouda.jfr.AllocationStress$Contact (classLoader = app) 59 | count = 1088824 60 | totalSize = 24.9 MB 61 | } 62 | 63 | 64 | jdk.ObjectCount { 65 | startTime = 12:18:00.960 66 | gcId = 19 67 | objectClass = pbouda.jfr.AllocationStress$Contact[] (classLoader = app) 68 | count = 31 69 | totalSize = 5.7 MB 70 | } 71 | 72 | 73 | jdk.ObjectCountAfterGC { 74 | startTime = 12:18:00.960 75 | gcId = 19 76 | objectClass = pbouda.jfr.AllocationStress$Contact[] (classLoader = app) 77 | count = 31 78 | totalSize = 5.7 MB 79 | } 80 | 81 | 82 | jdk.ObjectCount { 83 | startTime = 12:18:00.960 84 | gcId = 19 85 | objectClass = java.lang.String (classLoader = bootstrap) 86 | count = 2193725 87 | totalSize = 50.2 MB 88 | } 89 | 90 | 91 | jdk.ObjectCountAfterGC { 92 | startTime = 12:18:00.960 93 | gcId = 19 94 | objectClass = java.lang.String (classLoader = bootstrap) 95 | count = 2193725 96 | totalSize = 50.2 MB 97 | } 98 | 99 | ``` -------------------------------------------------------------------------------- /SAFEPOINT.md: -------------------------------------------------------------------------------- 1 | # SAFEPOINT 2 | 3 | #### SAFEPOINT_START AND SAFEPOINT_END 4 | 5 | - `#threshold: 0 ms` 6 | 7 | ``` 8 | jdk.SafepointBegin { 9 | startTime = 11:09:07.380 10 | duration = 0.117 ms 11 | safepointId = 25 12 | totalThreadCount = 22 13 | jniCriticalThreadCount = 0 14 | eventThread = "VM Thread" (osThreadId = 18787) 15 | } 16 | 17 | 18 | jdk.SafepointEnd { 19 | startTime = 11:09:07.380 20 | duration = 0.0125 ms 21 | safepointId = 25 22 | eventThread = "VM Thread" (osThreadId = 18787) 23 | } 24 | 25 | 26 | jdk.SafepointBegin { 27 | startTime = 11:09:07.398 28 | duration = 0.130 ms 29 | safepointId = 26 30 | totalThreadCount = 22 31 | jniCriticalThreadCount = 0 32 | eventThread = "VM Thread" (osThreadId = 18787) 33 | } 34 | 35 | 36 | jdk.SafepointEnd { 37 | startTime = 11:09:07.548 38 | duration = 0.0216 ms 39 | safepointId = 26 40 | eventThread = "VM Thread" (osThreadId = 18787) 41 | } 42 | 43 | ... 44 | ``` 45 | 46 | #### SAFEPOINT_STATE_SYNCHRONIZATION 47 | 48 | ``` 49 | jdk.SafepointStateSynchronization { 50 | startTime = 11:12:40.809 51 | duration = 0.0832 ms 52 | safepointId = 19 53 | initialThreadCount = 5 54 | runningThreadCount = 0 55 | iterations = 3 56 | eventThread = "VM Thread" (osThreadId = 19116) 57 | } 58 | ``` 59 | 60 | #### SAFEPOINT_CLEANUP AND SAFEPOINT_CLEANUP_TASK 61 | 62 | ``` 63 | jdk.SafepointCleanupTask { 64 | startTime = 11:14:21.358 65 | duration = 0.000171 ms 66 | safepointId = 71 67 | name = "deflating global idle monitors" 68 | eventThread = "VM Thread" (osThreadId = 19278) 69 | } 70 | 71 | 72 | jdk.SafepointCleanupTask { 73 | startTime = 11:14:21.358 74 | duration = 0.000239 ms 75 | safepointId = 71 76 | name = "updating inline caches" 77 | eventThread = "VM Thread" (osThreadId = 19278) 78 | } 79 | 80 | 81 | jdk.SafepointCleanupTask { 82 | startTime = 11:14:21.358 83 | duration = 0.000220 ms 84 | safepointId = 71 85 | name = "compilation policy safepoint handler" 86 | eventThread = "VM Thread" (osThreadId = 19278) 87 | } 88 | 89 | 90 | jdk.SafepointCleanup { 91 | startTime = 11:14:21.358 92 | duration = 0.0222 ms 93 | safepointId = 71 94 | eventThread = "VM Thread" (osThreadId = 19278) 95 | } 96 | ``` -------------------------------------------------------------------------------- /EXECUTE_VM_OPERATION.md: -------------------------------------------------------------------------------- 1 | # EXECUTE_VM_OPERATION 2 | 3 | - `threshold: 0 ms` 4 | - useful if you want to log only long running VM Operations 5 | 6 | ``` 7 | jdk.ExecuteVMOperation { 8 | startTime = 11:19:38.029 9 | duration = 0.00209 ms 10 | operation = "JFROldObject" 11 | safepoint = true 12 | blocking = true 13 | caller = "jfr-0" (javaThreadId = 14) 14 | safepointId = 18 15 | eventThread = "VM Thread" (osThreadId = 19742) 16 | } 17 | 18 | 19 | jdk.ExecuteVMOperation { 20 | startTime = 11:19:38.049 21 | duration = 37.4 ms 22 | operation = "GenCollectForAllocation" 23 | safepoint = true 24 | blocking = true 25 | caller = "pool-1-thread-1" (javaThreadId = 15) 26 | safepointId = 19 27 | eventThread = "VM Thread" (osThreadId = 19742) 28 | } 29 | 30 | 31 | jdk.ExecuteVMOperation { 32 | startTime = 11:19:38.098 33 | duration = 4.18 ms 34 | operation = "RedefineClasses" 35 | safepoint = true 36 | blocking = true 37 | caller = "jfr-0" (javaThreadId = 14) 38 | safepointId = 20 39 | eventThread = "VM Thread" (osThreadId = 19742) 40 | } 41 | 42 | 43 | jdk.ExecuteVMOperation { 44 | startTime = 11:19:38.109 45 | duration = 131 ms 46 | operation = "GenCollectForAllocation" 47 | safepoint = true 48 | blocking = true 49 | caller = "pool-1-thread-3" (javaThreadId = 17) 50 | safepointId = 21 51 | eventThread = "VM Thread" (osThreadId = 19742) 52 | } 53 | 54 | 55 | jdk.ExecuteVMOperation { 56 | startTime = 11:19:38.246 57 | duration = 0.111 ms 58 | operation = "ClassLoaderStatsOperation" 59 | safepoint = true 60 | blocking = true 61 | caller = "jfr-0" (javaThreadId = 14) 62 | safepointId = 22 63 | eventThread = "VM Thread" (osThreadId = 19742) 64 | } 65 | 66 | ... 67 | 68 | jdk.ExecuteVMOperation { 69 | startTime = 11:19:41.891 70 | duration = 176 ms 71 | operation = "GenCollectForAllocation" 72 | safepoint = true 73 | blocking = true 74 | caller = "pool-1-thread-1" (javaThreadId = 15) 75 | safepointId = 53 76 | eventThread = "VM Thread" (osThreadId = 19742) 77 | } 78 | 79 | 80 | jdk.ExecuteVMOperation { 81 | startTime = 11:19:42.067 82 | duration = 0.122 ms 83 | operation = "ClassLoaderStatsOperation" 84 | safepoint = true 85 | blocking = true 86 | caller = "JFR: Shutdown Hook" (javaThreadId = 23) 87 | safepointId = 54 88 | eventThread = "VM Thread" (osThreadId = 19742) 89 | } 90 | 91 | ``` -------------------------------------------------------------------------------- /SHUTDOWN.md: -------------------------------------------------------------------------------- 1 | # SHUTDOWN 2 | 3 | - `System.exit(1)` 4 | 5 | ``` 6 | jdk.Shutdown { 7 | startTime = 11:27:06.295 8 | reason = "Shutdown requested from Java" 9 | eventThread = "main" (javaThreadId = 1) 10 | stackTrace = [ 11 | java.lang.Shutdown.beforeHalt() 12 | java.lang.Shutdown.exit(int) line: 173 13 | java.lang.Runtime.exit(int) line: 114 14 | java.lang.System.exit(int) line: 1783 15 | pbouda.jfr.Shutdown.main(String[]) line: 8 16 | ... 17 | ] 18 | } 19 | ``` 20 | 21 | - `SIGKINT` - interrupt 22 | 23 | ``` 24 | jdk.Shutdown { 25 | startTime = 11:35:54.311 26 | reason = "Shutdown requested from Java" 27 | eventThread = "SIGINT handler" (javaThreadId = 22) 28 | stackTrace = [ 29 | java.lang.Shutdown.beforeHalt() 30 | java.lang.Shutdown.exit(int) line: 173 31 | java.lang.Terminator$1.handle(Signal) line: 51 32 | jdk.internal.misc.Signal$1.run() line: 220 33 | java.lang.Thread.run() line: 832 34 | ... 35 | ] 36 | } 37 | ``` 38 | 39 | #### Linux Signals 40 | 41 | ``` 42 | SIGINT is the interrupt signal. The terminal sends it to the foreground 43 | process when the user presses ctrl-c. The default behavior is to terminate 44 | the process, but it can be caught or ignored. The intention is to provide 45 | a mechanism for an orderly, graceful shutdown. 46 | 47 | SIGQUIT is the dump core signal. The terminal sends it to the foreground 48 | process when the user presses ctrl-\. The default behavior is to terminate 49 | the process and dump core, but it can be caught or ignored. The intention 50 | is to provide a mechanism for the user to abort the process. You can look 51 | at SIGINT as "user-initiated happy termination" and SIGQUIT as 52 | "user-initiated unhappy termination." 53 | 54 | SIGTERM is the termination signal. The default behavior is to terminate 55 | the process, but it also can be caught or ignored. The intention is to 56 | kill the process, gracefully or not, but to first allow it a chance to 57 | cleanup. 58 | 59 | SIGKILL is the kill signal. The only behavior is to kill the process, 60 | immediately. As the process cannot catch the signal, it cannot cleanup, 61 | and thus this is a signal of last resort. 62 | 63 | SIGSTOP is the pause signal. The only behavior is to pause the process; 64 | the signal cannot be caught or ignored. The shell uses pausing (and its 65 | counterpart, resuming via SIGCONT) to implement job control. 66 | ``` -------------------------------------------------------------------------------- /OBJECT_ALLOCATION.md: -------------------------------------------------------------------------------- 1 | # OBJECT_ALLOCATION 2 | 3 | - TLAB is Thread-Local Allocation Buffer and is always dedicated to one thread 4 | - the thread allocates new objects into TLAB to avoid contention among other threads 5 | - if TLAB is full then the thread receives from GC a new TLAB to allocate to 6 | - if there is no TLAB available at the certain moment then allocate the object outside a TLAB to shared memory (synchronization) 7 | 8 | ``` 9 | jdk.ObjectAllocationInNewTLAB#enabled: true 10 | jdk.ObjectAllocationInNewTLAB#stackTrace: true 11 | jdk.ObjectAllocationOutsideTLAB#enabled: true 12 | jdk.ObjectAllocationOutsideTLAB#stackTrace: true 13 | ``` 14 | 15 | #### OBJECT_ALLOCATION_IN_NEW_TLAB 16 | 17 | - the event is emitted always when we need to created a new TLAB for the given thread to be able to allocation the object 18 | - the bigger TLABs we have the less objects we produce 19 | - the same technique is used even in profilers such as `AsyncProfiler` when me measure object allocation 20 | 21 | ``` 22 | jdk.ObjectAllocationInNewTLAB { 23 | startTime = 12:29:02.559 24 | objectClass = java.lang.String (classLoader = bootstrap) 25 | allocationSize = 24 bytes 26 | tlabSize = 512.0 kB 27 | eventThread = "pool-1-thread-2" (javaThreadId = 16) 28 | stackTrace = [ 29 | java.lang.StringConcatHelper.newString(byte[], long) line: 397 30 | java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Object, Object, long) 31 | java.lang.invoke.LambdaForm$MH.1186189638.invoke(Object, int, Object) 32 | java.lang.invoke.Invokers$Holder.linkToTargetMethod(int, Object, Object) 33 | pbouda.jfr.AllocationStress$Utility.generate(String, int, int, int, int) line: 110 34 | ... 35 | ] 36 | } 37 | ``` 38 | 39 | #### OBJECT_ALLOCATION_OUTSIDE_TLAB 40 | 41 | - the event is emitted always for an allocation outside the TLAB 42 | - this is a bad hint because our thread is not able to withstand the allocation inside TLAB 43 | 44 | ``` 45 | jdk.ObjectAllocationOutsideTLAB { 46 | startTime = 12:29:02.563 47 | objectClass = pbouda.jfr.AllocationStress$Contact[] (classLoader = app) 48 | allocationSize = 276.3 kB 49 | eventThread = "pool-1-thread-4" (javaThreadId = 18) 50 | stackTrace = [ 51 | pbouda.jfr.AllocationStress$Utility.generate(String, int, int, int, int) line: 108 52 | pbouda.jfr.AllocationStress.lambda$main$0(AtomicInteger) line: 34 53 | pbouda.jfr.AllocationStress$$Lambda$22.443308702.run() 54 | java.util.concurrent.Executors$RunnableAdapter.call() line: 515 55 | java.util.concurrent.FutureTask.runAndReset() line: 305 56 | ... 57 | ] 58 | } 59 | ``` -------------------------------------------------------------------------------- /SOCKETS.md: -------------------------------------------------------------------------------- 1 | # SOCKETS 2 | 3 | - https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/performissues005.html 4 | 5 | #### SOCKET_READ 6 | 7 | - `jdk.SocketRead` 8 | - `#threshold: 10 ms` 9 | - it can be very high if an application uses `Blocking I/O` because it's waiting for `read` operation 10 | - `Non-Blocking I/O` does not impact monitoring and does not emit SocketRead events 11 | 12 | ``` 13 | jdk.SocketRead { 14 | startTime = 19:33:10.386 15 | duration = 36.5 s 16 | host = "localhost" 17 | address = "127.0.0.1" 18 | port = 54336 19 | timeout = 0 s 20 | bytesRead = 1 byte 21 | endOfStream = false 22 | eventThread = "Thread-2" (javaThreadId = 23) 23 | stackTrace = [ 24 | java.net.Socket$SocketInputStream.read(byte[], int, int) line: 68 25 | java.net.Socket$SocketInputStream.read() line: 977 26 | java.io.DataInputStream.readUnsignedShort() line: 341 27 | java.io.DataInputStream.readUTF(DataInput) line: 593 28 | java.io.DataInputStream.readUTF() line: 568 29 | ... 30 | ] 31 | } 32 | ``` 33 | 34 | - JVM very often emits events for RMI TCP belonging to Serviceablility Agent 35 | 36 | ``` 37 | jdk.SocketRead { 38 | startTime = 19:59:11.341 39 | duration = 382 ms 40 | host = "localhost" 41 | address = "127.0.0.1" 42 | port = 44604 43 | timeout = 2 h 0 m 44 | bytesRead = 1 byte 45 | endOfStream = false 46 | eventThread = "RMI TCP Connection(idle)" (javaThreadId = 30) 47 | stackTrace = [ 48 | java.net.Socket$SocketInputStream.read(byte[], int, int) line: 68 49 | java.io.BufferedInputStream.fill() line: 244 50 | java.io.BufferedInputStream.read() line: 263 51 | java.io.FilterInputStream.read() line: 82 52 | sun.rmi.transport.tcp.TCPTransport.handleMessages(Connection, boolean) line: 569 53 | ... 54 | ] 55 | } 56 | ``` 57 | 58 | - `Blocking I/O` has a problem that it reads one byte after another, therefore, there are only one-byte reads even if the message is a name 59 | - Is it true? even if `java.net.Socket$SocketInputStream.read(byte[], int, int) line: 68` 60 | 61 | ![socket_read](socket-read.png) 62 | 63 | #### SOCKET_WRITE 64 | 65 | - `jdk.SocketRead` 66 | - `#threshold: 10 ms` 67 | - it's not so often to see high write duration, because data is written immediately 68 | - we can find an issue with `TCP WRITE BUFFERS` if it's full, then `write` is blocked for a long time 69 | 70 | ``` 71 | jdk.SocketWrite { 72 | startTime = 19:33:10.341 73 | duration = 20.9 ms 74 | host = "localhost" 75 | address = "127.0.0.1" 76 | port = 54336 77 | bytesWritten = 69 bytes 78 | eventThread = "Thread-2" (javaThreadId = 23) 79 | stackTrace = [ 80 | java.net.Socket$SocketOutputStream.write(byte[], int, int) line: 65 81 | java.io.DataOutputStream.write(byte[], int, int) line: 106 82 | java.io.DataOutputStream.writeUTF(String, DataOutput) line: 397 83 | java.io.DataOutputStream.writeUTF(String) line: 325 84 | pbouda.jfr.ClientHandler.run() line: 75 85 | ... 86 | ] 87 | } 88 | ``` 89 | 90 | 91 | -------------------------------------------------------------------------------- /FILE.md: -------------------------------------------------------------------------------- 1 | # FILE 2 | 3 | #### FILE_FORCE 4 | 5 | - NOT REPRODUCED 6 | - Description: `force updates to be written to file` 7 | 8 | ``` 9 | jdk.FileForce#enabled: true 10 | jdk.FileForce#stackTrace: true 11 | jdk.FileForce#threshold: 10 ms 12 | ``` 13 | 14 | #### FILE_READ 15 | 16 | - only one emitted event 17 | - `ChannelInputStream` automatically allocate `HeapByteBuffer` with capacity for an entire file 18 | - therefore, we need only one READ operation 19 | 20 | ``` 21 | jdk.FileRead { 22 | startTime = 14:59:55.873 23 | duration = 969 ms 24 | path = "/home/pbouda/movie.avi" 25 | bytesRead = 1.1 GB 26 | endOfFile = false 27 | eventThread = "main" (javaThreadId = 1) 28 | stackTrace = [ 29 | sun.nio.ch.FileChannelImpl.read(ByteBuffer) line: 83 30 | sun.nio.ch.ChannelInputStream.read(ReadableByteChannel, ByteBuffer, boolean) line: 65 31 | sun.nio.ch.ChannelInputStream.read(ByteBuffer) line: 107 32 | sun.nio.ch.ChannelInputStream.read(byte[], int, int) line: 101 33 | java.nio.file.Files.read(InputStream, int) line: 3228 34 | ... 35 | ] 36 | } 37 | ``` 38 | 39 | #### FILE_WRITE 40 | 41 | - one file is written using multiple events 42 | - every event takes `0.167 ms` and writes `8.0 kB` (buffer size) 43 | 44 | ``` 45 | ... 46 | 47 | jdk.FileWrite { 48 | startTime = 15:08:53.932 49 | duration = 0.194 ms 50 | path = "/home/pbouda/movie-copy.avi" 51 | bytesWritten = 8.0 kB 52 | eventThread = "main" (javaThreadId = 1) 53 | stackTrace = [ 54 | sun.nio.ch.FileChannelImpl.write(ByteBuffer) line: 151 55 | java.nio.channels.Channels.writeFullyImpl(WritableByteChannel, ByteBuffer) line: 74 56 | java.nio.channels.Channels.writeFully(WritableByteChannel, ByteBuffer) line: 97 57 | java.nio.channels.Channels$1.write(byte[], int, int) line: 172 58 | java.nio.file.Files.write(Path, byte[], OpenOption[]) line: 3494 59 | ... 60 | ] 61 | } 62 | 63 | 64 | jdk.FileWrite { 65 | startTime = 15:08:53.932 66 | duration = 0.194 ms 67 | path = "/home/pbouda/movie-copy.avi" 68 | bytesWritten = 8.0 kB 69 | eventThread = "main" (javaThreadId = 1) 70 | stackTrace = [ 71 | sun.nio.ch.FileChannelImpl.write(ByteBuffer) line: 151 72 | java.nio.channels.Channels.writeFullyImpl(WritableByteChannel, ByteBuffer) line: 74 73 | java.nio.channels.Channels.writeFully(WritableByteChannel, ByteBuffer) line: 97 74 | java.nio.channels.Channels$1.write(byte[], int, int) line: 172 75 | java.nio.file.Files.write(Path, byte[], OpenOption[]) line: 3494 76 | ... 77 | ] 78 | } 79 | 80 | 81 | jdk.FileWrite { 82 | startTime = 15:08:53.932 83 | duration = 0.194 ms 84 | path = "/home/pbouda/movie-copy.avi" 85 | bytesWritten = 6.1 kB 86 | eventThread = "main" (javaThreadId = 1) 87 | stackTrace = [ 88 | sun.nio.ch.FileChannelImpl.write(ByteBuffer) line: 151 89 | java.nio.channels.Channels.writeFullyImpl(WritableByteChannel, ByteBuffer) line: 74 90 | java.nio.channels.Channels.writeFully(WritableByteChannel, ByteBuffer) line: 97 91 | java.nio.channels.Channels$1.write(byte[], int, int) line: 172 92 | java.nio.file.Files.write(Path, byte[], OpenOption[]) line: 3494 93 | ... 94 | ] 95 | } 96 | ``` -------------------------------------------------------------------------------- /CLASSES.md: -------------------------------------------------------------------------------- 1 | # CLASSES 2 | 3 | ## CLASSLOADER 4 | 5 | #### CLASS_LOADER_STATISTICS 6 | 7 | - [custom-profile](custom-profile.xml) 8 | - `jdk.ClassLoaderStatistics` 9 | - generated `everyChunk` 10 | - for every classloader 11 | 12 | ``` 13 | jdk.ClassLoaderStatistics { 14 | startTime = 16:18:05.203 15 | classLoader = N/A 16 | parentClassLoader = N/A 17 | classLoaderData = 0x7FA3F827B5E0 18 | classCount = 1568 19 | chunkSize = 4.4 MB 20 | blockSize = 4.0 MB 21 | unsafeAnonymousClassCount = 104 22 | unsafeAnonymousChunkSize = 287.0 kB 23 | unsafeAnonymousBlockSize = 185.2 kB 24 | } 25 | 26 | 27 | jdk.ClassLoaderStatistics { 28 | startTime = 16:18:05.203 29 | classLoader = jdk.internal.loader.ClassLoaders$AppClassLoader (id = 4) 30 | parentClassLoader = N/A 31 | classLoaderData = 0x7FA3F8306BC0 32 | classCount = 6 33 | chunkSize = 84.0 kB 34 | blockSize = 23.1 kB 35 | unsafeAnonymousClassCount = 4 36 | unsafeAnonymousChunkSize = 12.0 kB 37 | unsafeAnonymousBlockSize = 7.5 kB 38 | } 39 | 40 | ... 41 | ``` 42 | 43 | #### CLASS_LOADING_STATISTICS 44 | 45 | - [custom-profile](custom-profile.xml) 46 | - `jdk.ClassLoadingStatistics` 47 | - generated every 1s 48 | 49 | ``` 50 | jdk.ClassLoadingStatistics { 51 | startTime = 16:13:52.017 52 | loadedClassCount = 1715 53 | unloadedClassCount = 0 54 | } 55 | ``` 56 | 57 | ## LOADING OF SINGLE CLASSES 58 | 59 | - `disabled` by default 60 | 61 | #### CLASS_LOAD 62 | 63 | ``` 64 | jdk.ClassLoad { 65 | startTime = 16:27:51.712 66 | duration = 0.847 ms 67 | loadedClass = java.util.concurrent.ForkJoinPool$ManagedBlocker (classLoader = bootstrap) 68 | definingClassLoader = null initiatingClassLoader = null eventThread = "pool-1-thread-3" (javaThreadId = 17) 69 | stackTrace = [ 70 | java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) line: 1650 71 | java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() line: 1182 72 | java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() line: 899 73 | java.util.concurrent.ThreadPoolExecutor.getTask() line: 1056 74 | java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1116 75 | ... 76 | ] 77 | } 78 | ``` 79 | 80 | #### CLASS_UNLOAD 81 | 82 | ``` 83 | jdk.ClassUnload { 84 | startTime = 16:27:49.573 85 | unloadedClass = java.lang.invoke.LambdaForm$MH.1387135337 (classLoader = bootstrap) 86 | definingClassLoader = N/A 87 | } 88 | ``` 89 | 90 | #### CLASS_DEFINE 91 | 92 | ``` 93 | jdk.ClassDefine { 94 | startTime = 16:27:50.046 95 | definedClass = jdk.jfr.internal.consumer.AbstractEventStream$1 (classLoader = bootstrap) 96 | definingClassLoader = null eventThread = "jfr-0" (javaThreadId = 14) 97 | stackTrace = [ 98 | jdk.jfr.internal.consumer.AbstractEventStream.run(AccessControlContext) line: 262 99 | jdk.jfr.internal.consumer.AbstractEventStream.start(long) line: 222 100 | jdk.jfr.consumer.RecordingStream.start() line: 344 101 | pbouda.jfr.Jfr.lambda$start$2(Configuration, String[]) line: 48 102 | pbouda.jfr.Jfr$$Lambda$21.1342443276.run() 103 | ... 104 | ] 105 | } 106 | ``` -------------------------------------------------------------------------------- /CODE_CACHE.md: -------------------------------------------------------------------------------- 1 | # CODE_CACHE 2 | 3 | - https://openjdk.java.net/jeps/197 4 | - Divide the code cache into distinct segments, each of which contains compiled code of a particular type 5 | - `(-XX:NonMethodCodeHeapSize)` A non-method code heap containing non-method code, such as compiler 6 | buffers and bytecode interpreter. This code type will stay in the code cache forever. 7 | - `(-XX:ProfiledCodeHeapSize)` A profiled code heap containing lightly optimized, profiled methods 8 | with a short lifetime. 9 | - `(-XX:NonProfiledCodeHeapSize)` A non-profiled code heap containing fully optimized, non-profiled 10 | methods with a potentially long lifetime. 11 | - Code cache sweeper: Now only iterates over the method-code heaps 12 | 13 | #### CODE_SWEEPER_CONFIGURATION 14 | 15 | - `#period: beginChunk` 16 | 17 | ``` 18 | jdk.CodeSweeperConfiguration { 19 | startTime = 10:40:38.191 20 | sweeperEnabled = true 21 | flushingEnabled = true 22 | } 23 | ``` 24 | 25 | #### CODE_SWEEPER_STATISTICS 26 | 27 | - `#period: everyChunk` 28 | 29 | ``` 30 | jdk.CodeSweeperStatistics { 31 | startTime = 10:48:25.405 32 | sweepCount = 10 33 | methodReclaimedCount = 1081 34 | totalSweepTime = 112 ms 35 | peakFractionTime = 102 ms 36 | peakSweepTime = 102 ms 37 | } 38 | ``` 39 | 40 | #### SWEEP_CODE_CACHE 41 | 42 | - `#threshold: 100 ms` 43 | 44 | ``` 45 | jdk.SweepCodeCache { 46 | startTime = 10:50:23.906 47 | duration = 149 ms 48 | sweepId = 2 49 | sweptCount = 1811 50 | flushedCount = 0 51 | zombifiedCount = 1096 52 | eventThread = "Sweeper thread" (javaThreadId = 10) 53 | } 54 | ``` 55 | 56 | #### CODE_CACHE_CONFIGURATION 57 | 58 | - `#period: beginChunk` 59 | 60 | ``` 61 | jdk.CodeCacheConfiguration { 62 | startTime = 10:54:13.401 63 | initialSize = 2.4 MB 64 | reservedSize = 240.0 MB 65 | nonNMethodSize = 5.6 MB 66 | profiledSize = 117.2 MB 67 | nonProfiledSize = 117.2 MB 68 | expansionSize = 64.0 kB 69 | minBlockLength = 6 bytes 70 | startAddress = 0x7F62A46FE000 71 | reservedTopAddress = 0x7F62B36FE000 72 | } 73 | ``` 74 | 75 | #### CODE_CACHE_STATISTICS 76 | 77 | - `#period: everyChunk` 78 | - statistics of all 3 types of storage 79 | 80 | ``` 81 | jdk.CodeCacheStatistics { 82 | startTime = 10:54:13.401 83 | codeBlobType = "CodeHeap 'non-profiled nmethods'" 84 | startAddress = 0x7F62AC1C7000 85 | reservedTopAddress = 0x7F62B36FE000 86 | entryCount = 510 87 | methodCount = 510 88 | adaptorCount = 0 89 | unallocatedCapacity = 116.6 MB 90 | fullCount = 0 91 | } 92 | 93 | 94 | jdk.CodeCacheStatistics { 95 | startTime = 10:54:13.401 96 | codeBlobType = "CodeHeap 'profiled nmethods'" 97 | startAddress = 0x7F62A4C90000 98 | reservedTopAddress = 0x7F62AC1C7000 99 | entryCount = 975 100 | methodCount = 975 101 | adaptorCount = 0 102 | unallocatedCapacity = 115.0 MB 103 | fullCount = 0 104 | } 105 | 106 | 107 | jdk.CodeCacheStatistics { 108 | startTime = 10:54:13.401 109 | codeBlobType = "CodeHeap 'non-nmethods'" 110 | startAddress = 0x7F62A46FE000 111 | reservedTopAddress = 0x7F62A4C90000 112 | entryCount = 964 113 | methodCount = 0 114 | adaptorCount = 342 115 | unallocatedCapacity = 4.4 MB 116 | fullCount = 0 117 | } 118 | ``` 119 | 120 | #### CODE_CACHE_FULL 121 | 122 | - `jdk.CodeCacheFull#enabled: true` 123 | - not reproduced 124 | -------------------------------------------------------------------------------- /GC_Z.md: -------------------------------------------------------------------------------- 1 | # ZGC 2 | 3 | - `jdk.ZPageAllocation` could not reproduce 4 | 5 | ``` 6 | jdk.ZStatisticsSampler { 7 | startTime = 12:49:56.808 8 | duration = 0.000011 ms 9 | id = "Allocation Stall" 10 | value = 216019 11 | eventThread = "pool-1-thread-4" (javaThreadId = 18) 12 | } 13 | ``` 14 | 15 | ``` 16 | jdk.ZStatisticsCounter { 17 | startTime = 12:52:28.279 18 | duration = 0.000046 ms 19 | id = "Page Cache Hit L1" 20 | increment = 1 21 | value = 58 22 | eventThread = "pool-1-thread-2" (javaThreadId = 16) 23 | } 24 | 25 | 26 | jdk.ZStatisticsCounter { 27 | startTime = 12:52:28.279 28 | duration = 0.000008 ms 29 | id = "Allocation Rate" 30 | increment = 2097152 31 | value = 113246208 32 | eventThread = "pool-1-thread-2" (javaThreadId = 16) 33 | } 34 | 35 | 36 | jdk.ZStatisticsCounter { 37 | startTime = 12:52:28.279 38 | duration = 0.000009 ms 39 | id = "Undo Page Allocation" 40 | increment = 1 41 | value = 15 42 | eventThread = "pool-1-thread-2" (javaThreadId = 16) 43 | } 44 | 45 | ... 46 | ``` 47 | 48 | ``` 49 | jdk.ZThreadPhase { 50 | startTime = 12:55:16.122 51 | duration = 0.000799 ms 52 | gcId = 7 53 | name = "Pause Roots Setup" 54 | } 55 | 56 | 57 | jdk.ZThreadPhase { 58 | startTime = 12:55:16.122 59 | duration = 0.000309 ms 60 | gcId = 7 61 | name = "Pause Roots ObjectSynchronizer" 62 | } 63 | 64 | 65 | jdk.ZThreadPhase { 66 | startTime = 12:55:16.122 67 | duration = 0.00219 ms 68 | gcId = 7 69 | name = "Pause Roots Universe" 70 | eventThread = "ZWorker#0" (osThreadId = 29358) 71 | } 72 | 73 | 74 | jdk.ZThreadPhase { 75 | startTime = 12:55:16.122 76 | duration = 0.00103 ms 77 | gcId = 7 78 | name = "Pause Roots Management" 79 | } 80 | 81 | 82 | jdk.ZThreadPhase { 83 | startTime = 12:55:16.122 84 | duration = 0.00126 ms 85 | gcId = 7 86 | name = "Pause Roots JVMTIExport" 87 | } 88 | 89 | 90 | jdk.ZThreadPhase { 91 | startTime = 12:55:16.122 92 | duration = 0.0155 ms 93 | gcId = 7 94 | name = "Pause Roots SystemDictionary" 95 | } 96 | 97 | 98 | jdk.ZThreadPhase { 99 | startTime = 12:55:16.122 100 | duration = 1.34 ms 101 | gcId = 7 102 | name = "Pause Roots Threads" 103 | eventThread = "ZWorker#0" (osThreadId = 29358) 104 | } 105 | 106 | 107 | jdk.ZThreadPhase { 108 | startTime = 12:55:16.124 109 | duration = 0.00178 ms 110 | gcId = 7 111 | name = "Pause Roots JVMTIWeakExport" 112 | eventThread = "ZWorker#0" (osThreadId = 29358) 113 | } 114 | 115 | 116 | jdk.ZThreadPhase { 117 | startTime = 12:55:16.122 118 | duration = 1.37 ms 119 | gcId = 7 120 | name = "Pause Roots" 121 | eventThread = "ZWorker#0" (osThreadId = 29358) 122 | } 123 | 124 | 125 | jdk.ZThreadPhase { 126 | startTime = 12:55:16.122 127 | duration = 1.56 ms 128 | gcId = 7 129 | name = "Pause Roots Threads" 130 | } 131 | 132 | 133 | jdk.ZThreadPhase { 134 | startTime = 12:55:16.122 135 | duration = 1.60 ms 136 | gcId = 7 137 | name = "Pause Roots" 138 | } 139 | 140 | 141 | jdk.ZThreadPhase { 142 | startTime = 12:55:16.124 143 | duration = 0.00109 ms 144 | gcId = 7 145 | name = "Pause Roots Teardown" 146 | } 147 | 148 | 149 | jdk.ZThreadPhase { 150 | startTime = 12:55:16.120 151 | duration = 4.49 ms 152 | gcId = -1 153 | name = "Allocation Stall" 154 | eventThread = "pool-1-thread-4" (javaThreadId = 18) 155 | } 156 | 157 | ... 158 | ``` -------------------------------------------------------------------------------- /MONITOR.md: -------------------------------------------------------------------------------- 1 | ## JAVA_MONITOR_ENTER 2 | 3 | - [custom-profile](custom-profile.xml) 4 | - `jdk.JavaMonitorEnter` 5 | - time spent in a critical path must be longer than 10ms 6 | - the monitor needs to be contended (inflated) otherwise lightweight lock is used 7 | and the event is not thrown 8 | 9 | ```java 10 | public class MonitorEnter { 11 | 12 | public static void main(String[] args) { 13 | Jfr.start("jdk.JavaMonitorEnter"); 14 | 15 | ScheduledExecutorService executor = Executors.newScheduledThreadPool(5); 16 | executor.scheduleWithFixedDelay(MonitorEnter::innerMethod, 0, 10, TimeUnit.MILLISECONDS); 17 | 18 | while(true) { 19 | innerMethod(); 20 | } 21 | } 22 | 23 | private static synchronized void innerMethod() { 24 | System.out.println("Protected Area - " + Thread.currentThread().getName()); 25 | try { 26 | Thread.sleep(20); 27 | } catch (InterruptedException e) {} 28 | } 29 | } 30 | ``` 31 | 32 | ``` 33 | jdk.JavaMonitorEnter { 34 | startTime = 19:11:29.873 35 | duration = 13.3 s 36 | monitorClass = java.lang.Class (classLoader = bootstrap) 37 | previousOwner = "main" (javaThreadId = 1) 38 | address = 0x7F77C8021888 39 | eventThread = "pool-1-thread-2" (javaThreadId = 17) 40 | stackTrace = [ 41 | pbouda.jfr.MonitorEnter.innerMethod() line: 22 42 | pbouda.jfr.MonitorEnter$$Lambda$22.1560911714.run() 43 | java.util.concurrent.Executors$RunnableAdapter.call() line: 515 44 | java.util.concurrent.FutureTask.runAndReset() line: 305 45 | java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run() line: 305 46 | ... 47 | ] 48 | } 49 | ``` 50 | 51 | ## JAVA_MONITOR_WAIT 52 | 53 | - [custom-profile](custom-profile.xml) 54 | - `jdk.JavaMonitorWait` 55 | - thread needs to wait for acquiring a lock longer than 10 ms 56 | 57 | ``` 58 | jdk.JavaMonitorWait { 59 | startTime = 19:14:11.474 60 | duration = 22.7 ms 61 | monitorClass = java.lang.Object (classLoader = bootstrap) 62 | notifier = N/A 63 | timeout = 20.0 ms 64 | timedOut = true 65 | address = 0x7F3B64007408 66 | eventThread = "JFR Periodic Tasks" (javaThreadId = 18) 67 | stackTrace = [ 68 | java.lang.Object.wait(long) 69 | jdk.jfr.internal.PlatformRecorder.takeNap(long) line: 481 70 | jdk.jfr.internal.PlatformRecorder.periodicTask() line: 474 71 | jdk.jfr.internal.PlatformRecorder.lambda$startDiskMonitor$1() line: 417 72 | jdk.jfr.internal.PlatformRecorder$$Lambda$63.678689676.run() 73 | ... 74 | ] 75 | } 76 | ``` 77 | 78 | ## JAVA_MONITOR_INFLATE 79 | 80 | - `COULD NOT REPRODUCE` 81 | 82 | 83 | ## BIASED_LOCK_REVOCATION 84 | 85 | - [custom-profile](custom-profile.xml) 86 | - `jdk.BiasedLockRevocation` 87 | - one thread needs to get biased lock and another thread tries to get the lock for itself 88 | 89 | ``` 90 | jdk.BiasedLockRevocation { 91 | startTime = 20:22:07.422 92 | duration = 0.102 ms 93 | lockClass = jdk.jfr.internal.MetadataRepository (classLoader = bootstrap) 94 | safepointId = 0 95 | previousOwner = "jfr-0" (javaThreadId = 14) 96 | eventThread = "JFR Periodic Tasks" (javaThreadId = 17) 97 | stackTrace = [ 98 | jdk.jfr.internal.MetadataRepository.flush() line: 320 99 | jdk.jfr.internal.RequestEngine.run_requests(Collection) line: 265 100 | jdk.jfr.internal.RequestEngine.doPeriodic() line: 186 101 | jdk.jfr.internal.PlatformRecorder.periodicTask() line: 472 102 | jdk.jfr.internal.PlatformRecorder.lambda$startDiskMonitor$1() line: 417 103 | ... 104 | ] 105 | } 106 | ``` -------------------------------------------------------------------------------- /GC_BASICS.md: -------------------------------------------------------------------------------- 1 | # G1_GARBAGE_COLLECTION 2 | 3 | - `jdk.GarbageCollection` 4 | - `jdk.YoungGarbageCollection` 5 | - `jdk.OldGarbageCollection` 6 | - `jdk.GCPhasePause` 7 | 8 | #### ALLOCATION REQUIRING GC 9 | 10 | ``` 11 | jdk.AllocationRequiringGC { 12 | startTime = 12:22:13.564 13 | gcId = 191 14 | size = 2.0 kB 15 | eventThread = "pool-1-thread-4" (javaThreadId = 18) 16 | stackTrace = [ 17 | jdk.internal.misc.Unsafe.allocateUninitializedArray(Class, int) line: 1387 18 | java.lang.StringConcatHelper.newArray(long) line: 458 19 | java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Object, long) 20 | java.lang.invoke.LambdaForm$MH.2109640190.invoke(Object, int, Object) 21 | java.lang.invoke.Invokers$Holder.linkToTargetMethod(int, Object, Object) 22 | ... 23 | ] 24 | } 25 | ``` 26 | 27 | #### TENURING DISTRIBUTION 28 | 29 | ``` 30 | jdk.TenuringDistribution { 31 | startTime = 12:24:20.360 32 | gcId = 132 33 | age = 3 34 | size = 0 bytes 35 | } 36 | ``` 37 | 38 | #### YOUNG GARBAGE COLLECTION 39 | 40 | ``` 41 | jdk.GCPhasePause { 42 | startTime = 23:51:39.260 43 | duration = 48.4 ms 44 | gcId = 43 45 | name = "GC Pause" 46 | } 47 | 48 | 49 | jdk.GarbageCollection { 50 | startTime = 23:51:39.260 51 | duration = 48.4 ms 52 | gcId = 43 53 | name = "G1New" 54 | cause = "G1 Evacuation Pause" 55 | sumOfPauses = 48.4 ms 56 | longestPause = 48.4 ms 57 | } 58 | 59 | 60 | jdk.YoungGarbageCollection { 61 | startTime = 23:51:39.260 62 | duration = 48.4 ms 63 | gcId = 43 64 | tenuringThreshold = 15 65 | } 66 | 67 | 68 | jdk.G1GarbageCollection { 69 | startTime = 23:51:39.260 70 | duration = 48.4 ms 71 | gcId = 43 72 | type = "Normal" 73 | } 74 | ``` 75 | 76 | #### OLD GARBAGE COLLECTION 77 | 78 | ``` 79 | jdk.GarbageCollection { 80 | startTime = 00:04:46.908 81 | duration = 431 ms 82 | gcId = 180 83 | name = "G1Old" 84 | cause = "G1 Evacuation Pause" 85 | sumOfPauses = 0 s 86 | longestPause = 0 s 87 | } 88 | 89 | 90 | jdk.OldGarbageCollection { 91 | startTime = 00:04:46.908 92 | duration = 431 ms 93 | gcId = 180 94 | } 95 | ``` 96 | 97 | #### FULL GARBAGE COLLECTION 98 | 99 | ``` 100 | jdk.GCPhasePause { 101 | startTime = 23:56:17.629 102 | duration = 218 ms 103 | gcId = 382 104 | name = "GC Pause" 105 | } 106 | 107 | 108 | jdk.GarbageCollection { 109 | startTime = 23:56:17.629 110 | duration = 218 ms 111 | gcId = 382 112 | name = "G1Full" 113 | cause = "G1 Evacuation Pause" 114 | sumOfPauses = 218 ms 115 | longestPause = 218 ms 116 | } 117 | ``` 118 | 119 | #### GC PHASE PARALLEL 120 | 121 | ``` 122 | jdk.GCPhaseParallel { 123 | startTime = 12:35:59.262 124 | duration = 1.82 ms 125 | gcId = 172 126 | gcWorkerId = 5 127 | name = "ObjCopy" 128 | eventThread = "GC Thread#0" (osThreadId = 26694) 129 | } 130 | 131 | 132 | jdk.GCPhaseParallel { 133 | startTime = 12:35:59.260 134 | duration = 5.31 ms 135 | gcId = 172 136 | gcWorkerId = 6 137 | name = "ScanHR" 138 | } 139 | 140 | jdk.GCPhaseParallel { 141 | startTime = 12:35:59.264 142 | duration = 1.32 ms 143 | gcId = 172 144 | gcWorkerId = 5 145 | name = "Termination" 146 | eventThread = "GC Thread#0" (osThreadId = 26694) 147 | } 148 | 149 | jdk.GCPhaseParallel { 150 | startTime = 12:35:59.265 151 | duration = 0.000330 ms 152 | gcId = 172 153 | gcWorkerId = 2 154 | name = "RedirtyCards" 155 | } 156 | 157 | jdk.GCPhaseParallel { 158 | startTime = 12:35:59.265 159 | duration = 0.00296 ms 160 | gcId = 172 161 | gcWorkerId = 1 162 | name = "NonYoungFreeCSet" 163 | } 164 | 165 | jdk.GCPhaseParallel { 166 | startTime = 12:35:59.265 167 | duration = 0.00189 ms 168 | gcId = 172 169 | gcWorkerId = 3 170 | name = "YoungFreeCSet" 171 | } 172 | ``` -------------------------------------------------------------------------------- /METASPACE.md: -------------------------------------------------------------------------------- 1 | # METASPACE 2 | 3 | #### Metaspace Information 4 | 5 | ``` 6 | Metaspace itself is not garbage-collected. But the java heap is. When java.lang.Class 7 | objects get collected the underlying metadata gets freed too. So in most circumstances 8 | regular GC cycles will also free up metaspace if there are any classes that are eligible 9 | for unloading. 10 | ``` 11 | 12 | ``` 13 | As predicting the need for metadata was a complex and inconvenient exercise, 14 | the Permanent Generation was removed in Java 8 in favor of the Metaspace. 15 | From this point on, most of the miscellaneous things were moved to regular 16 | Java heap. 17 | 18 | The class definitions, however, are now loaded into something called Metaspace. 19 | It is located in the native memory and does not interfere with the regular heap 20 | objects. By default, Metaspace size is only limited by the amount of native 21 | memory available to the Java process. This saves developers from a situation 22 | when adding just one more class to the application results in the 23 | java.lang.OutOfMemoryError: Permgen space. Notice that having such seemingly 24 | unlimited space does not ship without costs – letting the Metaspace to grow 25 | uncontrollably you can introduce heavy swapping and/or reach native allocation 26 | failures instead. 27 | 28 | In case you still wish to protect yourself for such occasions you can limit the 29 | growth of Metaspace similar to following, limiting Metaspace size to 256 MB: 30 | 31 | java -XX:MaxMetaspaceSize=256m com.mycompany.MyApplication 32 | ``` 33 | 34 | #### Metaspace Options 35 | 36 | ``` 37 | jdk.MetaspaceSummary#enabled: true 38 | jdk.MetaspaceGCThreshold#enabled: true 39 | jdk.MetaspaceAllocationFailure#enabled: true 40 | jdk.MetaspaceAllocationFailure#stackTrace: true 41 | jdk.MetaspaceOOM#enabled: true 42 | jdk.MetaspaceOOM#stackTrace: true 43 | jdk.MetaspaceChunkFreeListSummary#enabled: true 44 | ``` 45 | 46 | #### METASPACE_SUMMARY 47 | 48 | - after every GC 49 | 50 | ``` 51 | jdk.MetaspaceSummary { 52 | startTime = 11:59:06.231 53 | gcId = 17 54 | when = "Before GC" 55 | gcThreshold = 20.8 MB 56 | metaspace = { 57 | committed = 5.1 MB 58 | used = 4.4 MB 59 | reserved = 1.0 GB 60 | } 61 | dataSpace = { 62 | committed = 4.5 MB 63 | used = 4.0 MB 64 | reserved = 8.0 MB 65 | } 66 | classSpace = { 67 | committed = 640.0 kB 68 | used = 477.5 kB 69 | reserved = 1.0 GB 70 | } 71 | } 72 | 73 | 74 | jdk.MetaspaceSummary { 75 | startTime = 11:59:06.368 76 | gcId = 17 77 | when = "After GC" 78 | gcThreshold = 20.8 MB 79 | metaspace = { 80 | committed = 5.1 MB 81 | used = 4.4 MB 82 | reserved = 1.0 GB 83 | } 84 | dataSpace = { 85 | committed = 4.5 MB 86 | used = 4.0 MB 87 | reserved = 8.0 MB 88 | } 89 | classSpace = { 90 | committed = 640.0 kB 91 | used = 477.5 kB 92 | reserved = 1.0 GB 93 | } 94 | } 95 | ``` 96 | 97 | #### METASPACE_CHUNK_FREE_LIST_SUMMARY 98 | 99 | ``` 100 | jdk.MetaspaceChunkFreeListSummary { 101 | startTime = 12:07:17.168 102 | gcId = 15 103 | when = "Before GC" 104 | metadataType = "Metadata" 105 | specializedChunks = 0 106 | specializedChunksTotalSize = 0 bytes 107 | smallChunks = 0 108 | smallChunksTotalSize = 0 bytes 109 | mediumChunks = 0 110 | mediumChunksTotalSize = 0 bytes 111 | humongousChunks = 0 112 | humongousChunksTotalSize = 0 bytes 113 | } 114 | 115 | jdk.MetaspaceChunkFreeListSummary { 116 | startTime = 12:07:17.273 117 | gcId = 15 118 | when = "After GC" 119 | metadataType = "Metadata" 120 | specializedChunks = 0 121 | specializedChunksTotalSize = 0 bytes 122 | smallChunks = 0 123 | smallChunksTotalSize = 0 bytes 124 | mediumChunks = 0 125 | mediumChunksTotalSize = 0 bytes 126 | humongousChunks = 0 127 | humongousChunksTotalSize = 0 bytes 128 | } 129 | ``` -------------------------------------------------------------------------------- /COMPILER.md: -------------------------------------------------------------------------------- 1 | # COMPILER 2 | 3 | - Compiler Configuration 4 | - `jdk.CompilerConfiguration` 5 | - `#period: beginChunk` 6 | 7 | ``` 8 | jdk.CompilerConfiguration { 9 | startTime = 10:14:15.397 10 | threadCount = 4 11 | tieredCompilation = true 12 | } 13 | ``` 14 | 15 | #### COMPILER_STATISTICS 16 | 17 | - every 1 seconds (by default) 18 | - `jdk.CompilerStatistics` 19 | - cumulative information 20 | 21 | ``` 22 | jdk.CompilerStatistics { 23 | startTime = 10:22:58.986 24 | compileCount = 1737 25 | bailoutCount = 9 26 | invalidatedCount = 0 27 | osrCompileCount = 11 28 | standardCompileCount = 1726 29 | osrBytesCompiled = 0 bytes 30 | standardBytesCompiled = 0 bytes 31 | nmethodsSize = 2.9 MB 32 | nmethodCodeSize = 2.0 MB 33 | peakTimeSpent = 759 ms 34 | totalTimeSpent = 8.22 s 35 | } 36 | ``` 37 | 38 | #### COMPILATION 39 | 40 | ``` 41 | jdk.Compilation { 42 | startTime = 10:31:08.598 43 | duration = 169 ms 44 | compileId = 1834 45 | compiler = "c1" 46 | method = pbouda.jfr.AllocationStress$Utility.getSample(float, AllocationStress$Contact[]) 47 | compileLevel = 3 48 | succeded = true 49 | isOsr = false 50 | codeSize = 968 bytes 51 | inlinedBytes = 10 bytes 52 | eventThread = "C1 CompilerThread0" (javaThreadId = 9) 53 | } 54 | ``` 55 | 56 | #### COMPILER_INLINING 57 | 58 | - `message = "force inline by annotation"` 59 | - `message = "already compiled into a big method"` 60 | - `message = "callee is too large"` 61 | 62 | ``` 63 | jdk.CompilerInlining { 64 | startTime = 10:18:41.347 65 | compileId = 1394 66 | caller = java.lang.String.equalsIgnoreCase(String) 67 | callee = { 68 | type = "java/lang/String" 69 | name = "length" 70 | descriptor = "()I" 71 | } 72 | succeeded = true 73 | message = "inline" 74 | bci = 14 75 | eventThread = "C1 CompilerThread0" (javaThreadId = 9) 76 | } 77 | ``` 78 | 79 | #### COMPILATION_FAILURE 80 | 81 | ``` 82 | jdk.CompilationFailure { 83 | startTime = 10:33:04.033 84 | failureMessage = "Jvmti state change invalidated dependencies" 85 | compileId = 1478 86 | eventThread = "C2 CompilerThread1" (javaThreadId = 7) 87 | } 88 | ``` 89 | 90 | #### COMPILER_PHASE 91 | 92 | ``` 93 | jdk.CompilerPhase { 94 | startTime = 10:36:32.845 95 | duration = 0.261 ms 96 | phase = "PhaseIdealLoop 2" 97 | compileId = 1369 98 | phaseLevel = 2 99 | eventThread = "C2 CompilerThread2" (javaThreadId = 8) 100 | } 101 | 102 | 103 | jdk.CompilerPhase { 104 | startTime = 10:36:32.846 105 | duration = 0.0225 ms 106 | phase = "Before beautify loops" 107 | compileId = 1369 108 | phaseLevel = 3 109 | eventThread = "C2 CompilerThread2" (javaThreadId = 8) 110 | } 111 | 112 | 113 | jdk.CompilerPhase { 114 | startTime = 10:36:32.846 115 | duration = 0.185 ms 116 | phase = "PhaseIdealLoop 3" 117 | compileId = 1369 118 | phaseLevel = 2 119 | eventThread = "C2 CompilerThread2" (javaThreadId = 8) 120 | } 121 | 122 | 123 | jdk.CompilerPhase { 124 | startTime = 10:36:32.843 125 | duration = 2.90 ms 126 | phase = "Final Code" 127 | compileId = 1316 128 | phaseLevel = 1 129 | eventThread = "C2 CompilerThread1" (javaThreadId = 7) 130 | } 131 | 132 | ... 133 | ``` 134 | 135 | #### DEOPTIMIZATION 136 | 137 | ``` 138 | jdk.Deoptimization { 139 | startTime = 12:33:57.271 140 | compileId = 1655 141 | compiler = "c2" 142 | method = jdk.jfr.internal.EventWriter.putStackTrace() 143 | lineNumber = 170 144 | bci = 7 145 | instruction = "ifeq" 146 | reason = "unstable_if" 147 | action = "reinterpret" 148 | eventThread = "JFR Periodic Tasks" (javaThreadId = 22) 149 | stackTrace = [ 150 | jdk.jfr.internal.EventWriter.putStackTrace() line: 170 151 | jdk.jfr.internal.handlers.EventHandler1872_1577964835419-26342.write(long, long, long) 152 | jdk.jfr.events.ExceptionStatisticsEvent.commit() 153 | jdk.jfr.internal.instrument.JDKEvents.emitExceptionStatistics() line: 136 154 | jdk.jfr.internal.instrument.JDKEvents$$Lambda$37.1361501771.run() 155 | ... 156 | ] 157 | } 158 | ``` -------------------------------------------------------------------------------- /src/main/java/pbouda/jfr/AllocationStress.java: -------------------------------------------------------------------------------- 1 | package pbouda.jfr; 2 | 3 | import java.util.Arrays; 4 | import java.util.concurrent.Executors; 5 | import java.util.concurrent.ScheduledExecutorService; 6 | import java.util.concurrent.ThreadLocalRandom; 7 | import java.util.concurrent.TimeUnit; 8 | import java.util.concurrent.atomic.AtomicInteger; 9 | 10 | public class AllocationStress { 11 | 12 | private static final int MIN_GARBAGE = 50_000; 13 | private static final int MAX_GARBAGE = 100_000; 14 | private static final int MIN_LIFESET = 40_000; 15 | private static final int MAX_LIFESET = 60_000; 16 | 17 | private static final int PARALLEL_USERS = 4; 18 | 19 | public static void main(String[] args) { 20 | Jfr.start( 21 | "jdk.ZPageAllocation" 22 | // "jdk.ZThreadPhase" 23 | ); 24 | 25 | AtomicInteger counter = new AtomicInteger(); 26 | 27 | Runnable runnable = () -> { 28 | Contact[] biggerLifeSet = new Contact[]{}; 29 | Contact[] longerLifeSet = new Contact[]{}; 30 | 31 | for (int i = 0; i < 20; i++) { 32 | int index = counter.incrementAndGet(); 33 | // System.out.println("INDEX: " + index); 34 | 35 | Contact[] contacts1 = Utility.generate("contact-1 " + index, 36 | MIN_GARBAGE, MAX_GARBAGE, MIN_LIFESET, MAX_LIFESET); 37 | Contact[] contacts2 = Utility.generate("contact-2 " + index, 38 | MIN_GARBAGE, MAX_GARBAGE, MIN_LIFESET, MAX_LIFESET); 39 | 40 | biggerLifeSet = Utility.biggerLifeSet(index, biggerLifeSet, contacts1); 41 | longerLifeSet = Utility.longerLifeSet(index, longerLifeSet, contacts2); 42 | 43 | // System.out.println("Size ALL: " + (biggerLifeSet.length + longerLifeSet.length + contacts1.length)); 44 | } 45 | 46 | if (counter.get() > 20_000) { 47 | System.exit(0); 48 | } 49 | }; 50 | 51 | ScheduledExecutorService executor = Executors.newScheduledThreadPool(PARALLEL_USERS); 52 | 53 | // More parallel users 54 | for (int i = 0; i < PARALLEL_USERS; i++) { 55 | executor.scheduleWithFixedDelay(runnable, 0, 50, TimeUnit.MILLISECONDS); 56 | } 57 | } 58 | 59 | private static class Contact { 60 | 61 | private final String firstname; 62 | private final String lastname; 63 | 64 | Contact(String firstname, String lastname) { 65 | this.firstname = firstname; 66 | this.lastname = lastname; 67 | } 68 | } 69 | 70 | private static class Utility { 71 | 72 | static Contact[] longerLifeSet(int index, Contact[] current, Contact[] contacts1) { 73 | if (index % 10 == 0) { 74 | return contacts1; 75 | } else { 76 | return getSample(.8f, current); 77 | } 78 | } 79 | 80 | static Contact[] biggerLifeSet(int index, Contact[] current, Contact[] contacts) { 81 | Contact[] preserved = getSample(.5f, current); 82 | Contact[] newSample = getSample(.5f, contacts); 83 | Contact[] newLifeSet = combine(newSample, preserved); 84 | 85 | return index % 2 == 0 ? getSample(.5f, newLifeSet) : newLifeSet; 86 | } 87 | 88 | private static Contact[] getSample(float percentage, Contact[] contacts) { 89 | return Arrays.copyOf(contacts, Math.round(contacts.length * percentage)); 90 | } 91 | 92 | private static Contact[] combine(Contact[] a, Contact[] b) { 93 | int length = a.length + b.length; 94 | Contact[] result = new Contact[length]; 95 | System.arraycopy(a, 0, result, 0, a.length); 96 | System.arraycopy(b, 0, result, a.length, b.length); 97 | return result; 98 | } 99 | 100 | static Contact[] generate(String label, int minGarbage, int maxGarbage, int minLifeSet, int maxLifeSet) { 101 | ThreadLocalRandom random = ThreadLocalRandom.current(); 102 | int lifesetIteration = random.nextInt(minGarbage, maxGarbage); 103 | 104 | int overallSize = 0; 105 | for (int i = 0; i < random.nextInt(minLifeSet, maxLifeSet); i++) { 106 | String garbage = "Garbage: " + i + " Index: " + label; 107 | overallSize += garbage.length(); 108 | } 109 | // System.out.println(label + ": Size: " + overallSize); 110 | 111 | Contact[] contacts = new Contact[lifesetIteration]; 112 | for (int i = 0; i < lifesetIteration; i++) { 113 | contacts[i] = new Contact("FirstName " + i + " | " + label, "LastName " + i + " | " + label); 114 | } 115 | return contacts; 116 | } 117 | } 118 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Streaming JFR (Java Flight Recorder) 2 | 3 | Settings shipped with JDK: 4 | - [default](default-jre.txt) 5 | - Low overhead configuration safe for continuous use in production environments, typically less than 1 % overhead. 6 | - [profile](profile-jre.txt) 7 | - Low overhead configuration for profiling, typically around 2 % overhead. 8 | 9 | #### CPU 10 | 11 | - `jdk.CPULoad` 12 | - execution: `#period: beginChunk` 13 | 14 | ``` 15 | jdk.CPULoad { 16 | startTime = 00:05:56.420 17 | jvmUser = 10.64% 18 | jvmSystem = 0.49% 19 | machineTotal = 20.78% 20 | } 21 | ``` 22 | 23 | #### SYSTEM_INFORMATION 24 | 25 | - `jdk.OSInformation` 26 | - execution: `#period: beginChunk` 27 | 28 | ``` 29 | jdk.OSInformation { 30 | startTime = 23:50:58.983 31 | osVersion = "DISTRIB_ID=LinuxMint 32 | DISTRIB_RELEASE=19.3 33 | DISTRIB_CODENAME=tricia 34 | DISTRIB_DESCRIPTION="Linux Mint 19.3 Tricia" 35 | uname:Linux 5.0.0-37-generic #40~18.04.1-Ubuntu SMP Thu Nov 14 12:06:39 UTC 2019 x86_64 36 | libc:glibc 2.27 NPTL 2.27 37 | " 38 | } 39 | ``` 40 | 41 | #### VIRTUALIZATION_INFORMATION 42 | 43 | - `jdk.VirtualizationInformation` 44 | - execution: `#period: beginChunk` 45 | 46 | ``` 47 | jdk.VirtualizationInformation { 48 | startTime = 23:54:29.158 49 | name = "No virtualization detected" 50 | } 51 | ``` 52 | 53 | #### CPU_INFORMATION 54 | 55 | - `jdk.CPUInformation` 56 | - execution: `#period: beginChunk` 57 | 58 | ``` 59 | jdk.CPUInformation { 60 | startTime = 23:52:20.278 61 | cpu = "Intel (null) (HT) SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 Core Intel64" 62 | description = "Brand: Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz, Vendor: GenuineIntel 63 | Family: (0x6), Model: (0x8e), Stepping: 0xa 64 | Ext. family: 0x0, Ext. model: 0x8, Type: 0x0, Signature: 0x000806ea 65 | Features: ebx: 0x04100800, ecx: 0x7ffafbbf, edx: 0xbfebfbff 66 | Ext. features: eax: 0x00000000, ebx: 0x00000000, ecx: 0x00000121, edx: 0x2c100800 67 | Supports: On-Chip FPU, Virtual Mode Extensions, Debugging Extensions, Page Size Extensions, Time Stamp Counter, Model Specific Registers, Physical Address Extension, Machine Check Exceptions, CMPXCHG8B Instruction, On-Chip APIC, Fast System Call, Memory Type Range Registers, Page Global Enable, Machine Check Architecture, Conditional Mov Instruction, Page Attribute Table, 36-bit Page Size Extension, CLFLUSH Instruction, Debug Trace Store feature, ACPI registers in MSR space, Intel Architecture MMX Technology, Fast Float Point Save and Restore, Streaming SIMD extensions, Streaming SIMD extensions 2, Self-Snoop, Hyper Threading, Thermal Monitor, Streaming SIMD Extensions 3, PCLMULQDQ, 64-bit DS Area, MONITOR/MWAIT instructions, CPL Qualified Debug Store, Virtual Machine Extensions, Enhanced Intel SpeedStep technology, Thermal Monitor 2, Supplemental Streaming SIMD Extensions 3, Fused Multiply-Add, CMPXCHG16B, xTPR Update Control, Perfmon and Debug Capability, Process-context identifiers, Streaming SIMD extensions 4.1, Streaming SIMD extensions 4.2, x2APIC, MOVBE, Popcount instruction, TSC-Deadline, AESNI, XSAVE, OSXSAVE, AVX, F16C, LAHF/SAHF instruction support, Advanced Bit Manipulations: LZCNT, SYSCALL/SYSRET, Execute Disable Bit, RDTSCP, Intel 64 Architecture, Invariant TSC" 68 | sockets = 1 69 | cores = 4 70 | hwThreads = 8 71 | } 72 | ``` 73 | 74 | #### CPU_TIMESTAMP_COUNTER 75 | 76 | - `jdk.CPUTimeStampCounter` 77 | - execution: `#period: beginChunk` 78 | 79 | ``` 80 | jdk.CPUTimeStampCounter { 81 | startTime = 00:00:41.481 82 | fastTimeEnabled = true 83 | fastTimeAutoEnabled = true 84 | osFrequency = 1000000000 Hz 85 | fastTimeFrequency = 1600000000 Hz 86 | } 87 | ``` 88 | 89 | #### JVM_INFORMATION 90 | 91 | - `jdk.JVMInformation` 92 | - execution: `#period: beginChunk` 93 | 94 | ``` 95 | jdk.JVMInformation { 96 | startTime = 22:41:27.680 97 | jvmName = "OpenJDK 64-Bit Server VM" 98 | jvmVersion = "OpenJDK 64-Bit Server VM (14-ea+28-1366) for linux-amd64 JRE (14-ea+28-1366), built on Dec 18 2019 20:09:37 by "mach5one" with gcc 8.3.0" 99 | jvmArguments = "-Dvisualvm.id=257396015513599 -javaagent:/home/pbouda/.local/share/JetBrains/Toolbox/apps/IDEA-U/ch-0/193.5662.31/lib/idea_rt.jar=39229:/home/pbouda/.local/share/JetBrains/Toolbox/apps/IDEA-U/ch-0/193.5662.31/bin -Dfile.encoding=UTF-8" 100 | jvmFlags = N/A 101 | javaArguments = "pbouda.jfr.Jfr" 102 | jvmStartTime = 22:41:26.876 103 | pid = 20919 104 | } 105 | ``` 106 | 107 | #### INITIAL_SYSTEM_PROPERTY 108 | 109 | - `jdk.InitialSystemProperty` 110 | - execution: `#period: beginChunk` 111 | 112 | ``` 113 | jdk.InitialSystemProperty { 114 | startTime = 22:42:50.913 115 | key = "java.vm.specification.name" 116 | value = "Java Virtual Machine Specification" 117 | } 118 | 119 | 120 | jdk.InitialSystemProperty { 121 | startTime = 22:42:50.913 122 | key = "java.vm.version" 123 | value = "14-ea+28-1366" 124 | } 125 | 126 | 127 | jdk.InitialSystemProperty { 128 | startTime = 22:42:50.913 129 | key = "java.vm.name" 130 | value = "OpenJDK 64-Bit Server VM" 131 | } 132 | 133 | ... 134 | ``` 135 | 136 | #### INITIAL_ENVIRONMENT_PROPERTY 137 | 138 | - `jdk.InitialEnvironmentVariable` 139 | - execution: `#period: beginChunk` 140 | 141 | ``` 142 | jdk.InitialEnvironmentVariable { 143 | startTime = 23:56:45.069 144 | key = "LANGUAGE" 145 | value = "en_US" 146 | } 147 | 148 | 149 | jdk.InitialEnvironmentVariable { 150 | startTime = 23:56:45.069 151 | key = "GJS_DEBUG_TOPICS" 152 | value = "JS ERROR;JS LOG" 153 | } 154 | 155 | ... 156 | ``` 157 | 158 | #### EXECUTE_VM_OPERATION 159 | 160 | - `jdk.ExecuteVMOperation` 161 | - execution: `#threshold: 0ms` 162 | - catch all VM operations 163 | 164 | ``` 165 | jdk.ExecuteVMOperation { 166 | startTime = 23:13:43.190 167 | duration = 2.97 ms 168 | operation = "G1TryInitiateConcMark" 169 | safepoint = true 170 | blocking = true 171 | caller = "allocator-0" (javaThreadId = 15) 172 | safepointId = 14 173 | } 174 | ``` 175 | 176 | 177 | #### EXECUTION_SAMPLE 178 | 179 | - `jdk.ExecutionSample` 180 | - execution: `#period: 10 ms` (every 10 ms) 181 | 182 | ``` 183 | jdk.ExecutionSample { 184 | startTime = 22:59:28.082 185 | sampledThread = "main" (javaThreadId = 1) 186 | state = "STATE_RUNNABLE" 187 | stackTrace = [ 188 | java.io.FileOutputStream.write(byte[], int, int) line: 0 189 | java.io.BufferedOutputStream.flushBuffer() line: 0 190 | java.io.BufferedOutputStream.flush() line: 0 191 | java.io.PrintStream.write(byte[], int, int) line: 0 192 | sun.nio.cs.StreamEncoder.writeBytes() line: 0 193 | ... 194 | ] 195 | } 196 | ``` -------------------------------------------------------------------------------- /THREADS.md: -------------------------------------------------------------------------------- 1 | ## JAVA_THREAD_STATISTICS 2 | 3 | - [custom-profile](custom-profile.xml) 4 | - `jdk.JavaThreadStatistics` 5 | - generated every 1s 6 | 7 | ``` 8 | jdk.JavaThreadStatistics { 9 | startTime = 16:24:05.108 10 | activeCount = 12 11 | daemonCount = 10 12 | accumulatedCount = 14 13 | peakCount = 12 14 | } 15 | ``` 16 | 17 | ## THREAD_CPU_LOAD 18 | 19 | ``` 20 | jdk.ThreadCPULoad { 21 | startTime = 00:03:40.027 22 | user = 8.64% 23 | system = 0.15% 24 | eventThread = "C2 CompilerThread1" (javaThreadId = 7) 25 | } 26 | 27 | 28 | jdk.ThreadCPULoad { 29 | startTime = 00:03:48.574 30 | user = 0.16% 31 | system = 0.05% 32 | eventThread = "main" (javaThreadId = 1) 33 | } 34 | 35 | ... 36 | ``` 37 | 38 | ## THREAD_ALLOCATION_STATISTICS 39 | 40 | - [custom-profile](custom-profile.xml) 41 | - `jdk.ThreadAllocationStatistics` 42 | - generated every 1s (by default `everyChunk`) 43 | - all Java and JVM Threads (all threads from ThreadDump) 44 | 45 | ``` 46 | jdk.ThreadAllocationStatistics { 47 | startTime = 16:07:58.795 48 | allocated = 858.1 MB 49 | thread = "allocator-0" (javaThreadId = 15) 50 | } 51 | 52 | jdk.ThreadAllocationStatistics { 53 | startTime = 16:07:58.795 54 | allocated = 40 bytes 55 | thread = "C2 CompilerThread0" (javaThreadId = 6) 56 | } 57 | 58 | 59 | jdk.ThreadAllocationStatistics { 60 | startTime = 16:07:58.795 61 | allocated = 4.7 kB 62 | thread = "C1 CompilerThread0" (javaThreadId = 9) 63 | } 64 | 65 | ... 66 | ``` 67 | 68 | ## THREAD_START_END 69 | 70 | - [custom-profile](custom-profile.xml) 71 | - `jdk.ThreadStart` 72 | - `jdk.ThreadEnd` 73 | - generated every occasion 74 | 75 | ``` 76 | // JVM Compiler Threads 77 | 78 | jdk.ThreadEnd { 79 | startTime = 22:07:40.977 80 | thread = "C2 CompilerThread2" (javaThreadId = 8) 81 | eventThread = "C2 CompilerThread2" (javaThreadId = 8) 82 | } 83 | 84 | 85 | jdk.ThreadEnd { 86 | startTime = 22:07:40.977 87 | thread = "C2 CompilerThread1" (javaThreadId = 7) 88 | eventThread = "C2 CompilerThread1" (javaThreadId = 7) 89 | } 90 | 91 | // User Java threads 92 | 93 | jdk.ThreadStart { 94 | startTime = 22:07:41.552 95 | thread = "wasted-3" (javaThreadId = 25) 96 | eventThread = "wasted-3" (javaThreadId = 25) 97 | } 98 | 99 | 100 | jdk.ThreadEnd { 101 | startTime = 22:07:41.553 102 | thread = "wasted-3" (javaThreadId = 25) 103 | eventThread = "wasted-3" (javaThreadId = 25) 104 | } 105 | ``` 106 | 107 | ## THREAD_SLEEP 108 | 109 | - [custom-profile](custom-profile.xml) 110 | - `jdk.ThreadSleep` 111 | - generated every occasion 112 | 113 | ``` 114 | jdk.ThreadSleep { 115 | startTime = 22:36:28.750 116 | duration = 1.13 s 117 | time = 1.00 s 118 | eventThread = "main" (javaThreadId = 1) 119 | stackTrace = [ 120 | java.lang.Thread.sleep(long) 121 | pbouda.jfr.ThreadSleep.main(String[]) line: 9 122 | ] 123 | } 124 | ``` 125 | 126 | ## THREAD_PARK (LockSupport#parkNanos) 127 | 128 | - [custom-profile](custom-profile.xml) 129 | - `jdk.ThreadPark` 130 | - generated when parking is higher than 10 ms 131 | - calling `parkNanos` only 132 | 133 | ```java 134 | new Thread(() -> { 135 | while (true) 136 | LockSupport.parkNanos(Duration.ofMillis(100).toNanos()); 137 | }).start(); 138 | ``` 139 | 140 | ``` 141 | jdk.ThreadPark { 142 | startTime = 23:25:12.305 143 | duration = 113 ms 144 | parkedClass = N/A 145 | timeout = 100 ms 146 | until = N/A 147 | address = 0x00000000 148 | eventThread = "Thread-0" (javaThreadId = 15) 149 | stackTrace = [ 150 | jdk.internal.misc.Unsafe.park(boolean, long) 151 | java.util.concurrent.locks.LockSupport.parkNanos(long) line: 376 152 | pbouda.jfr.MonitorEnter.lambda$main$0() line: 14 153 | pbouda.jfr.MonitorEnter$$Lambda$22.396180261.run() 154 | java.lang.Thread.run() line: 832 155 | ... 156 | ] 157 | } 158 | ``` 159 | 160 | ## THREAD_PARK (LockSupport#park(blocker)) 161 | 162 | - [custom-profile](custom-profile.xml) 163 | - `jdk.ThreadPark` 164 | - generated when parking is higher than 10 ms 165 | - generated events with and without `Blocker` 166 | - calling `park` and `unpark` methods 167 | 168 | ```java 169 | Thread clock = new Thread(() -> { 170 | while (true) 171 | LockSupport.park(new Object()); 172 | }); 173 | clock.start(); 174 | 175 | while (true) { 176 | Thread.currentThread().join(100); 177 | LockSupport.unpark(clock); 178 | } 179 | ``` 180 | 181 | ``` 182 | // Parking without any Blocker object 183 | 184 | jdk.ThreadPark { 185 | startTime = 23:08:51.534 186 | duration = 2.25 s 187 | parkedClass = N/A 188 | timeout = N/A 189 | until = N/A 190 | address = 0x00000000 191 | eventThread = "Thread-0" (javaThreadId = 15) 192 | stackTrace = [ 193 | jdk.internal.misc.Unsafe.park(boolean, long) 194 | java.util.concurrent.locks.LockSupport.park() line: 341 195 | pbouda.jfr.MonitorEnter.lambda$main$0() line: 13 196 | pbouda.jfr.MonitorEnter$$Lambda$22.625576447.run() 197 | java.lang.Thread.run() line: 832 198 | ... 199 | ] 200 | } 201 | 202 | // Parking with Blocker Object 203 | 204 | jdk.ThreadPark { 205 | startTime = 23:11:44.143 206 | duration = 2.25 s 207 | parkedClass = java.lang.Object (classLoader = bootstrap) 208 | timeout = N/A 209 | until = N/A 210 | address = 0x6DC0001F0 211 | eventThread = "Thread-0" (javaThreadId = 15) 212 | stackTrace = [ 213 | jdk.internal.misc.Unsafe.park(boolean, long) 214 | java.util.concurrent.locks.LockSupport.park(Object) line: 211 215 | pbouda.jfr.MonitorEnter.lambda$main$0(Object) line: 15 216 | pbouda.jfr.MonitorEnter$$Lambda$22.1128032093.run() 217 | java.lang.Thread.run() line: 832 218 | ... 219 | ] 220 | } 221 | ``` 222 | 223 | ## THREAD_PARK (LockSupport#parkUntil(blocker, deadline)) 224 | 225 | - [custom-profile](custom-profile.xml) 226 | - `jdk.ThreadPark` 227 | - generated when parking is higher than 10 ms 228 | - generated event with `Blocker` and `Deadline` 229 | - calling `parkUntil` only 230 | 231 | ```java 232 | new Thread(() -> { 233 | while (true) 234 | LockSupport.parkUntil(new Object(), Instant.now().plusMillis(100).toEpochMilli()); 235 | }).start(); 236 | ``` 237 | 238 | ``` 239 | jdk.ThreadPark { 240 | startTime = 23:15:37.775 241 | duration = 112 ms 242 | parkedClass = java.lang.Object (classLoader = bootstrap) 243 | timeout = N/A 244 | until = 23:15:37.236 245 | address = 0x6DC005E80 246 | eventThread = "Thread-0" (javaThreadId = 15) 247 | stackTrace = [ 248 | jdk.internal.misc.Unsafe.park(boolean, long) 249 | java.util.concurrent.locks.LockSupport.parkUntil(Object, long) line: 293 250 | pbouda.jfr.MonitorEnter.lambda$main$0(Object) line: 16 251 | pbouda.jfr.MonitorEnter$$Lambda$22.443308702.run() 252 | java.lang.Thread.run() line: 832 253 | ... 254 | ] 255 | } 256 | ``` 257 | 258 | ## THREAD_CONTEXT_SWITCH_RATE 259 | 260 | - `#period: 10 s` 261 | 262 | ``` 263 | jdk.ThreadContextSwitchRate { 264 | startTime = 16:08:04.693 265 | switchRate = 21159.135 Hz 266 | } 267 | ``` -------------------------------------------------------------------------------- /profile-jre.txt: -------------------------------------------------------------------------------- 1 | jdk.ThreadAllocationStatistics#enabled: true 2 | jdk.ThreadAllocationStatistics#period: everyChunk 3 | jdk.ClassLoadingStatistics#enabled: true 4 | jdk.ClassLoadingStatistics#period: 1000 ms 5 | jdk.ClassLoaderStatistics#enabled: true 6 | jdk.ClassLoaderStatistics#period: everyChunk 7 | jdk.JavaThreadStatistics#enabled: true 8 | jdk.JavaThreadStatistics#period: 1000 ms 9 | jdk.SymbolTableStatistics#enabled: true 10 | jdk.SymbolTableStatistics#period: 10 s 11 | jdk.StringTableStatistics#enabled: true 12 | jdk.StringTableStatistics#period: 10 s 13 | jdk.PlaceholderTableStatistics#enabled: true 14 | jdk.PlaceholderTableStatistics#period: 10 s 15 | jdk.LoaderConstraintsTableStatistics#enabled: true 16 | jdk.LoaderConstraintsTableStatistics#period: 10 s 17 | jdk.ProtectionDomainCacheTableStatistics#enabled: true 18 | jdk.ProtectionDomainCacheTableStatistics#period: 10 s 19 | jdk.ThreadStart#enabled: true 20 | jdk.ThreadEnd#enabled: true 21 | jdk.ThreadSleep#enabled: true 22 | jdk.ThreadSleep#stackTrace: true 23 | jdk.ThreadSleep#threshold: 10 ms 24 | jdk.ThreadPark#enabled: true 25 | jdk.ThreadPark#stackTrace: true 26 | jdk.ThreadPark#threshold: 10 ms 27 | jdk.JavaMonitorEnter#enabled: true 28 | jdk.JavaMonitorEnter#stackTrace: true 29 | jdk.JavaMonitorEnter#threshold: 10 ms 30 | jdk.JavaMonitorWait#enabled: true 31 | jdk.JavaMonitorWait#stackTrace: true 32 | jdk.JavaMonitorWait#threshold: 10 ms 33 | jdk.JavaMonitorInflate#enabled: true 34 | jdk.JavaMonitorInflate#stackTrace: true 35 | jdk.JavaMonitorInflate#threshold: 10 ms 36 | jdk.BiasedLockRevocation#enabled: true 37 | jdk.BiasedLockRevocation#stackTrace: true 38 | jdk.BiasedLockRevocation#threshold: 0 ms 39 | jdk.BiasedLockSelfRevocation#enabled: true 40 | jdk.BiasedLockSelfRevocation#stackTrace: true 41 | jdk.BiasedLockSelfRevocation#threshold: 0 ms 42 | jdk.BiasedLockClassRevocation#enabled: true 43 | jdk.BiasedLockClassRevocation#stackTrace: true 44 | jdk.BiasedLockClassRevocation#threshold: 0 ms 45 | jdk.ReservedStackActivation#enabled: true 46 | jdk.ReservedStackActivation#stackTrace: true 47 | jdk.ClassLoad#enabled: false 48 | jdk.ClassLoad#stackTrace: true 49 | jdk.ClassLoad#threshold: 0 ms 50 | jdk.ClassDefine#enabled: false 51 | jdk.ClassDefine#stackTrace: true 52 | jdk.ClassUnload#enabled: false 53 | jdk.JVMInformation#enabled: true 54 | jdk.JVMInformation#period: beginChunk 55 | jdk.InitialSystemProperty#enabled: true 56 | jdk.InitialSystemProperty#period: beginChunk 57 | jdk.ExecutionSample#enabled: true 58 | jdk.ExecutionSample#period: 10 ms 59 | jdk.NativeMethodSample#enabled: true 60 | jdk.NativeMethodSample#period: 20 ms 61 | jdk.SafepointBegin#enabled: true 62 | jdk.SafepointBegin#threshold: 0 ms 63 | jdk.SafepointStateSynchronization#enabled: false 64 | jdk.SafepointStateSynchronization#threshold: 0 ms 65 | jdk.SafepointCleanup#enabled: false 66 | jdk.SafepointCleanup#threshold: 0 ms 67 | jdk.SafepointCleanupTask#enabled: false 68 | jdk.SafepointCleanupTask#threshold: 0 ms 69 | jdk.SafepointEnd#enabled: false 70 | jdk.SafepointEnd#threshold: 0 ms 71 | jdk.ExecuteVMOperation#enabled: true 72 | jdk.ExecuteVMOperation#threshold: 0 ms 73 | jdk.Shutdown#enabled: true 74 | jdk.Shutdown#stackTrace: true 75 | jdk.ThreadDump#enabled: true 76 | jdk.ThreadDump#period: 60 s 77 | jdk.IntFlag#enabled: true 78 | jdk.IntFlag#period: beginChunk 79 | jdk.UnsignedIntFlag#enabled: true 80 | jdk.UnsignedIntFlag#period: beginChunk 81 | jdk.LongFlag#enabled: true 82 | jdk.LongFlag#period: beginChunk 83 | jdk.UnsignedLongFlag#enabled: true 84 | jdk.UnsignedLongFlag#period: beginChunk 85 | jdk.DoubleFlag#enabled: true 86 | jdk.DoubleFlag#period: beginChunk 87 | jdk.BooleanFlag#enabled: true 88 | jdk.BooleanFlag#period: beginChunk 89 | jdk.StringFlag#enabled: true 90 | jdk.StringFlag#period: beginChunk 91 | jdk.IntFlagChanged#enabled: true 92 | jdk.UnsignedIntFlagChanged#enabled: true 93 | jdk.LongFlagChanged#enabled: true 94 | jdk.UnsignedLongFlagChanged#enabled: true 95 | jdk.DoubleFlagChanged#enabled: true 96 | jdk.BooleanFlagChanged#enabled: true 97 | jdk.StringFlagChanged#enabled: true 98 | jdk.ObjectCount#enabled: false 99 | jdk.ObjectCount#period: everyChunk 100 | jdk.GCConfiguration#enabled: true 101 | jdk.GCConfiguration#period: everyChunk 102 | jdk.GCHeapConfiguration#enabled: true 103 | jdk.GCHeapConfiguration#period: beginChunk 104 | jdk.YoungGenerationConfiguration#enabled: true 105 | jdk.YoungGenerationConfiguration#period: beginChunk 106 | jdk.GCTLABConfiguration#enabled: true 107 | jdk.GCTLABConfiguration#period: beginChunk 108 | jdk.GCSurvivorConfiguration#enabled: true 109 | jdk.GCSurvivorConfiguration#period: beginChunk 110 | jdk.ObjectCountAfterGC#enabled: false 111 | jdk.GCHeapSummary#enabled: true 112 | jdk.PSHeapSummary#enabled: true 113 | jdk.G1HeapSummary#enabled: true 114 | jdk.MetaspaceSummary#enabled: true 115 | jdk.MetaspaceGCThreshold#enabled: true 116 | jdk.MetaspaceAllocationFailure#enabled: true 117 | jdk.MetaspaceAllocationFailure#stackTrace: true 118 | jdk.MetaspaceOOM#enabled: true 119 | jdk.MetaspaceOOM#stackTrace: true 120 | jdk.MetaspaceChunkFreeListSummary#enabled: true 121 | jdk.GarbageCollection#enabled: true 122 | jdk.GarbageCollection#threshold: 0 ms 123 | jdk.ParallelOldGarbageCollection#enabled: true 124 | jdk.ParallelOldGarbageCollection#threshold: 0 ms 125 | jdk.YoungGarbageCollection#enabled: true 126 | jdk.YoungGarbageCollection#threshold: 0 ms 127 | jdk.OldGarbageCollection#enabled: true 128 | jdk.OldGarbageCollection#threshold: 0 ms 129 | jdk.G1GarbageCollection#enabled: true 130 | jdk.G1GarbageCollection#threshold: 0 ms 131 | jdk.GCPhasePause#enabled: true 132 | jdk.GCPhasePause#threshold: 0 ms 133 | jdk.GCPhasePauseLevel1#enabled: true 134 | jdk.GCPhasePauseLevel1#threshold: 0 ms 135 | jdk.GCPhasePauseLevel2#enabled: true 136 | jdk.GCPhasePauseLevel2#threshold: 0 ms 137 | jdk.GCPhasePauseLevel3#enabled: false 138 | jdk.GCPhasePauseLevel3#threshold: 0 ms 139 | jdk.GCPhasePauseLevel4#enabled: false 140 | jdk.GCPhasePauseLevel4#threshold: 0 ms 141 | jdk.GCPhaseConcurrent#enabled: true 142 | jdk.GCPhaseConcurrent#threshold: 0 ms 143 | jdk.GCReferenceStatistics#enabled: true 144 | jdk.PromotionFailed#enabled: true 145 | jdk.EvacuationFailed#enabled: true 146 | jdk.EvacuationInformation#enabled: true 147 | jdk.G1MMU#enabled: true 148 | jdk.G1EvacuationYoungStatistics#enabled: true 149 | jdk.G1EvacuationOldStatistics#enabled: true 150 | jdk.GCPhaseParallel#enabled: true 151 | jdk.GCPhaseParallel#threshold: 0 ms 152 | jdk.G1BasicIHOP#enabled: true 153 | jdk.G1AdaptiveIHOP#enabled: true 154 | jdk.PromoteObjectInNewPLAB#enabled: true 155 | jdk.PromoteObjectOutsidePLAB#enabled: true 156 | jdk.ConcurrentModeFailure#enabled: true 157 | jdk.AllocationRequiringGC#enabled: false 158 | jdk.AllocationRequiringGC#stackTrace: true 159 | jdk.TenuringDistribution#enabled: true 160 | jdk.G1HeapRegionInformation#enabled: false 161 | jdk.G1HeapRegionInformation#period: everyChunk 162 | jdk.G1HeapRegionTypeChange#enabled: false 163 | jdk.ShenandoahHeapRegionInformation#enabled: false 164 | jdk.ShenandoahHeapRegionInformation#period: everyChunk 165 | jdk.ShenandoahHeapRegionStateChange#enabled: false 166 | jdk.OldObjectSample#enabled: true 167 | jdk.OldObjectSample#stackTrace: true 168 | jdk.OldObjectSample#cutoff: 0 ns 169 | jdk.CompilerConfiguration#enabled: true 170 | jdk.CompilerConfiguration#period: beginChunk 171 | jdk.CompilerStatistics#enabled: true 172 | jdk.CompilerStatistics#period: 1000 ms 173 | jdk.Compilation#enabled: true 174 | jdk.Compilation#threshold: 100 ms 175 | jdk.CompilerPhase#enabled: true 176 | jdk.CompilerPhase#threshold: 10 s 177 | jdk.CompilationFailure#enabled: true 178 | jdk.CompilerInlining#enabled: false 179 | jdk.CodeSweeperConfiguration#enabled: true 180 | jdk.CodeSweeperConfiguration#period: beginChunk 181 | jdk.CodeSweeperStatistics#enabled: true 182 | jdk.CodeSweeperStatistics#period: everyChunk 183 | jdk.SweepCodeCache#enabled: true 184 | jdk.SweepCodeCache#threshold: 100 ms 185 | jdk.CodeCacheConfiguration#enabled: true 186 | jdk.CodeCacheConfiguration#period: beginChunk 187 | jdk.CodeCacheStatistics#enabled: true 188 | jdk.CodeCacheStatistics#period: everyChunk 189 | jdk.CodeCacheFull#enabled: true 190 | jdk.OSInformation#enabled: true 191 | jdk.OSInformation#period: beginChunk 192 | jdk.VirtualizationInformation#enabled: true 193 | jdk.VirtualizationInformation#period: beginChunk 194 | jdk.CPUInformation#enabled: true 195 | jdk.CPUInformation#period: beginChunk 196 | jdk.ThreadContextSwitchRate#enabled: true 197 | jdk.ThreadContextSwitchRate#period: 10 s 198 | jdk.CPULoad#enabled: true 199 | jdk.CPULoad#period: 1000 ms 200 | jdk.ThreadCPULoad#enabled: true 201 | jdk.ThreadCPULoad#period: 10 s 202 | jdk.CPUTimeStampCounter#enabled: true 203 | jdk.CPUTimeStampCounter#period: beginChunk 204 | jdk.SystemProcess#enabled: true 205 | jdk.SystemProcess#period: endChunk 206 | jdk.NetworkUtilization#enabled: true 207 | jdk.NetworkUtilization#period: 5 s 208 | jdk.InitialEnvironmentVariable#enabled: true 209 | jdk.InitialEnvironmentVariable#period: beginChunk 210 | jdk.PhysicalMemory#enabled: true 211 | jdk.PhysicalMemory#period: everyChunk 212 | jdk.ObjectAllocationInNewTLAB#enabled: true 213 | jdk.ObjectAllocationInNewTLAB#stackTrace: true 214 | jdk.ObjectAllocationOutsideTLAB#enabled: true 215 | jdk.ObjectAllocationOutsideTLAB#stackTrace: true 216 | jdk.NativeLibrary#enabled: true 217 | jdk.NativeLibrary#period: everyChunk 218 | jdk.ModuleRequire#enabled: true 219 | jdk.ModuleRequire#period: endChunk 220 | jdk.ModuleExport#enabled: true 221 | jdk.ModuleExport#period: endChunk 222 | jdk.FileForce#enabled: true 223 | jdk.FileForce#stackTrace: true 224 | jdk.FileForce#threshold: 10 ms 225 | jdk.FileRead#enabled: true 226 | jdk.FileRead#stackTrace: true 227 | jdk.FileRead#threshold: 10 ms 228 | jdk.FileWrite#enabled: true 229 | jdk.FileWrite#stackTrace: true 230 | jdk.FileWrite#threshold: 10 ms 231 | jdk.SocketRead#enabled: true 232 | jdk.SocketRead#stackTrace: true 233 | jdk.SocketRead#threshold: 10 ms 234 | jdk.SocketWrite#enabled: true 235 | jdk.SocketWrite#stackTrace: true 236 | jdk.SocketWrite#threshold: 10 ms 237 | jdk.SecurityPropertyModification#enabled: false 238 | jdk.SecurityPropertyModification#stackTrace: true 239 | jdk.TLSHandshake#enabled: false 240 | jdk.TLSHandshake#stackTrace: true 241 | jdk.X509Validation#enabled: false 242 | jdk.X509Validation#stackTrace: true 243 | jdk.X509Certificate#enabled: false 244 | jdk.X509Certificate#stackTrace: true 245 | jdk.JavaExceptionThrow#enabled: false 246 | jdk.JavaExceptionThrow#stackTrace: true 247 | jdk.JavaErrorThrow#enabled: true 248 | jdk.JavaErrorThrow#stackTrace: true 249 | jdk.ExceptionStatistics#enabled: true 250 | jdk.ExceptionStatistics#period: 1000 ms 251 | jdk.ActiveRecording#enabled: true 252 | jdk.ActiveSetting#enabled: true 253 | jdk.Flush#enabled: true 254 | jdk.Flush#threshold: 0 ns 255 | jdk.FlushStorage#enabled: true 256 | jdk.FlushStorage#threshold: 0 ns 257 | jdk.FlushStacktrace#enabled: true 258 | jdk.FlushStacktrace#threshold: 0 ns 259 | jdk.FlushStringPool#enabled: true 260 | jdk.FlushStringPool#threshold: 0 ns 261 | jdk.FlushMetadata#enabled: true 262 | jdk.FlushMetadata#threshold: 0 ns 263 | jdk.FlushTypeSet#enabled: true 264 | jdk.FlushTypeSet#threshold: 0 ns 265 | jdk.DataLoss#enabled: true 266 | jdk.DumpReason#enabled: true 267 | jdk.ZPageAllocation#enabled: true 268 | jdk.ZPageAllocation#threshold: 10 ms 269 | jdk.ZThreadPhase#enabled: true 270 | jdk.ZThreadPhase#threshold: 0 ms 271 | jdk.ZStatisticsCounter#enabled: false 272 | jdk.ZStatisticsCounter#threshold: 0 ms 273 | jdk.ZStatisticsSampler#enabled: false 274 | jdk.ZStatisticsSampler#threshold: 0 ms -------------------------------------------------------------------------------- /default-jre.txt: -------------------------------------------------------------------------------- 1 | jdk.ThreadAllocationStatistics#enabled: true 2 | jdk.ThreadAllocationStatistics#period: everyChunk 3 | jdk.ClassLoadingStatistics#enabled: true 4 | jdk.ClassLoadingStatistics#period: 1000 ms 5 | jdk.ClassLoaderStatistics#enabled: true 6 | jdk.ClassLoaderStatistics#period: everyChunk 7 | jdk.JavaThreadStatistics#enabled: true 8 | jdk.JavaThreadStatistics#period: 1000 ms 9 | jdk.SymbolTableStatistics#enabled: true 10 | jdk.SymbolTableStatistics#period: 10 s 11 | jdk.StringTableStatistics#enabled: true 12 | jdk.StringTableStatistics#period: 10 s 13 | jdk.PlaceholderTableStatistics#enabled: true 14 | jdk.PlaceholderTableStatistics#period: 10 s 15 | jdk.LoaderConstraintsTableStatistics#enabled: true 16 | jdk.LoaderConstraintsTableStatistics#period: 10 s 17 | jdk.ProtectionDomainCacheTableStatistics#enabled: true 18 | jdk.ProtectionDomainCacheTableStatistics#period: 10 s 19 | jdk.ThreadStart#enabled: true 20 | jdk.ThreadEnd#enabled: true 21 | jdk.ThreadSleep#enabled: true 22 | jdk.ThreadSleep#stackTrace: true 23 | jdk.ThreadSleep#threshold: 20 ms 24 | jdk.ThreadPark#enabled: true 25 | jdk.ThreadPark#stackTrace: true 26 | jdk.ThreadPark#threshold: 20 ms 27 | jdk.JavaMonitorEnter#enabled: true 28 | jdk.JavaMonitorEnter#stackTrace: true 29 | jdk.JavaMonitorEnter#threshold: 20 ms 30 | jdk.JavaMonitorWait#enabled: true 31 | jdk.JavaMonitorWait#stackTrace: true 32 | jdk.JavaMonitorWait#threshold: 20 ms 33 | jdk.JavaMonitorInflate#enabled: false 34 | jdk.JavaMonitorInflate#stackTrace: true 35 | jdk.JavaMonitorInflate#threshold: 20 ms 36 | jdk.BiasedLockRevocation#enabled: true 37 | jdk.BiasedLockRevocation#stackTrace: true 38 | jdk.BiasedLockRevocation#threshold: 0 ms 39 | jdk.BiasedLockSelfRevocation#enabled: true 40 | jdk.BiasedLockSelfRevocation#stackTrace: true 41 | jdk.BiasedLockSelfRevocation#threshold: 0 ms 42 | jdk.BiasedLockClassRevocation#enabled: true 43 | jdk.BiasedLockClassRevocation#stackTrace: true 44 | jdk.BiasedLockClassRevocation#threshold: 0 ms 45 | jdk.ReservedStackActivation#enabled: true 46 | jdk.ReservedStackActivation#stackTrace: true 47 | jdk.ClassLoad#enabled: false 48 | jdk.ClassLoad#stackTrace: true 49 | jdk.ClassLoad#threshold: 0 ms 50 | jdk.ClassDefine#enabled: false 51 | jdk.ClassDefine#stackTrace: true 52 | jdk.ClassUnload#enabled: false 53 | jdk.JVMInformation#enabled: true 54 | jdk.JVMInformation#period: beginChunk 55 | jdk.InitialSystemProperty#enabled: true 56 | jdk.InitialSystemProperty#period: beginChunk 57 | jdk.ExecutionSample#enabled: true 58 | jdk.ExecutionSample#period: 20 ms 59 | jdk.NativeMethodSample#enabled: true 60 | jdk.NativeMethodSample#period: 20 ms 61 | jdk.SafepointBegin#enabled: true 62 | jdk.SafepointBegin#threshold: 10 ms 63 | jdk.SafepointStateSynchronization#enabled: false 64 | jdk.SafepointStateSynchronization#threshold: 10 ms 65 | jdk.SafepointCleanup#enabled: false 66 | jdk.SafepointCleanup#threshold: 10 ms 67 | jdk.SafepointCleanupTask#enabled: false 68 | jdk.SafepointCleanupTask#threshold: 10 ms 69 | jdk.SafepointEnd#enabled: false 70 | jdk.SafepointEnd#threshold: 10 ms 71 | jdk.ExecuteVMOperation#enabled: true 72 | jdk.ExecuteVMOperation#threshold: 10 ms 73 | jdk.Shutdown#enabled: true 74 | jdk.Shutdown#stackTrace: true 75 | jdk.ThreadDump#enabled: true 76 | jdk.ThreadDump#period: everyChunk 77 | jdk.IntFlag#enabled: true 78 | jdk.IntFlag#period: beginChunk 79 | jdk.UnsignedIntFlag#enabled: true 80 | jdk.UnsignedIntFlag#period: beginChunk 81 | jdk.LongFlag#enabled: true 82 | jdk.LongFlag#period: beginChunk 83 | jdk.UnsignedLongFlag#enabled: true 84 | jdk.UnsignedLongFlag#period: beginChunk 85 | jdk.DoubleFlag#enabled: true 86 | jdk.DoubleFlag#period: beginChunk 87 | jdk.BooleanFlag#enabled: true 88 | jdk.BooleanFlag#period: beginChunk 89 | jdk.StringFlag#enabled: true 90 | jdk.StringFlag#period: beginChunk 91 | jdk.IntFlagChanged#enabled: true 92 | jdk.UnsignedIntFlagChanged#enabled: true 93 | jdk.LongFlagChanged#enabled: true 94 | jdk.UnsignedLongFlagChanged#enabled: true 95 | jdk.DoubleFlagChanged#enabled: true 96 | jdk.BooleanFlagChanged#enabled: true 97 | jdk.StringFlagChanged#enabled: true 98 | jdk.ObjectCount#enabled: false 99 | jdk.ObjectCount#period: everyChunk 100 | jdk.GCConfiguration#enabled: true 101 | jdk.GCConfiguration#period: everyChunk 102 | jdk.GCHeapConfiguration#enabled: true 103 | jdk.GCHeapConfiguration#period: beginChunk 104 | jdk.YoungGenerationConfiguration#enabled: true 105 | jdk.YoungGenerationConfiguration#period: beginChunk 106 | jdk.GCTLABConfiguration#enabled: true 107 | jdk.GCTLABConfiguration#period: beginChunk 108 | jdk.GCSurvivorConfiguration#enabled: true 109 | jdk.GCSurvivorConfiguration#period: beginChunk 110 | jdk.ObjectCountAfterGC#enabled: false 111 | jdk.GCHeapSummary#enabled: true 112 | jdk.PSHeapSummary#enabled: true 113 | jdk.G1HeapSummary#enabled: true 114 | jdk.MetaspaceSummary#enabled: true 115 | jdk.MetaspaceGCThreshold#enabled: true 116 | jdk.MetaspaceAllocationFailure#enabled: true 117 | jdk.MetaspaceAllocationFailure#stackTrace: true 118 | jdk.MetaspaceOOM#enabled: true 119 | jdk.MetaspaceOOM#stackTrace: true 120 | jdk.MetaspaceChunkFreeListSummary#enabled: true 121 | jdk.GarbageCollection#enabled: true 122 | jdk.GarbageCollection#threshold: 0 ms 123 | jdk.ParallelOldGarbageCollection#enabled: true 124 | jdk.ParallelOldGarbageCollection#threshold: 0 ms 125 | jdk.YoungGarbageCollection#enabled: true 126 | jdk.YoungGarbageCollection#threshold: 0 ms 127 | jdk.OldGarbageCollection#enabled: true 128 | jdk.OldGarbageCollection#threshold: 0 ms 129 | jdk.G1GarbageCollection#enabled: true 130 | jdk.G1GarbageCollection#threshold: 0 ms 131 | jdk.GCPhasePause#enabled: true 132 | jdk.GCPhasePause#threshold: 0 ms 133 | jdk.GCPhasePauseLevel1#enabled: true 134 | jdk.GCPhasePauseLevel1#threshold: 0 ms 135 | jdk.GCPhasePauseLevel2#enabled: true 136 | jdk.GCPhasePauseLevel2#threshold: 0 ms 137 | jdk.GCPhasePauseLevel3#enabled: false 138 | jdk.GCPhasePauseLevel3#threshold: 0 ms 139 | jdk.GCPhasePauseLevel4#enabled: false 140 | jdk.GCPhasePauseLevel4#threshold: 0 ms 141 | jdk.GCPhaseConcurrent#enabled: true 142 | jdk.GCPhaseConcurrent#threshold: 0 ms 143 | jdk.GCReferenceStatistics#enabled: true 144 | jdk.PromotionFailed#enabled: true 145 | jdk.EvacuationFailed#enabled: true 146 | jdk.EvacuationInformation#enabled: true 147 | jdk.G1MMU#enabled: true 148 | jdk.G1EvacuationYoungStatistics#enabled: true 149 | jdk.G1EvacuationOldStatistics#enabled: true 150 | jdk.GCPhaseParallel#enabled: true 151 | jdk.GCPhaseParallel#threshold: 0 ms 152 | jdk.G1BasicIHOP#enabled: true 153 | jdk.G1AdaptiveIHOP#enabled: true 154 | jdk.PromoteObjectInNewPLAB#enabled: false 155 | jdk.PromoteObjectOutsidePLAB#enabled: false 156 | jdk.ConcurrentModeFailure#enabled: true 157 | jdk.AllocationRequiringGC#enabled: false 158 | jdk.AllocationRequiringGC#stackTrace: true 159 | jdk.TenuringDistribution#enabled: true 160 | jdk.G1HeapRegionInformation#enabled: false 161 | jdk.G1HeapRegionInformation#period: everyChunk 162 | jdk.G1HeapRegionTypeChange#enabled: false 163 | jdk.ShenandoahHeapRegionInformation#enabled: false 164 | jdk.ShenandoahHeapRegionInformation#period: everyChunk 165 | jdk.ShenandoahHeapRegionStateChange#enabled: false 166 | jdk.OldObjectSample#enabled: true 167 | jdk.OldObjectSample#stackTrace: false 168 | jdk.OldObjectSample#cutoff: 0 ns 169 | jdk.CompilerConfiguration#enabled: true 170 | jdk.CompilerConfiguration#period: beginChunk 171 | jdk.CompilerStatistics#enabled: true 172 | jdk.CompilerStatistics#period: 1000 ms 173 | jdk.Compilation#enabled: true 174 | jdk.Compilation#threshold: 1000 ms 175 | jdk.CompilerPhase#enabled: true 176 | jdk.CompilerPhase#threshold: 60 s 177 | jdk.CompilationFailure#enabled: false 178 | jdk.CompilerInlining#enabled: false 179 | jdk.CodeSweeperConfiguration#enabled: true 180 | jdk.CodeSweeperConfiguration#period: beginChunk 181 | jdk.CodeSweeperStatistics#enabled: true 182 | jdk.CodeSweeperStatistics#period: everyChunk 183 | jdk.SweepCodeCache#enabled: true 184 | jdk.SweepCodeCache#threshold: 100 ms 185 | jdk.CodeCacheConfiguration#enabled: true 186 | jdk.CodeCacheConfiguration#period: beginChunk 187 | jdk.CodeCacheStatistics#enabled: true 188 | jdk.CodeCacheStatistics#period: everyChunk 189 | jdk.CodeCacheFull#enabled: true 190 | jdk.OSInformation#enabled: true 191 | jdk.OSInformation#period: beginChunk 192 | jdk.VirtualizationInformation#enabled: true 193 | jdk.VirtualizationInformation#period: beginChunk 194 | jdk.CPUInformation#enabled: true 195 | jdk.CPUInformation#period: beginChunk 196 | jdk.ThreadContextSwitchRate#enabled: true 197 | jdk.ThreadContextSwitchRate#period: 10 s 198 | jdk.CPULoad#enabled: true 199 | jdk.CPULoad#period: 1000 ms 200 | jdk.ThreadCPULoad#enabled: true 201 | jdk.ThreadCPULoad#period: 10 s 202 | jdk.CPUTimeStampCounter#enabled: true 203 | jdk.CPUTimeStampCounter#period: beginChunk 204 | jdk.SystemProcess#enabled: true 205 | jdk.SystemProcess#period: endChunk 206 | jdk.NetworkUtilization#enabled: true 207 | jdk.NetworkUtilization#period: 5 s 208 | jdk.InitialEnvironmentVariable#enabled: true 209 | jdk.InitialEnvironmentVariable#period: beginChunk 210 | jdk.PhysicalMemory#enabled: true 211 | jdk.PhysicalMemory#period: everyChunk 212 | jdk.ObjectAllocationInNewTLAB#enabled: false 213 | jdk.ObjectAllocationInNewTLAB#stackTrace: true 214 | jdk.ObjectAllocationOutsideTLAB#enabled: false 215 | jdk.ObjectAllocationOutsideTLAB#stackTrace: true 216 | jdk.NativeLibrary#enabled: true 217 | jdk.NativeLibrary#period: everyChunk 218 | jdk.ModuleRequire#enabled: true 219 | jdk.ModuleRequire#period: endChunk 220 | jdk.ModuleExport#enabled: true 221 | jdk.ModuleExport#period: endChunk 222 | jdk.FileForce#enabled: true 223 | jdk.FileForce#stackTrace: true 224 | jdk.FileForce#threshold: 20 ms 225 | jdk.FileRead#enabled: true 226 | jdk.FileRead#stackTrace: true 227 | jdk.FileRead#threshold: 20 ms 228 | jdk.FileWrite#enabled: true 229 | jdk.FileWrite#stackTrace: true 230 | jdk.FileWrite#threshold: 20 ms 231 | jdk.SocketRead#enabled: true 232 | jdk.SocketRead#stackTrace: true 233 | jdk.SocketRead#threshold: 20 ms 234 | jdk.SocketWrite#enabled: true 235 | jdk.SocketWrite#stackTrace: true 236 | jdk.SocketWrite#threshold: 20 ms 237 | jdk.SecurityPropertyModification#enabled: false 238 | jdk.SecurityPropertyModification#stackTrace: true 239 | jdk.TLSHandshake#enabled: false 240 | jdk.TLSHandshake#stackTrace: true 241 | jdk.X509Validation#enabled: false 242 | jdk.X509Validation#stackTrace: true 243 | jdk.X509Certificate#enabled: false 244 | jdk.X509Certificate#stackTrace: true 245 | jdk.JavaExceptionThrow#enabled: false 246 | jdk.JavaExceptionThrow#stackTrace: true 247 | jdk.JavaErrorThrow#enabled: true 248 | jdk.JavaErrorThrow#stackTrace: true 249 | jdk.ExceptionStatistics#enabled: true 250 | jdk.ExceptionStatistics#period: 1000 ms 251 | jdk.ActiveRecording#enabled: true 252 | jdk.ActiveSetting#enabled: true 253 | jdk.Flush#enabled: true 254 | jdk.Flush#threshold: 0 ns 255 | jdk.FlushStorage#enabled: true 256 | jdk.FlushStorage#threshold: 0 ns 257 | jdk.FlushStacktrace#enabled: true 258 | jdk.FlushStacktrace#threshold: 0 ns 259 | jdk.FlushStringPool#enabled: true 260 | jdk.FlushStringPool#threshold: 0 ns 261 | jdk.FlushMetadata#enabled: true 262 | jdk.FlushMetadata#threshold: 0 ns 263 | jdk.FlushTypeSet#enabled: true 264 | jdk.FlushTypeSet#threshold: 0 ns 265 | jdk.DataLoss#enabled: true 266 | jdk.DumpReason#enabled: true 267 | jdk.ZPageAllocation#enabled: true 268 | jdk.ZPageAllocation#threshold: 10 ms 269 | jdk.ZThreadPhase#enabled: true 270 | jdk.ZThreadPhase#threshold: 0 ms 271 | jdk.ZStatisticsCounter#enabled: false 272 | jdk.ZStatisticsCounter#threshold: 0 ms 273 | jdk.ZStatisticsSampler#enabled: false 274 | jdk.ZStatisticsSampler#threshold: 0 ms -------------------------------------------------------------------------------- /THREAD_DUMP.md: -------------------------------------------------------------------------------- 1 | # THREAD_DUMP 2 | 3 | - `#period: 60 s` 4 | 5 | ``` 6 | jdk.ThreadDump { 7 | startTime = 12:23:59.509 8 | result = "2019-12-31 12:23:58 9 | Full thread dump OpenJDK 64-Bit Server VM (14-ea+28-1366 mixed mode, sharing): 10 | 11 | Threads class SMR info: 12 | _java_thread_list=0x00007fc79400d0f0, length=20, elements={ 13 | 0x00007fc7f41f0800, 0x00007fc7f41f2800, 0x00007fc7f41f9800, 0x00007fc7f41fb800, 14 | 0x00007fc7f41fd800, 0x00007fc7f41ff800, 0x00007fc7f4201800, 0x00007fc7f421f000, 15 | 0x00007fc7f42b8000, 0x00007fc7f42b8800, 0x00007fc7f42ed800, 0x00007fc7f4309000, 16 | 0x00007fc7f430a800, 0x00007fc7f430c000, 0x00007fc7f430e000, 0x00007fc7f402b800, 17 | 0x00007fc78403f000, 0x00007fc7840ce800, 0x00007fc748001800, 0x00007fc7ac001000 18 | } 19 | 20 | "Reference Handler" #2 daemon prio=10 os_prio=0 cpu=1,02ms elapsed=5,99s tid=0x00007fc7f41f0800 nid=0x6637 waiting on condition [0x00007fc7d8562000] 21 | java.lang.Thread.State: RUNNABLE 22 | at java.lang.ref.Reference.waitForReferencePendingList(java.base@14-ea/Native Method) 23 | at java.lang.ref.Reference.processPendingReferences(java.base@14-ea/Reference.java:241) 24 | at java.lang.ref.Reference$ReferenceHandler.run(java.base@14-ea/Reference.java:213) 25 | 26 | "Finalizer" #3 daemon prio=8 os_prio=0 cpu=0,45ms elapsed=5,99s tid=0x00007fc7f41f2800 nid=0x6638 in Object.wait() [0x00007fc7d8461000] 27 | java.lang.Thread.State: WAITING (on object monitor) 28 | at java.lang.Object.wait(java.base@14-ea/Native Method) 29 | - waiting on <0x00000000c3d00178> (a java.lang.ref.ReferenceQueue$Lock) 30 | at java.lang.ref.ReferenceQueue.remove(java.base@14-ea/ReferenceQueue.java:155) 31 | - locked <0x00000000c3d00178> (a java.lang.ref.ReferenceQueue$Lock) 32 | at java.lang.ref.ReferenceQueue.remove(java.base@14-ea/ReferenceQueue.java:176) 33 | at java.lang.ref.Finalizer$FinalizerThread.run(java.base@14-ea/Finalizer.java:170) 34 | 35 | "Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0,26ms elapsed=5,99s tid=0x00007fc7f41f9800 nid=0x6639 runnable [0x0000000000000000] 36 | java.lang.Thread.State: RUNNABLE 37 | 38 | "Service Thread" #5 daemon prio=9 os_prio=0 cpu=0,70ms elapsed=5,99s tid=0x00007fc7f41fb800 nid=0x663a runnable [0x0000000000000000] 39 | java.lang.Thread.State: RUNNABLE 40 | 41 | "C2 CompilerThread0" #6 daemon prio=9 os_prio=0 cpu=1202,76ms elapsed=5,99s tid=0x00007fc7f41fd800 nid=0x663b waiting on condition [0x0000000000000000] 42 | java.lang.Thread.State: RUNNABLE 43 | No compile task 44 | 45 | "C1 CompilerThread0" #9 daemon prio=9 os_prio=0 cpu=552,09ms elapsed=5,99s tid=0x00007fc7f41ff800 nid=0x663c waiting on condition [0x0000000000000000] 46 | java.lang.Thread.State: RUNNABLE 47 | No compile task 48 | 49 | "Sweeper thread" #10 daemon prio=9 os_prio=0 cpu=11,63ms elapsed=5,99s tid=0x00007fc7f4201800 nid=0x663d runnable [0x0000000000000000] 50 | java.lang.Thread.State: RUNNABLE 51 | 52 | "Common-Cleaner" #11 daemon prio=8 os_prio=0 cpu=0,90ms elapsed=5,96s tid=0x00007fc7f421f000 nid=0x6641 in Object.wait() [0x00007fc7c99ed000] 53 | java.lang.Thread.State: TIMED_WAITING (on object monitor) 54 | at java.lang.Object.wait(java.base@14-ea/Native Method) 55 | - waiting on <0x00000000c3ba4db8> (a java.lang.ref.ReferenceQueue$Lock) 56 | at java.lang.ref.ReferenceQueue.remove(java.base@14-ea/ReferenceQueue.java:155) 57 | - locked <0x00000000c3ba4db8> (a java.lang.ref.ReferenceQueue$Lock) 58 | at jdk.internal.ref.CleanerImpl.run(java.base@14-ea/CleanerImpl.java:148) 59 | at java.lang.Thread.run(java.base@14-ea/Thread.java:832) 60 | at jdk.internal.misc.InnocuousThread.run(java.base@14-ea/InnocuousThread.java:134) 61 | 62 | "Monitor Ctrl-Break" #12 daemon prio=5 os_prio=0 cpu=17,00ms elapsed=5,91s tid=0x00007fc7f42b8000 nid=0x6643 runnable [0x00007fc7c97eb000] 63 | java.lang.Thread.State: RUNNABLE 64 | at sun.nio.ch.SocketDispatcher.read0(java.base@14-ea/Native Method) 65 | at sun.nio.ch.SocketDispatcher.read(java.base@14-ea/SocketDispatcher.java:47) 66 | at sun.nio.ch.NioSocketImpl.tryRead(java.base@14-ea/NioSocketImpl.java:261) 67 | at sun.nio.ch.NioSocketImpl.implRead(java.base@14-ea/NioSocketImpl.java:312) 68 | at sun.nio.ch.NioSocketImpl.read(java.base@14-ea/NioSocketImpl.java:350) 69 | at sun.nio.ch.NioSocketImpl$1.read(java.base@14-ea/NioSocketImpl.java:803) 70 | at java.net.Socket$SocketInputStream.read(java.base@14-ea/Unknown Source) 71 | at sun.nio.cs.StreamDecoder.readBytes(java.base@14-ea/StreamDecoder.java:297) 72 | at sun.nio.cs.StreamDecoder.implRead(java.base@14-ea/StreamDecoder.java:339) 73 | at sun.nio.cs.StreamDecoder.read(java.base@14-ea/StreamDecoder.java:188) 74 | - locked <0x00000000c3b58bc8> (a java.io.InputStreamReader) 75 | at java.io.InputStreamReader.read(java.base@14-ea/InputStreamReader.java:181) 76 | at java.io.BufferedReader.fill(java.base@14-ea/BufferedReader.java:161) 77 | at java.io.BufferedReader.readLine(java.base@14-ea/BufferedReader.java:326) 78 | - locked <0x00000000c3b58bc8> (a java.io.InputStreamReader) 79 | at java.io.BufferedReader.readLine(java.base@14-ea/BufferedReader.java:392) 80 | at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64) 81 | 82 | "Notification Thread" #13 daemon prio=9 os_prio=0 cpu=0,12ms elapsed=5,91s tid=0x00007fc7f42b8800 nid=0x6644 runnable [0x0000000000000000] 83 | java.lang.Thread.State: RUNNABLE 84 | 85 | "jfr-0" #14 prio=5 os_prio=0 cpu=808,68ms elapsed=5,82s tid=0x00007fc7f42ed800 nid=0x6647 in Object.wait() [0x00007fc7c94e6000] 86 | java.lang.Thread.State: TIMED_WAITING (on object monitor) 87 | at java.lang.Object.wait(java.base@14-ea/Native Method) 88 | - waiting on <0x00000000d8100450> (a java.lang.Object) 89 | at jdk.jfr.internal.Utils.waitFlush(jdk.jfr@14-ea/Utils.java:713) 90 | - locked <0x00000000d8100450> (a java.lang.Object) 91 | at jdk.jfr.internal.consumer.ChunkParser.awaitUpdatedHeader(jdk.jfr@14-ea/ChunkParser.java:297) 92 | at jdk.jfr.internal.consumer.ChunkParser.readStreamingEvent(jdk.jfr@14-ea/ChunkParser.java:202) 93 | at jdk.jfr.internal.consumer.EventDirectoryStream.processOrdered(jdk.jfr@14-ea/EventDirectoryStream.java:193) 94 | at jdk.jfr.internal.consumer.EventDirectoryStream.processRecursionSafe(jdk.jfr@14-ea/EventDirectoryStream.java:139) 95 | at jdk.jfr.internal.consumer.EventDirectoryStream.process(jdk.jfr@14-ea/EventDirectoryStream.java:97) 96 | at jdk.jfr.internal.consumer.AbstractEventStream.execute(jdk.jfr@14-ea/AbstractEventStream.java:243) 97 | at jdk.jfr.internal.consumer.AbstractEventStream$1.run(jdk.jfr@14-ea/AbstractEventStream.java:265) 98 | at jdk.jfr.internal.consumer.AbstractEventStream$1.run(jdk.jfr@14-ea/AbstractEventStream.java:262) 99 | at java.security.AccessController.executePrivileged(java.base@14-ea/AccessController.java:753) 100 | at java.security.AccessController.doPrivileged(java.base@14-ea/AccessController.java:391) 101 | at jdk.jfr.internal.consumer.AbstractEventStream.run(jdk.jfr@14-ea/AbstractEventStream.java:262) 102 | at jdk.jfr.internal.consumer.AbstractEventStream.start(jdk.jfr@14-ea/AbstractEventStream.java:222) 103 | at jdk.jfr.consumer.RecordingStream.start(jdk.jfr@14-ea/RecordingStream.java:344) 104 | at pbouda.jfr.Jfr.lambda$start$2(Jfr.java:48) 105 | at pbouda.jfr.Jfr$$Lambda$21/0x0000000800b77040.run(Unknown Source) 106 | at java.util.concurrent.Executors$RunnableAdapter.call(java.base@14-ea/Executors.java:515) 107 | at java.util.concurrent.FutureTask.run(java.base@14-ea/FutureTask.java:264) 108 | at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@14-ea/ThreadPoolExecutor.java:1130) 109 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@14-ea/ThreadPoolExecutor.java:630) 110 | at java.lang.Thread.run(java.base@14-ea/Thread.java:832) 111 | 112 | "pool-1-thread-1" #15 prio=5 os_prio=0 cpu=2372,41ms elapsed=5,82s tid=0x00007fc7f4309000 nid=0x6648 waiting on condition [0x00007fc7c93e6000] 113 | java.lang.Thread.State: WAITING (parking) 114 | at jdk.internal.misc.Unsafe.park(java.base@14-ea/Native Method) 115 | - parking to wait for <0x00000000d8100f48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 116 | at java.util.concurrent.locks.LockSupport.park(java.base@14-ea/LockSupport.java:341) 117 | at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@14-ea/AbstractQueuedSynchronizer.java:505) 118 | at java.util.concurrent.ForkJoinPool.managedBlock(java.base@14-ea/ForkJoinPool.java:3137) 119 | at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@14-ea/AbstractQueuedSynchronizer.java:1614) 120 | at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@14-ea/ScheduledThreadPoolExecutor.java:1177) 121 | at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@14-ea/ScheduledThreadPoolExecutor.java:899) 122 | at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@14-ea/ThreadPoolExecutor.java:1056) 123 | at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@14-ea/ThreadPoolExecutor.java:1116) 124 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@14-ea/ThreadPoolExecutor.java:630) 125 | at java.lang.Thread.run(java.base@14-ea/Thread.java:832) 126 | 127 | "pool-1-thread-2" #16 prio=5 os_prio=0 cpu=2401,80ms elapsed=5,82s tid=0x00007fc7f430a800 nid=0x6649 waiting on condition [0x00007fc7c92e5000] 128 | java.lang.Thread.State: WAITING (parking) 129 | at jdk.internal.misc.Unsafe.park(java.base@14-ea/Native Method) 130 | - parking to wait for <0x00000000d8100f48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 131 | at java.util.concurrent.locks.LockSupport.park(java.base@14-ea/LockSupport.java:341) 132 | at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@14-ea/AbstractQueuedSynchronizer.java:505) 133 | at java.util.concurrent.ForkJoinPool.managedBlock(java.base@14-ea/ForkJoinPool.java:3137) 134 | at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@14-ea/AbstractQueuedSynchronizer.java:1614) 135 | at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@14-ea/ScheduledThreadPoolExecutor.java:1177) 136 | at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@14-ea/ScheduledThreadPoolExecutor.java:899) 137 | at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@14-ea/ThreadPoolExecutor.java:1056) 138 | at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@14-ea/ThreadPoolExecutor.java:1116) 139 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@14-ea/ThreadPoolExecutor.java:630) 140 | at java.lang.Thread.run(java.base@14-ea/Thread.java:832) 141 | 142 | "pool-1-thread-3" #17 prio=5 os_prio=0 cpu=2362,10ms elapsed=5,82s tid=0x00007fc7f430c000 nid=0x664a waiting on condition [0x00007fc7c91e4000] 143 | java.lang.Thread.State: TIMED_WAITING (parking) 144 | at jdk.internal.misc.Unsafe.park(java.base@14-ea/Native Method) 145 | - parking to wait for <0x00000000d8100f48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 146 | at java.util.concurrent.locks.LockSupport.parkNanos(java.base@14-ea/LockSupport.java:252) 147 | at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@14-ea/AbstractQueuedSynchronizer.java:1661) 148 | at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@14-ea/ScheduledThreadPoolExecutor.java:1182) 149 | at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@14-ea/ScheduledThreadPoolExecutor.java:899) 150 | at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@14-ea/ThreadPoolExecutor.java:1056) 151 | at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@14-ea/ThreadPoolExecutor.java:1116) 152 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@14-ea/ThreadPoolExecutor.java:630) 153 | at java.lang.Thread.run(java.base@14-ea/Thread.java:832) 154 | 155 | "pool-1-thread-4" #18 prio=5 os_prio=0 cpu=2467,58ms elapsed=5,82s tid=0x00007fc7f430e000 nid=0x664b waiting on condition [0x00007fc7c90e3000] 156 | java.lang.Thread.State: WAITING (parking) 157 | at jdk.internal.misc.Unsafe.park(java.base@14-ea/Native Method) 158 | - parking to wait for <0x00000000d8100f48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 159 | at java.util.concurrent.locks.LockSupport.park(java.base@14-ea/LockSupport.java:341) 160 | at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@14-ea/AbstractQueuedSynchronizer.java:505) 161 | at java.util.concurrent.ForkJoinPool.managedBlock(java.base@14-ea/ForkJoinPool.java:3137) 162 | at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@14-ea/AbstractQueuedSynchronizer.java:1614) 163 | at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@14-ea/ScheduledThreadPoolExecutor.java:1177) 164 | at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@14-ea/ScheduledThreadPoolExecutor.java:899) 165 | at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@14-ea/ThreadPoolExecutor.java:1056) 166 | at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@14-ea/ThreadPoolExecutor.java:1116) 167 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@14-ea/ThreadPoolExecutor.java:630) 168 | at java.lang.Thread.run(java.base@14-ea/Thread.java:832) 169 | 170 | "DestroyJavaVM" #19 prio=5 os_prio=0 cpu=178,57ms elapsed=5,82s tid=0x00007fc7f402b800 nid=0x6626 waiting on condition [0x0000000000000000] 171 | java.lang.Thread.State: RUNNABLE 172 | 173 | "JFR Recorder Thread" #20 daemon prio=5 os_prio=0 cpu=4,85ms elapsed=5,78s tid=0x00007fc78403f000 nid=0x664d waiting on condition [0x0000000000000000] 174 | java.lang.Thread.State: RUNNABLE 175 | 176 | "JFR Periodic Tasks" #21 daemon prio=5 os_prio=0 cpu=15,76ms elapsed=5,02s tid=0x00007fc7840ce800 nid=0x6659 waiting on condition [0x00007fc7736ed000] 177 | java.lang.Thread.State: RUNNABLE 178 | at jdk.jfr.internal.JVM.emitEvent(jdk.jfr@14-ea/Native Method) 179 | at jdk.jfr.internal.RequestEngine$RequestHook.execute(jdk.jfr@14-ea/RequestEngine.java:69) 180 | at jdk.jfr.internal.RequestEngine.run_requests(jdk.jfr@14-ea/RequestEngine.java:235) 181 | at jdk.jfr.internal.RequestEngine.doPeriodic(jdk.jfr@14-ea/RequestEngine.java:186) 182 | at jdk.jfr.internal.PlatformRecorder.periodicTask(jdk.jfr@14-ea/PlatformRecorder.java:472) 183 | at jdk.jfr.internal.PlatformRecorder.lambda$startDiskMonitor$1(jdk.jfr@14-ea/PlatformRecorder.java:417) 184 | at jdk.jfr.internal.PlatformRecorder$$Lambda$63/0x0000000800b81c40.run(jdk.jfr@14-ea/Unknown Source) 185 | at java.lang.Thread.run(java.base@14-ea/Thread.java:832) 186 | 187 | "JFR Recording Scheduler" #24 daemon prio=5 os_prio=0 cpu=0,11ms elapsed=5,00s tid=0x00007fc748001800 nid=0x665f in Object.wait() [0x00007fc7734eb000] 188 | java.lang.Thread.State: WAITING (on object monitor) 189 | at java.lang.Object.wait(java.base@14-ea/Native Method) 190 | - waiting on <0x00000000c3ba5510> (a java.util.TaskQueue) 191 | at java.lang.Object.wait(java.base@14-ea/Object.java:321) 192 | at java.util.TimerThread.mainLoop(java.base@14-ea/Timer.java:527) 193 | - locked <0x00000000c3ba5510> (a java.util.TaskQueue) 194 | at java.util.TimerThread.run(java.base@14-ea/Timer.java:506) 195 | 196 | "Attach Listener" #26 daemon prio=9 os_prio=0 cpu=18,77ms elapsed=4,96s tid=0x00007fc7ac001000 nid=0x6663 runnable [0x0000000000000000] 197 | java.lang.Thread.State: RUNNABLE 198 | 199 | "VM Thread" os_prio=0 cpu=1640,76ms elapsed=6,00s tid=0x00007fc7f41ed800 nid=0x6635 runnable 200 | 201 | "GC Thread#0" os_prio=0 cpu=1091,94ms elapsed=6,01s tid=0x00007fc7f405c000 nid=0x6627 runnable 202 | 203 | "GC Thread#1" os_prio=0 cpu=1138,80ms elapsed=5,75s tid=0x00007fc7c0001000 nid=0x664e runnable 204 | 205 | "GC Thread#2" os_prio=0 cpu=1118,44ms elapsed=5,75s tid=0x00007fc7c0002800 nid=0x664f runnable 206 | 207 | "GC Thread#3" os_prio=0 cpu=1111,30ms elapsed=5,75s tid=0x00007fc7c0003800 nid=0x6650 runnable 208 | 209 | "GC Thread#4" os_prio=0 cpu=1114,90ms elapsed=5,75s tid=0x00007fc7c0005000 nid=0x6651 runnable 210 | 211 | "GC Thread#5" os_prio=0 cpu=1111,05ms elapsed=5,75s tid=0x00007fc7c0006800 nid=0x6652 runnable 212 | 213 | "GC Thread#6" os_prio=0 cpu=1098,08ms elapsed=5,75s tid=0x00007fc7c0007800 nid=0x6653 runnable 214 | 215 | "GC Thread#7" os_prio=0 cpu=1093,97ms elapsed=5,75s tid=0x00007fc7c0009000 nid=0x6654 runnable 216 | 217 | "G1 Main Marker" os_prio=0 cpu=3,42ms elapsed=6,01s tid=0x00007fc7f4066000 nid=0x6628 runnable 218 | 219 | "G1 Conc#0" os_prio=0 cpu=931,30ms elapsed=6,01s tid=0x00007fc7f4067800 nid=0x662b runnable 220 | 221 | "G1 Conc#1" os_prio=0 cpu=929,50ms elapsed=5,27s tid=0x00007fc7cc001000 nid=0x6657 runnable 222 | 223 | "G1 Refine#0" os_prio=0 cpu=7,89ms elapsed=6,00s tid=0x00007fc7f417c000 nid=0x662c runnable 224 | 225 | "G1 Refine#1" os_prio=0 cpu=2,36ms elapsed=3,77s tid=0x00007fc7c4001000 nid=0x667a runnable 226 | 227 | "G1 Refine#2" os_prio=0 cpu=1,45ms elapsed=2,99s tid=0x00007fc734001000 nid=0x667b runnable 228 | 229 | "G1 Refine#3" os_prio=0 cpu=3,72ms elapsed=2,99s tid=0x00007fc778179800 nid=0x667c runnable 230 | 231 | "G1 Young RemSet Sampling" os_prio=0 cpu=0,86ms elapsed=6,00s tid=0x00007fc7f417d800 nid=0x662d runnable 232 | "VM Periodic Task Thread" os_prio=0 cpu=2,94ms elapsed=5,91s tid=0x00007fc7f42ba800 nid=0x6645 waiting on condition 233 | 234 | JNI global refs: 33, weak refs: 3 235 | 236 | " 237 | } 238 | ``` -------------------------------------------------------------------------------- /CERTIFICATES.md: -------------------------------------------------------------------------------- 1 | # CERTIFICATES 2 | 3 | - https://bugs.openjdk.java.net/browse/JDK-8220239 4 | - https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/security/cert/X509Certificate.html 5 | 6 | - `java --enable-preview --source 14 JfrCertificates.java https://github.com/petrbouda` 7 | 8 | ```java 9 | import jdk.jfr.Configuration; 10 | import jdk.jfr.consumer.EventStream; 11 | import jdk.jfr.consumer.RecordingStream; 12 | 13 | import java.io.IOException; 14 | import java.net.URI; 15 | import java.net.http.HttpClient; 16 | import java.net.http.HttpRequest; 17 | import java.net.http.HttpResponse; 18 | import java.nio.file.Files; 19 | import java.nio.file.Path; 20 | import java.text.ParseException; 21 | import java.util.concurrent.ExecutorService; 22 | import java.util.concurrent.Executors; 23 | 24 | public class JfrCertificates { 25 | 26 | private static final String CONFIGURATION = """ 27 | 28 | 29 | true 30 | true 31 | 32 | 33 | true 34 | true 35 | 36 | 37 | true 38 | true 39 | 40 | """; 41 | 42 | public static void main(String[] args) throws IOException, ParseException, InterruptedException { 43 | startJFR(); 44 | 45 | HttpRequest request = HttpRequest.newBuilder(URI.create(args[0])).build(); 46 | int statusCode = HttpClient.newHttpClient() 47 | .send(request, HttpResponse.BodyHandlers.ofString()) 48 | .statusCode(); 49 | 50 | System.out.println("STATUS CODE: " + statusCode); 51 | } 52 | 53 | private static void startJFR() throws IOException, ParseException { 54 | Path configuration = Files.createTempFile(null, ".xml"); 55 | Files.write(configuration, CONFIGURATION.getBytes()); 56 | 57 | Configuration config = Configuration.create(configuration); 58 | config.getSettings().forEach((key, value) -> System.out.println(key + ": " + value)); 59 | 60 | ExecutorService executor = Executors.newSingleThreadExecutor(); 61 | executor.submit(() -> { 62 | try (EventStream es = new RecordingStream(config)) { 63 | es.onEvent("jdk.TLSHandshake", e -> System.out.println(e)); 64 | es.onEvent("jdk.X509Validation", e -> System.out.println(e)); 65 | es.onEvent("jdk.X509Certificate", e -> System.out.println(e)); 66 | es.start(); 67 | } 68 | }); 69 | } 70 | } 71 | ``` 72 | 73 | #### X509_CERTIFICATE 74 | 75 | - a list of load certificates 76 | 77 | ``` 78 | jdk.X509Certificate { 79 | startTime = 16:45:28.491 80 | algorithm = "SHA256withRSA" 81 | serialNumber = "570a119742c4e3cc" 82 | subject = "CN=Actalis Authentication Root CA, O=Actalis S.p.A./03358520967, L=Milan, C=IT" 83 | issuer = "CN=Actalis Authentication Root CA, O=Actalis S.p.A./03358520967, L=Milan, C=IT" 84 | keyType = "RSA" 85 | keyLength = 4096 86 | certificateId = 1729119956 87 | validFrom = 12:22:02.000 88 | validUntil = 12:22:02.000 89 | eventThread = "main" (javaThreadId = 1) 90 | stackTrace = [ 91 | sun.security.provider.X509Factory.commitEvent(X509CertImpl) line: 794 92 | sun.security.provider.X509Factory.engineGenerateCertificate(InputStream) line: 108 93 | java.security.cert.CertificateFactory.generateCertificate(InputStream) line: 355 94 | sun.security.provider.JavaKeyStore.engineLoad(InputStream, char[]) line: 766 95 | sun.security.util.KeyStoreDelegator.engineLoad(InputStream, char[]) line: 241 96 | ... 97 | ] 98 | } 99 | 100 | 101 | jdk.X509Certificate { 102 | startTime = 16:45:28.494 103 | algorithm = "SHA1withRSA" 104 | serialNumber = "1" 105 | subject = "CN=AddTrust Class 1 CA Root, OU=AddTrust TTP Network, O=AddTrust AB, C=SE" 106 | issuer = "CN=AddTrust Class 1 CA Root, OU=AddTrust TTP Network, O=AddTrust AB, C=SE" 107 | keyType = "RSA" 108 | keyLength = 2048 109 | certificateId = 764620144 110 | validFrom = 11:38:31.000 111 | validUntil = 11:38:31.000 112 | eventThread = "main" (javaThreadId = 1) 113 | stackTrace = [ 114 | sun.security.provider.X509Factory.commitEvent(X509CertImpl) line: 794 115 | sun.security.provider.X509Factory.engineGenerateCertificate(InputStream) line: 108 116 | java.security.cert.CertificateFactory.generateCertificate(InputStream) line: 355 117 | sun.security.provider.JavaKeyStore.engineLoad(InputStream, char[]) line: 766 118 | sun.security.util.KeyStoreDelegator.engineLoad(InputStream, char[]) line: 241 119 | ... 120 | ] 121 | } 122 | 123 | ... 124 | ``` 125 | 126 | #### X509_VALIDATION 127 | 128 | - `certificateId` shows ID to the certificate which is being validated 129 | 130 | ``` 131 | jdk.X509Validation { 132 | startTime = 16:49:05.027 133 | certificateId = 7087067 134 | certificatePosition = 1 135 | validationCounter = 1 136 | eventThread = "HttpClient-1-Worker-0" (javaThreadId = 17) 137 | stackTrace = [ 138 | sun.security.provider.certpath.PKIXCertPathValidator.validate(TrustAnchor, PKIX$ValidatorParams) line: 253 139 | sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIX$ValidatorParams) line: 145 140 | sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(CertPath, CertPathParameters) line: 84 141 | java.security.cert.CertPathValidator.validate(CertPath, CertPathParameters) line: 309 142 | sun.security.validator.PKIXValidator.doValidate(X509Certificate[], PKIXBuilderParameters) line: 345 143 | ... 144 | ] 145 | } 146 | 147 | 148 | jdk.X509Validation { 149 | startTime = 16:49:05.027 150 | duration = 0.127 ms 151 | certificateId = 1544128074 152 | certificatePosition = 2 153 | validationCounter = 1 154 | eventThread = "HttpClient-1-Worker-0" (javaThreadId = 17) 155 | stackTrace = [ 156 | sun.security.provider.certpath.PKIXCertPathValidator.validate(TrustAnchor, PKIX$ValidatorParams) line: 258 157 | sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIX$ValidatorParams) line: 145 158 | sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(CertPath, CertPathParameters) line: 84 159 | java.security.cert.CertPathValidator.validate(CertPath, CertPathParameters) line: 309 160 | sun.security.validator.PKIXValidator.doValidate(X509Certificate[], PKIXBuilderParameters) line: 345 161 | ... 162 | ] 163 | } 164 | 165 | 166 | jdk.X509Validation { 167 | startTime = 16:49:05.027 168 | duration = 0.127 ms 169 | certificateId = 1709352777 170 | certificatePosition = 3 171 | validationCounter = 1 172 | eventThread = "HttpClient-1-Worker-0" (javaThreadId = 17) 173 | stackTrace = [ 174 | sun.security.provider.certpath.PKIXCertPathValidator.validate(TrustAnchor, PKIX$ValidatorParams) line: 258 175 | sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIX$ValidatorParams) line: 145 176 | sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(CertPath, CertPathParameters) line: 84 177 | java.security.cert.CertPathValidator.validate(CertPath, CertPathParameters) line: 309 178 | sun.security.validator.PKIXValidator.doValidate(X509Certificate[], PKIXBuilderParameters) line: 345 179 | ... 180 | ] 181 | } 182 | ``` 183 | 184 | #### TLS_HANDSHAKE 185 | 186 | ``` 187 | jdk.TLSHandshake { 188 | startTime = 16:49:05.078 189 | peerHost = "www.google.cz" 190 | peerPort = 443 191 | protocolVersion = "TLSv1.3" 192 | cipherSuite = "TLS_AES_256_GCM_SHA384" 193 | certificateId = 1709352777 194 | eventThread = "HttpClient-1-Worker-0" (javaThreadId = 17) 195 | stackTrace = [ 196 | sun.security.ssl.Finished.recordEvent(SSLSessionImpl) line: 1136 197 | sun.security.ssl.Finished$T13FinishedProducer.onProduceFinished(ClientHandshakeContext, SSLHandshake$HandshakeMessage) line: 753 198 | sun.security.ssl.Finished$T13FinishedProducer.produce(ConnectionContext, SSLHandshake$HandshakeMessage) line: 658 199 | sun.security.ssl.SSLHandshake.produce(ConnectionContext, SSLHandshake$HandshakeMessage) line: 440 200 | sun.security.ssl.Finished$T13FinishedConsumer.onConsumeFinished(ClientHandshakeContext, ByteBuffer) line: 1001 201 | ... 202 | ] 203 | } 204 | ``` 205 | 206 | #### FULL STACKTRACES 207 | 208 | ``` 209 | X509Certificate 210 | --------------- 211 | sun.security.provider.X509Factory.commitEvent(X509CertImpl) line: 794, 212 | sun.security.provider.X509Factory.engineGenerateCertificate(InputStream) line: 108, 213 | java.security.cert.CertificateFactory.generateCertificate(InputStream) line: 355, 214 | sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(ClientHandshakeContext, List) line: 1291, 215 | sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(ClientHandshakeContext, CertificateMessage$T13CertificateMessage) line: 1207, 216 | sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(ConnectionContext, ByteBuffer) line: 1154, 217 | sun.security.ssl.SSLHandshake.consume(ConnectionContext, ByteBuffer) line: 396, 218 | sun.security.ssl.HandshakeContext.dispatch(byte, ByteBuffer) line: 444, 219 | sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run() line: 1260, 220 | sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run() line: 1247, 221 | java.security.AccessController.executePrivileged(PrivilegedExceptionAction, AccessControlContext, Class) line: 784, 222 | java.security.AccessController.doPrivileged(PrivilegedExceptionAction, AccessControlContext) line: 691, 223 | sun.security.ssl.SSLEngineImpl$DelegatedTask.run() line: 1192, 224 | jdk.internal.net.http.common.SSLFlowDelegate$$Lambda$215.1624064509.accept(Object), 225 | java.util.ArrayList.forEach(Consumer) line: 1510, 226 | jdk.internal.net.http.common.SSLFlowDelegate.lambda$executeTasks$3(List) line: 1109, 227 | jdk.internal.net.http.common.SSLFlowDelegate$$Lambda$214.2081681142.run(), 228 | jdk.internal.net.http.HttpClientImpl$DelegatingExecutor.execute(Runnable) line: 155, 229 | jdk.internal.net.http.common.SSLFlowDelegate.executeTasks(List) line: 1104, 230 | jdk.internal.net.http.common.SSLFlowDelegate.doHandshake(SSLFlowDelegate$EngineResult, int) line: 1070, 231 | jdk.internal.net.http.common.SSLFlowDelegate$Reader.processData() line: 474, 232 | jdk.internal.net.http.common.SSLFlowDelegate$Reader$ReaderDownstreamPusher.run() line: 264, 233 | jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run() line: 175, 234 | jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler$DeferredCompleter) line: 147, 235 | jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run() line: 198, 236 | java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1130, 237 | java.util.concurrent.ThreadPoolExecutor$Worker.run() line: 630, 238 | java.lang.Thread.run() line: 832 239 | 240 | X509Validation 241 | -------------- 242 | sun.security.provider.certpath.PKIXCertPathValidator.validate(TrustAnchor, PKIX$ValidatorParams) line: 253, 243 | sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIX$ValidatorParams) line: 145, 244 | sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(CertPath, CertPathParameters) line: 84, 245 | java.security.cert.CertPathValidator.validate(CertPath, CertPathParameters) line: 309, 246 | sun.security.validator.PKIXValidator.doValidate(X509Certificate[], PKIXBuilderParameters) line: 345, 247 | sun.security.validator.PKIXValidator.engineValidate(X509Certificate[], Collection, List, AlgorithmConstraints, Object) line: 259, 248 | sun.security.validator.Validator.validate(X509Certificate[], Collection, List, AlgorithmConstraints, Object) line: 264, 249 | sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509Certificate[], String, SSLEngine, boolean) line: 285, 250 | sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509Certificate[], String, SSLEngine) line: 144, 251 | sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(ClientHandshakeContext, List) line: 1310, 252 | sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(ClientHandshakeContext, CertificateMessage$T13CertificateMessage) line: 1207, sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(ConnectionContext, ByteBuffer) line: 1154, sun.security.ssl.SSLHandshake.consume(ConnectionContext, ByteBuffer) line: 396, sun.security.ssl.HandshakeContext.dispatch(byte, ByteBuffer) line: 444, sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run() line: 1260, 253 | sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run() line: 1247, 254 | java.security.AccessController.executePrivileged(PrivilegedExceptionAction, AccessControlContext, Class) line: 784, 255 | java.security.AccessController.doPrivileged(PrivilegedExceptionAction, AccessControlContext) line: 691, 256 | sun.security.ssl.SSLEngineImpl$DelegatedTask.run() line: 1192, 257 | jdk.internal.net.http.common.SSLFlowDelegate$$Lambda$215.627181723.accept(Object), 258 | java.util.ArrayList.forEach(Consumer) line: 1510, 259 | jdk.internal.net.http.common.SSLFlowDelegate.lambda$executeTasks$3(List) line: 1109, 260 | jdk.internal.net.http.common.SSLFlowDelegate$$Lambda$214.410888346.run(), 261 | jdk.internal.net.http.HttpClientImpl$DelegatingExecutor.execute(Runnable) line: 155, 262 | jdk.internal.net.http.common.SSLFlowDelegate.executeTasks(List) line: 1104, 263 | jdk.internal.net.http.common.SSLFlowDelegate.doHandshake(SSLFlowDelegate$EngineResult, int) line: 1070, 264 | jdk.internal.net.http.common.SSLFlowDelegate$Reader.processData() line: 474, 265 | jdk.internal.net.http.common.SSLFlowDelegate$Reader$ReaderDownstreamPusher.run() line: 264, 266 | jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run() line: 175, 267 | jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler$DeferredCompleter) line: 147, 268 | jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run() line: 198, 269 | java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1130, 270 | java.util.concurrent.ThreadPoolExecutor$Worker.run() line: 630, 271 | java.lang.Thread.run() line: 832 272 | 273 | TLSHandshake 274 | ------------ 275 | sun.security.ssl.Finished.recordEvent(SSLSessionImpl) line: 1136, 276 | sun.security.ssl.Finished$T13FinishedProducer.onProduceFinished(ClientHandshakeContext, SSLHandshake$HandshakeMessage) line: 753, 277 | sun.security.ssl.Finished$T13FinishedProducer.produce(ConnectionContext, SSLHandshake$HandshakeMessage) line: 658, 278 | sun.security.ssl.SSLHandshake.produce(ConnectionContext, SSLHandshake$HandshakeMessage) line: 440, 279 | sun.security.ssl.Finished$T13FinishedConsumer.onConsumeFinished(ClientHandshakeContext, ByteBuffer) line: 1001, 280 | sun.security.ssl.Finished$T13FinishedConsumer.consume(ConnectionContext, ByteBuffer) line: 876, 281 | sun.security.ssl.SSLHandshake.consume(ConnectionContext, ByteBuffer) line: 396, 282 | sun.security.ssl.HandshakeContext.dispatch(byte, ByteBuffer) line: 444, 283 | sun.security.ssl.HandshakeContext.dispatch(byte, Plaintext) line: 419, 284 | sun.security.ssl.TransportContext.dispatch(Plaintext) line: 181, 285 | sun.security.ssl.SSLTransport.decode(TransportContext, ByteBuffer[], int, int, ByteBuffer[], int, int) line: 167, 286 | sun.security.ssl.SSLEngineImpl.decode(ByteBuffer[], int, int, ByteBuffer[], int, int) line: 729, 287 | sun.security.ssl.SSLEngineImpl.readRecord(ByteBuffer[], int, int, ByteBuffer[], int, int) line: 684, 288 | sun.security.ssl.SSLEngineImpl.unwrap(ByteBuffer[], int, int, ByteBuffer[], int, int) line: 499, 289 | sun.security.ssl.SSLEngineImpl.unwrap(ByteBuffer, ByteBuffer[], int, int) line: 475, 290 | javax.net.ssl.SSLEngine.unwrap(ByteBuffer, ByteBuffer) line: 634, 291 | jdk.internal.net.http.common.SSLFlowDelegate$Reader.unwrapBuffer(ByteBuffer) line: 517, 292 | jdk.internal.net.http.common.SSLFlowDelegate$Reader.processData() line: 423, 293 | jdk.internal.net.http.common.SSLFlowDelegate$Reader$ReaderDownstreamPusher.run() line: 264, 294 | jdk.internal.net.http.common.SequentialScheduler$SynchronizedRestartableTask.run() line: 175, 295 | jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler$DeferredCompleter) line: 147, 296 | jdk.internal.net.http.common.SequentialScheduler$TryEndDeferredCompleter.complete() line: 315, 297 | jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler$DeferredCompleter) line: 149, 298 | jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run() line: 198, 299 | java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1130, 300 | java.util.concurrent.ThreadPoolExecutor$Worker.run() line: 630, 301 | java.lang.Thread.run() line: 832 302 | ``` -------------------------------------------------------------------------------- /custom-profile.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | true 6 | 1000 ms 7 | 8 | 9 | 10 | 11 | true 12 | 1000 ms 13 | 14 | 15 | 16 | true 17 | everyChunk 18 | 19 | 20 | 21 | true 22 | 1000 ms 23 | 24 | 25 | 26 | true 27 | 10 s 28 | 29 | 30 | 31 | true 32 | 10 s 33 | 34 | 35 | 36 | true 37 | 10 s 38 | 39 | 40 | 41 | true 42 | 10 s 43 | 44 | 45 | 46 | true 47 | 10 s 48 | 49 | 50 | 51 | true 52 | 53 | 54 | 55 | true 56 | 57 | 58 | 59 | true 60 | true 61 | 10 ms 62 | 63 | 64 | 65 | true 66 | true 67 | 10 ms 68 | 69 | 70 | 71 | true 72 | true 73 | 10 ms 74 | 75 | 76 | 77 | true 78 | true 79 | 10 ms 80 | 81 | 82 | 83 | true 84 | true 85 | 1 ms 86 | 87 | 88 | 89 | true 90 | true 91 | 0 ms 92 | 93 | 94 | 95 | true 96 | true 97 | 0 ms 98 | 99 | 100 | 101 | true 102 | true 103 | 0 ms 104 | 105 | 106 | 107 | true 108 | true 109 | 110 | 111 | 112 | true 113 | true 114 | 0 ms 115 | 116 | 117 | 118 | true 119 | true 120 | 121 | 122 | 123 | true 124 | 125 | 126 | 127 | true 128 | beginChunk 129 | 130 | 131 | 132 | true 133 | beginChunk 134 | 135 | 136 | 137 | true 138 | 1 ms 139 | 140 | 141 | 142 | true 143 | 20 ms 144 | 145 | 146 | 147 | true 148 | 0 ms 149 | 150 | 151 | 152 | true 153 | 0 ms 154 | 155 | 156 | 157 | true 158 | 0 ms 159 | 160 | 161 | 162 | true 163 | 0 ms 164 | 165 | 166 | 167 | true 168 | 0 ms 169 | 170 | 171 | 172 | true 173 | 0 ms 174 | 175 | 176 | 177 | true 178 | true 179 | 180 | 181 | 182 | true 183 | 5 s 184 | 185 | 186 | 187 | true 188 | beginChunk 189 | 190 | 191 | 192 | true 193 | beginChunk 194 | 195 | 196 | 197 | true 198 | beginChunk 199 | 200 | 201 | 202 | true 203 | beginChunk 204 | 205 | 206 | 207 | true 208 | beginChunk 209 | 210 | 211 | 212 | true 213 | beginChunk 214 | 215 | 216 | 217 | true 218 | beginChunk 219 | 220 | 221 | 222 | true 223 | 224 | 225 | 226 | true 227 | 228 | 229 | 230 | true 231 | 232 | 233 | 234 | true 235 | 236 | 237 | 238 | true 239 | 240 | 241 | 242 | true 243 | 244 | 245 | 246 | true 247 | 248 | 249 | 250 | true 251 | everyChunk 252 | 253 | 254 | 255 | true 256 | everyChunk 257 | 258 | 259 | 260 | true 261 | beginChunk 262 | 263 | 264 | 265 | true 266 | beginChunk 267 | 268 | 269 | 270 | true 271 | beginChunk 272 | 273 | 274 | 275 | true 276 | beginChunk 277 | 278 | 279 | 280 | true 281 | 282 | 283 | 284 | true 285 | 286 | 287 | 288 | true 289 | 290 | 291 | 292 | true 293 | 294 | 295 | 296 | true 297 | 298 | 299 | 300 | true 301 | 302 | 303 | 304 | true 305 | true 306 | 307 | 308 | 309 | true 310 | true 311 | 312 | 313 | 314 | true 315 | 316 | 317 | 318 | true 319 | 0 ms 320 | 321 | 322 | 323 | true 324 | 0 ms 325 | 326 | 327 | 328 | true 329 | 0 ms 330 | 331 | 332 | 333 | true 334 | 0 ms 335 | 336 | 337 | 338 | true 339 | 0 ms 340 | 341 | 342 | 343 | true 344 | 0 ms 345 | 346 | 347 | 348 | true 349 | 0 ms 350 | 351 | 352 | 353 | true 354 | 0 ms 355 | 356 | 357 | 358 | true 359 | 0 ms 360 | 361 | 362 | 363 | true 364 | 0 ms 365 | 366 | 367 | 368 | true 369 | 0 ms 370 | 371 | 372 | 373 | true 374 | 375 | 376 | 377 | true 378 | 379 | 380 | 381 | true 382 | 383 | 384 | 385 | true 386 | 387 | 388 | 389 | true 390 | 391 | 392 | 393 | true 394 | 395 | 396 | 397 | true 398 | 399 | 400 | 401 | true 402 | 0 ms 403 | 404 | 405 | 406 | true 407 | 408 | 409 | 410 | true 411 | 412 | 413 | 414 | true 415 | 416 | 417 | 418 | true 419 | 420 | 421 | 422 | true 423 | 424 | 425 | 426 | true 427 | true 428 | 429 | 430 | 431 | true 432 | 433 | 434 | 435 | true 436 | everyChunk 437 | 438 | 439 | 440 | true 441 | 442 | 443 | 444 | true 445 | everyChunk 446 | 447 | 448 | 449 | true 450 | 451 | 452 | 453 | true 454 | true 455 | 0 ns 456 | 457 | 458 | 459 | true 460 | beginChunk 461 | 462 | 463 | 464 | true 465 | 1000 ms 466 | 467 | 468 | 469 | true 470 | 100 ms 471 | 472 | 473 | 474 | true 475 | 0 s 476 | 477 | 478 | 479 | true 480 | 481 | 482 | 483 | true 484 | 485 | 486 | 487 | true 488 | beginChunk 489 | 490 | 491 | 492 | true 493 | everyChunk 494 | 495 | 496 | 497 | true 498 | 100 ms 499 | 500 | 501 | 502 | true 503 | beginChunk 504 | 505 | 506 | 507 | true 508 | everyChunk 509 | 510 | 511 | 512 | true 513 | 514 | 515 | 516 | true 517 | beginChunk 518 | 519 | 520 | 521 | true 522 | beginChunk 523 | 524 | 525 | 526 | true 527 | beginChunk 528 | 529 | 530 | 531 | true 532 | 10 s 533 | 534 | 535 | 536 | true 537 | 1000 ms 538 | 539 | 540 | 541 | true 542 | 10 s 543 | 544 | 545 | 546 | true 547 | beginChunk 548 | 549 | 550 | 551 | true 552 | endChunk 553 | 554 | 555 | 556 | true 557 | 5 s 558 | 559 | 560 | 561 | true 562 | beginChunk 563 | 564 | 565 | 566 | true 567 | everyChunk 568 | 569 | 570 | 571 | true 572 | true 573 | 574 | 575 | 576 | true 577 | true 578 | 579 | 580 | 581 | true 582 | everyChunk 583 | 584 | 585 | 586 | true 587 | endChunk 588 | 589 | 590 | 591 | true 592 | endChunk 593 | 594 | 595 | 596 | true 597 | true 598 | 0 s 599 | 600 | 601 | 602 | true 603 | true 604 | 0 s 605 | 606 | 607 | 608 | true 609 | true 610 | 0 s 611 | 612 | 613 | 614 | true 615 | true 616 | 10 ms 617 | 618 | 619 | 620 | true 621 | true 622 | 10 ms 623 | 624 | 625 | 626 | true 627 | true 628 | 629 | 630 | 631 | true 632 | true 633 | 634 | 635 | 636 | true 637 | true 638 | 639 | 640 | 641 | true 642 | true 643 | 644 | 645 | 646 | true 647 | true 648 | 649 | 650 | 651 | true 652 | true 653 | 654 | 655 | 656 | true 657 | 1000 ms 658 | 659 | 660 | 661 | true 662 | 663 | 664 | 665 | true 666 | 667 | 668 | 669 | true 670 | 0 ns 671 | 672 | 673 | 674 | true 675 | 0 ns 676 | 677 | 678 | 679 | true 680 | 0 ns 681 | 682 | 683 | 684 | true 685 | 0 ns 686 | 687 | 688 | 689 | true 690 | 0 ns 691 | 692 | 693 | 694 | true 695 | 0 ns 696 | 697 | 698 | 699 | true 700 | 701 | 702 | 703 | true 704 | 705 | 706 | 707 | true 708 | 10 ms 709 | 710 | 711 | 712 | true 713 | 0 ms 714 | 715 | 716 | 717 | 0 ms 718 | true 719 | 720 | 721 | 722 | true 723 | 0 ms 724 | 725 | 726 | 727 | true 728 | true 729 | 730 | 731 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 10 ms 908 | 909 | 10 ms 910 | 911 | 10 ms 912 | 913 | false 914 | 915 | 916 | 917 | 918 | --------------------------------------------------------------------------------