Merge remote-tracking branch 'origin/master'

This commit is contained in:
Roman Shevchenko
2015-01-14 19:49:16 +01:00
2 changed files with 78 additions and 0 deletions
@@ -35,6 +35,7 @@ import com.intellij.testFramework.LeakHunter;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.PsiTestCase;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.util.MemoryDumpHelper;
import com.intellij.util.Processor;
import com.intellij.util.WaitFor;
import com.intellij.util.io.ReadOnlyAttributeUtil;
@@ -199,6 +200,7 @@ public class PsiEventsTest extends PsiTestCase {
LeakHunter.checkLeak(ApplicationManager.getApplication(), PsiDirectory.class, isReallyLeak);
LeakHunter.checkLeak(IdeEventQueue.getInstance(), PsiDirectory.class, isReallyLeak);
LeakHunter.checkLeak(LaterInvocator.getLaterInvocatorQueue(), PsiDirectory.class, isReallyLeak);
MemoryDumpHelper.captureMemoryDump("testRenameFileWithoutDir.hprof");
assertNull(((FileManagerImpl)fileManager).getCachedDirectory(myPrjDir1));
fail("directory just died");
}
@@ -0,0 +1,76 @@
package com.intellij.util;
import com.intellij.openapi.diagnostic.Logger;
import org.jetbrains.annotations.NotNull;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.util.Iterator;
import java.util.Set;
/**
* @author Pavel.Sher
*/
public class MemoryDumpHelper {
private static final String HOT_SPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic";
private static final Object ourMXBean;
private static final Method ourDumpHeap;
static {
Object mxBean;
Method dumpHeap;
try {
final Class hotSpotMxBeanClass = Class.forName("com.sun.management.HotSpotDiagnosticMXBean");
mxBean = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
public Object run() throws Exception {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> s = server.queryNames(new ObjectName(HOT_SPOT_BEAN_NAME), null);
Iterator<ObjectName> itr = s.iterator();
if (itr.hasNext()) {
ObjectName name = itr.next();
return ManagementFactory.newPlatformMXBeanProxy(server, name.toString(), hotSpotMxBeanClass);
}
else {
return null;
}
}
});
dumpHeap = mxBean.getClass().getMethod("dumpHeap", String.class, boolean.class);
}
catch (Throwable t) {
Logger.getInstance("#com.intellij.util.MemoryDumpHelper").info(t.getMessage());
mxBean = null;
dumpHeap = null;
}
ourMXBean = mxBean;
ourDumpHeap = dumpHeap;
}
public static boolean memoryDumpAvailable() {
try {
return ourMXBean != null;
}
catch (UnsupportedOperationException e) {
return false;
}
}
public static synchronized void captureMemoryDump(@NotNull String dumpPath) throws Exception {
ourDumpHeap.invoke(ourMXBean, dumpPath, true);
}
/** @deprecated use {@link #captureMemoryDump(String)} (to be removed in IDEA 15) */
@SuppressWarnings({"UnusedDeclaration", "SpellCheckingInspection"})
public static Object getHotspotMBean() {
return ourMXBean;
}
}