Hi All,
I am running a Java Tango DS. And analyzing Java application performance using tools like VisualVM, htop & Eclipse MAT.
Pain Point: Java Tango DS consumes approx. 1 GB of RAM while running
Some Artifacts:
Below is a finding for a particular thread named “Polling 1” that I am unable understand.
Source: Thread Dump
"Polling 1" #125 prio=5 os_prio=0 tid=0x00007fec0042b000 nid=0x8da runnable [0x00007feb7196b000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
- locked <0x00000000872df570> (a java.io.BufferedOutputStream)
at org.jacorb.orb.etf.StreamConnectionBase.flush(StreamConnectionBase.java:223)
at org.jacorb.orb.giop.GIOPConnection.sendMessage(GIOPConnection.java:1088)
at org.jacorb.orb.giop.GIOPConnection.sendRequest(GIOPConnection.java:1014)
at org.jacorb.orb.giop.ClientConnection.sendRequest(ClientConnection.java:309)
at org.jacorb.orb.giop.ClientConnection.sendRequest(ClientConnection.java:290)
at org.jacorb.orb.Delegate._invoke_internal(Delegate.java:1371)
at org.jacorb.orb.Delegate.invoke_internal(Delegate.java:1209)
at org.jacorb.orb.Delegate.invoke(Delegate.java:1197)
at org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:475)
at fr.esrf.Tango._Device_5Stub.read_attributes_5(_Device_5Stub.java:1490)
at fr.esrf.TangoApi.DeviceProxyDAODefaultImpl.read_attribute(DeviceProxyDAODefaultImpl.java:1392)
at fr.esrf.TangoApi.DeviceProxyDAODefaultImpl.read_attribute(DeviceProxyDAODefaultImpl.java:1323)
at fr.esrf.TangoApi.DeviceProxy.read_attribute(DeviceProxy.java:794)
at org.tcs.ncra.gmrt.tango.org.tango.lmcds.LMCDS.getElDifference(Unknown Source)
at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.tango.server.attribute.ReflectAttributeBehavior.getValue(ReflectAttributeBehavior.java:85)
at org.tango.server.attribute.AttributeImpl.updateValue(AttributeImpl.java:184)
at org.tango.server.cache.AttributeCacheEntryFactory.createEntry(AttributeCacheEntryFactory.java:90)
- locked <0x0000000084933168> (a org.tango.server.attribute.AttributeImpl)
- locked <0x0000000084893ee0> (a java.lang.Object)
at net.sf.ehcache.constructs.blocking.SelfPopulatingCache.refreshElement(SelfPopulatingCache.java:272)
at net.sf.ehcache.constructs.blocking.SelfPopulatingCache.refresh(SelfPopulatingCache.java:159)
at net.sf.ehcache.constructs.blocking.SelfPopulatingCache.refresh(SelfPopulatingCache.java:112)
at org.tango.server.cache.CacheRefresher.run(CacheRefresher.java:57)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- <0x0000000085a1d360> (a java.util.concurrent.ThreadPoolExecutor$Worker)
- <0x00000000872df5a8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
Source: VisualVM CPU Sampler
Image: Thread Polling 1_CPU Sampler using VisualVM
Source: VisualVM Memory Sampler
Image: Thread Polling 1_Memory Sampler using VisualVM
Source: VisualVM Thread Status
The thread is in “park” state (brown color) most of the time.
Image: Thread Polling 1_Status using VisualVM
Source: Output of htop command
Image: htop Output
Need to understand the impact of this thread, Polling 1, on the memory consumption of the application.
Note: Polling 1 has maximum allocated bytes/sec when the application is running.