|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.tools.jconsole; |
|
|
|
import javax.management.ObjectName; |
|
import java.lang.management.MemoryPoolMXBean; |
|
import java.lang.management.MemoryUsage; |
|
import com.sun.management.GarbageCollectorMXBean; |
|
import com.sun.management.GcInfo; |
|
import java.util.HashMap; |
|
import java.util.Set; |
|
import java.util.Map; |
|
|
|
import static java.lang.management.ManagementFactory.*; |
|
|
|
public class MemoryPoolProxy { |
|
private String poolName; |
|
private ProxyClient client; |
|
private MemoryPoolMXBean pool; |
|
private Map<ObjectName,Long> gcMBeans; |
|
private GcInfo lastGcInfo; |
|
|
|
public MemoryPoolProxy(ProxyClient client, ObjectName poolName) throws java.io.IOException { |
|
this.client = client; |
|
this.pool = client.getMXBean(poolName, MemoryPoolMXBean.class); |
|
this.poolName = this.pool.getName(); |
|
this.gcMBeans = new HashMap<ObjectName,Long>(); |
|
this.lastGcInfo = null; |
|
|
|
String[] mgrNames = pool.getMemoryManagerNames(); |
|
for (String name : mgrNames) { |
|
try { |
|
ObjectName mbeanName = new ObjectName(GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + |
|
",name=" + name); |
|
if (client.isRegistered(mbeanName)) { |
|
gcMBeans.put(mbeanName, new Long(0)); |
|
} |
|
} catch (Exception e) { |
|
assert false; |
|
} |
|
|
|
} |
|
} |
|
|
|
public boolean isCollectedMemoryPool() { |
|
return (gcMBeans.size() != 0); |
|
} |
|
|
|
public MemoryPoolStat getStat() throws java.io.IOException { |
|
long usageThreshold = (pool.isUsageThresholdSupported() |
|
? pool.getUsageThreshold() |
|
: -1); |
|
long collectThreshold = (pool.isCollectionUsageThresholdSupported() |
|
? pool.getCollectionUsageThreshold() |
|
: -1); |
|
long lastGcStartTime = 0; |
|
long lastGcEndTime = 0; |
|
MemoryUsage beforeGcUsage = null; |
|
MemoryUsage afterGcUsage = null; |
|
long gcId = 0; |
|
if (lastGcInfo != null) { |
|
gcId = lastGcInfo.getId(); |
|
lastGcStartTime = lastGcInfo.getStartTime(); |
|
lastGcEndTime = lastGcInfo.getEndTime(); |
|
beforeGcUsage = lastGcInfo.getMemoryUsageBeforeGc().get(poolName); |
|
afterGcUsage = lastGcInfo.getMemoryUsageAfterGc().get(poolName); |
|
} |
|
|
|
Set<Map.Entry<ObjectName,Long>> set = gcMBeans.entrySet(); |
|
for (Map.Entry<ObjectName,Long> e : set) { |
|
GarbageCollectorMXBean gc = |
|
client.getMXBean(e.getKey(), |
|
com.sun.management.GarbageCollectorMXBean.class); |
|
Long gcCount = e.getValue(); |
|
Long newCount = gc.getCollectionCount(); |
|
if (newCount > gcCount) { |
|
gcMBeans.put(e.getKey(), new Long(newCount)); |
|
lastGcInfo = gc.getLastGcInfo(); |
|
if (lastGcInfo.getEndTime() > lastGcEndTime) { |
|
gcId = lastGcInfo.getId(); |
|
lastGcStartTime = lastGcInfo.getStartTime(); |
|
lastGcEndTime = lastGcInfo.getEndTime(); |
|
beforeGcUsage = lastGcInfo.getMemoryUsageBeforeGc().get(poolName); |
|
afterGcUsage = lastGcInfo.getMemoryUsageAfterGc().get(poolName); |
|
assert(beforeGcUsage != null); |
|
assert(afterGcUsage != null); |
|
} |
|
} |
|
} |
|
|
|
MemoryUsage usage = pool.getUsage(); |
|
return new MemoryPoolStat(poolName, |
|
usageThreshold, |
|
usage, |
|
gcId, |
|
lastGcStartTime, |
|
lastGcEndTime, |
|
collectThreshold, |
|
beforeGcUsage, |
|
afterGcUsage); |
|
} |
|
} |