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 <hotspot...@kavoori.io> 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@openjdk.java.net > https://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use >
_______________________________________________ hotspot-gc-use mailing list hotspot-gc-use@openjdk.java.net https://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use