فهرست منبع

Ignore internal errors if JVM can't find the memory pool

Simon Willnauer 11 سال پیش
والد
کامیت
b5a6a5a6ed
1فایلهای تغییر یافته به همراه21 افزوده شده و 13 حذف شده
  1. 21 13
      src/main/java/org/elasticsearch/monitor/jvm/JvmStats.java

+ 21 - 13
src/main/java/org/elasticsearch/monitor/jvm/JvmStats.java

@@ -146,19 +146,27 @@ public class JvmStats implements Streamable, Serializable, ToXContent {
         List<MemoryPoolMXBean> memoryPoolMXBeans = ManagementFactory.getMemoryPoolMXBeans();
         List<MemoryPool> pools = new ArrayList<MemoryPool>();
         for (int i = 0; i < memoryPoolMXBeans.size(); i++) {
-            MemoryPoolMXBean memoryPoolMXBean = memoryPoolMXBeans.get(i);
-            MemoryUsage usage = memoryPoolMXBean.getUsage();
-            MemoryUsage peakUsage = memoryPoolMXBean.getPeakUsage();
-            String name = GcNames.getByMemoryPoolName(memoryPoolMXBean.getName(), null);
-            if (name == null) { // if we can't resolve it, its not interesting.... (Per Gen, Code Cache)
-                continue;
-            }
-            pools.add(new MemoryPool(name,
-                    usage.getUsed() < 0 ? 0 : usage.getUsed(),
-                    usage.getMax() < 0 ? 0 : usage.getMax(),
-                    peakUsage.getUsed() < 0 ? 0 : peakUsage.getUsed(),
-                    peakUsage.getMax() < 0 ? 0 : peakUsage.getMax()
-            ));
+            try {
+                MemoryPoolMXBean memoryPoolMXBean = memoryPoolMXBeans.get(i);
+                MemoryUsage usage = memoryPoolMXBean.getUsage();
+                MemoryUsage peakUsage = memoryPoolMXBean.getPeakUsage();
+                String name = GcNames.getByMemoryPoolName(memoryPoolMXBean.getName(), null);
+                if (name == null) { // if we can't resolve it, its not interesting.... (Per Gen, Code Cache)
+                    continue;
+                }
+                pools.add(new MemoryPool(name,
+                        usage.getUsed() < 0 ? 0 : usage.getUsed(),
+                        usage.getMax() < 0 ? 0 : usage.getMax(),
+                        peakUsage.getUsed() < 0 ? 0 : peakUsage.getUsed(),
+                        peakUsage.getMax() < 0 ? 0 : peakUsage.getMax()
+                ));
+            } catch (OutOfMemoryError err) {
+                throw err; // rethrow
+            } catch (Throwable ex) {
+                /* ignore some JVMs might barf here with:
+                 * java.lang.InternalError: Memory Pool not found
+                 * we just omit the pool in that case!*/
+            }
         }
         stats.mem.pools = pools.toArray(new MemoryPool[pools.size()]);