1 package jdk.jfr.event.runtime; 2 3 import java.nio.ByteBuffer; 4 import java.util.List; 5 6 import jdk.internal.misc.VM; 7 8 import jdk.jfr.Recording; 9 import jdk.jfr.consumer.RecordedEvent; 10 import jdk.test.lib.Asserts; 11 import jdk.test.lib.jfr.EventNames; 12 import jdk.test.lib.jfr.Events; 13 14 /** 15 * @test 16 * @key jfr 17 * @requires vm.hasJFR 18 * @library /test/lib 19 * @modules java.base/jdk.internal.misc 20 * @run main/othervm -XX:MaxDirectMemorySize=128m jdk.jfr.event.runtime.TestDirectMemoryStatisticsEvent 21 */ 22 public class TestDirectMemoryStatisticsEvent { 23 24 private static final String EVENT_PATH = EventNames.DirectMemoryStatistics; 25 26 public static void main(String[] args) throws Throwable { 27 Recording recording = new Recording(); 28 recording.enable(EVENT_PATH); 29 recording.start(); 30 int rounds = 16; 31 int size = 1 * 1024 * 1024; // 1M 32 for (int i = 0; i < rounds; i++) { 33 ByteBuffer.allocateDirect(size); 34 } 35 recording.stop(); 36 37 List<RecordedEvent> events = Events.fromRecording(recording); 38 Events.hasEvents(events); 39 40 long count = 0; 41 long totalCapacity = 0; 42 long memoryUsed = 0; 43 44 for (RecordedEvent event : events) { 45 System.out.println(event); 46 Asserts.assertTrue(Events.isEventType(event, EVENT_PATH), "Wrong event type"); 47 count = Math.max(count, Events.assertField(event, "count").getValue()); 48 totalCapacity = Math.max(count, Events.assertField(event, "totalCapacity").getValue()); 49 memoryUsed = Math.max(count, Events.assertField(event, "memoryUsed").getValue()); 50 Asserts.assertEquals(VM.maxDirectMemory(), Events.assertField(event, "limit").getValue()); 51 } 52 53 Asserts.assertGreaterThanOrEqual(count, (long)rounds, "Too few count in statistics event"); 54 Asserts.assertGreaterThanOrEqual(totalCapacity, (long)(rounds * size), "Too few totalCapacity in statistics event"); 55 Asserts.assertGreaterThanOrEqual(memoryUsed, totalCapacity, "Too few memoryUsed in statistics event"); 56 } 57 }