From hotspot-gc at kavoori.io Tue Aug 24 21:51:59 2021 From: hotspot-gc at kavoori.io (Rabi) Date: Tue, 24 Aug 2021 21:51:59 -0000 Subject: Young G1 GC Notification Message-ID: <162984191980.9.9437390071447556864.12202172@kavoori.io> Hello, I am new to this mailing list and I am reaching out here as it seemed like a good place to ask this question. If this is the wrong place for this question, I apologize. I would like to get a notification for G1 Young GC pause events and report the time to an external monitoring service. (See the code below where I attempted to listen on a notification) However, what I have noticed is that I never get a 'Notification' even though I am seeing GC logs report the G1 Young GC pauses. Also, I can see the same information in the JFR recording. My application rarely does a full GC, so I am mostly interested in Young G1 GC events and I would like to overlay this information on top of other application metrics. Here is what I have attempted : public class GCEventMonitor implements NotificationListener { public GCEventMonitor(MetricsRecorder metricsRecorder) { this.metricsRecorder = metricsRecorder; //external Service, where I can send information registerGCBeans(); } private void registerGCBeans() { for (GarbageCollectorMXBean gcbean : ManagementFactory.getGarbageCollectorMXBeans()) { // I have noticed two beans get registered here G1 Young and G1 Old through a debugger if (gcbean instanceof NotificationEmitter) { NotificationEmitter emitter = (NotificationEmitter) gcbean; emitter.addNotificationListener(this, null, null); } } } @Override public void handleNotification(Notification notification, Object handback) { *//never gets called* if (notification.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) { CompositeData cd = (CompositeData) notification.getUserData(); GarbageCollectionNotificationInfo info = GarbageCollectionNotificationInfo.from(cd); processGCEvent(info, handback); // Extract info.getGcInfo() here and send gcInfo.getDuration() to external service } } } I have set a debug point on handleNotification method, but this method never gets called, even while I can actively see gc logs print the following information. Why am I not getting a notification? Is my configuration/registration/setup incorrect? There is a comment on this stackoverflow question/answer that the VM does not notify when Young GC happens. Is that true? If so, how does JFR record that information? Thanks for your help in advance! -------------- next part -------------- An HTML attachment was scrubbed... URL: From tequilaron at gmail.com Tue Aug 24 22:28:35 2021 From: tequilaron at gmail.com (Ron Reynolds) Date: Tue, 24 Aug 2021 15:28:35 -0700 Subject: Young G1 GC Notification In-Reply-To: <162984191980.9.9437390071447556864.12202172@kavoori.io> References: <162984191980.9.9437390071447556864.12202172@kavoori.io> Message-ID: i use this exact mechanism and it works well. the only difference between my code and yours (that i can see, for the most part) is the call to emitter.addNotificationListener(receiver, filter, bean); in my case filter is also null but the hand-back is the bean itself (so it could be written as emitter.addNotificationListener(receiver, filter, emitter);) and thus my handler is written: private static void onGcEvent(Notification ignore, NotificationEmitter bean) { final GarbageCollectorMXBean gcBean = (GarbageCollectorMXBean) bean; final String beanName = gcBean.getName().replaceAll(" ", "_"); final GcInfo lastGcInfo = gcBean.getLastGcInfo(); ... note, technically i use lambdas and there's other framework code but this should be the important parts. On Tue, Aug 24, 2021 at 2:52 PM Rabi wrote: > Hello, > > I am new to this mailing list and I am reaching out here as it seemed like > a good place to ask this question. If this is the wrong place for this > question, I apologize. > > I would like to get a notification for G1 Young GC pause events and report > the time to an external monitoring service. (See the code below where I > attempted to listen on a notification) > > However, what I have noticed is that I never get a 'Notification' even > though I am seeing GC logs report the G1 Young GC pauses. Also, I can see > the same information in the JFR recording. > My application rarely does a full GC, so I am mostly interested in Young > G1 GC events and I would like to overlay this information on top of other > application metrics. > > Here is what I have attempted : > > public class GCEventMonitor implements NotificationListener { > > public GCEventMonitor(MetricsRecorder metricsRecorder) { > this.metricsRecorder = metricsRecorder; //external Service, where > I can send information > registerGCBeans(); > } > > private void registerGCBeans() { > for (GarbageCollectorMXBean gcbean : > ManagementFactory.getGarbageCollectorMXBeans()) { // I have noticed two > beans get registered here G1 Young and G1 Old through a debugger > if (gcbean instanceof NotificationEmitter) { > NotificationEmitter emitter = (NotificationEmitter) gcbean; > emitter.addNotificationListener(this, null, null); > } > } > } > > @Override > public void handleNotification(Notification notification, Object > handback) { *//never gets called* > if > (notification.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) > { > CompositeData cd = (CompositeData) > notification.getUserData(); > GarbageCollectionNotificationInfo info = > GarbageCollectionNotificationInfo.from(cd); > processGCEvent(info, handback); // Extract > info.getGcInfo() here and send gcInfo.getDuration() to external service > } > } > } > > I have set a debug point on handleNotification method, but this method > never gets called, even while I can actively see gc logs print the > following information. Why am I not getting a notification? Is my > configuration/registration/setup incorrect? > There is a comment on this stackoverflow question/answer that the VM does > not notify when Young GC happens. Is that true? If so, how does JFR record > that information? > > Thanks for your help in advance! > _______________________________________________ > hotspot-gc-use mailing list > hotspot-gc-use at openjdk.java.net > https://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use > -------------- next part -------------- An HTML attachment was scrubbed... URL: