Skip to content

Commit

Permalink
add jmap
Browse files Browse the repository at this point in the history
  • Loading branch information
黄志磊 committed Jan 26, 2016
1 parent a70e40e commit 32707d6
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 7 deletions.
Expand Up @@ -15,9 +15,11 @@ public class MonitorDataCollector {


private static final Logger log = LoggerFactory.getLogger(MonitorDataCollector.class); private static final Logger log = LoggerFactory.getLogger(MonitorDataCollector.class);


private static volatile boolean dump = false; private static volatile boolean dumpJstack = false;


private static String path = "/opt/logs/bops/"; private static volatile boolean dumpJmap = false;

private static String currentPath = "/opt/logs/";


public static MonitorData collect(){ public static MonitorData collect(){
MonitorData data = new MonitorData(); MonitorData data = new MonitorData();
Expand All @@ -28,6 +30,10 @@ public static MonitorData collect(){
return data; return data;
} }


public void setPath(String path) {
currentPath = path;
}

public static void start(){ public static void start(){
new Thread(new Runnable() { new Thread(new Runnable() {


Expand All @@ -38,14 +44,21 @@ public void run() {
log.error("monitor data:"+Jsons.toJson(monitorData)); log.error("monitor data:"+Jsons.toJson(monitorData));


double load = JVMInfo.instance.load(); double load = JVMInfo.instance.load();
if(load>2){ if(load>4){
if(!dump){ if(!dumpJstack){
dump = true; dumpJstack = true;
JVMUtil.dumpJstack(path); JVMUtil.dumpJstack(currentPath);
} }


} }


if(load>4){
if(!dumpJmap){
dumpJmap = true;
JVMUtil.dumpJmap(currentPath);
}
}

try {//10s try {//10s
Thread.sleep(10000L); Thread.sleep(10000L);
} catch (InterruptedException e) { } catch (InterruptedException e) {
Expand All @@ -56,4 +69,8 @@ public void run() {
}).start(); }).start();
} }


public static void main(String[] args) {
MonitorDataCollector.start();
}

} }
79 changes: 78 additions & 1 deletion mpush-tools/src/main/java/com/shinemo/mpush/tools/JVMUtil.java
Expand Up @@ -5,17 +5,31 @@
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.lang.management.ManagementFactory;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;


import javax.management.MBeanServer;
import javax.management.ObjectName;

import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;


import com.sun.management.HotSpotDiagnosticMXBean;

public class JVMUtil { public class JVMUtil {


private static final Logger log = LoggerFactory.getLogger(JVMUtil.class); private static final Logger log = LoggerFactory.getLogger(JVMUtil.class);


private static final String HOTSPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic";
private static volatile HotSpotDiagnosticMXBean hotspotMBean;

private static Object lock = new Object();

public static void jstack(OutputStream stream) throws Exception { public static void jstack(OutputStream stream) throws Exception {
try { try {
Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces(); Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();
Expand Down Expand Up @@ -45,7 +59,7 @@ public void run() {
String logPath = jvmPath; String logPath = jvmPath;
FileOutputStream jstackStream = null; FileOutputStream jstackStream = null;
try { try {
jstackStream = new FileOutputStream(new File(logPath, "jstack.log")); jstackStream = new FileOutputStream(new File(logPath, System.currentTimeMillis()+"-jstack.log"));
JVMUtil.jstack(jstackStream); JVMUtil.jstack(jstackStream);
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
log.error("", "Dump JVM cache Error!", e); log.error("", "Dump JVM cache Error!", e);
Expand All @@ -62,5 +76,68 @@ public void run() {
} }
}); });
} }

private static HotSpotDiagnosticMXBean getHotspotMBean() {
try {
return AccessController.doPrivileged(new PrivilegedExceptionAction<HotSpotDiagnosticMXBean>() {
public HotSpotDiagnosticMXBean run() throws Exception {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> s = server.queryNames(new ObjectName(HOTSPOT_BEAN_NAME), null);
Iterator<ObjectName> itr = s.iterator();
if (itr.hasNext()) {
ObjectName name = itr.next();
HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(server,
name.toString(), HotSpotDiagnosticMXBean.class);
return bean;
} else {
return null;
}
}
});
} catch (Exception e) {
log.error("", "getHotspotMBean Error!", e);
return null;
}
}

private static void initHotspotMBean() throws Exception {
if (hotspotMBean == null) {
synchronized (lock) {
if (hotspotMBean == null) {
hotspotMBean = getHotspotMBean();
}
}
}
}

public static void jMap(String fileName, boolean live) {
try {
initHotspotMBean();



File f = new File(fileName, System.currentTimeMillis()+"-jmap.log");
String currentFileName = f.getPath();
if (f.exists()) {
f.delete();
}


hotspotMBean.dumpHeap(currentFileName, live);
} catch (Exception e) {
log.error("", "dumpHeap Error!", e);
}
}

public static void dumpJmap(final String jvmPath){

Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
jMap(jvmPath, false);
}
});

}


} }

0 comments on commit 32707d6

Please sign in to comment.