1
18 package net.bull.javamelody.internal.model;
19
20 import java.io.Serializable;
21 import java.lang.management.GarbageCollectorMXBean;
22 import java.lang.management.ManagementFactory;
23 import java.lang.management.MemoryPoolMXBean;
24 import java.lang.management.MemoryUsage;
25 import java.text.DecimalFormat;
26
27 import net.bull.javamelody.internal.common.I18N;
28
29
37 public class MemoryInformations implements Serializable {
38 private static final long serialVersionUID = 3281861236369720876L;
39 private static final String NEXT = ",\n";
40 private static final String MO = " Mo";
41
42
43 private final long usedMemory;
44
45 private final long maxMemory;
46
47 private final long usedPermGen;
48
49 private final long maxPermGen;
50 private final long usedNonHeapMemory;
51 private final long usedBufferedMemory;
52 private final int loadedClassesCount;
53 private final long garbageCollectionTimeMillis;
54 private final long usedPhysicalMemorySize;
55 private final long usedSwapSpaceSize;
56 private final String memoryDetails;
57
58 MemoryInformations() {
59 super();
60 usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
61 maxMemory = Runtime.getRuntime().maxMemory();
62 final MemoryPoolMXBean permGenMemoryPool = getPermGenMemoryPool();
63 if (permGenMemoryPool != null) {
64 final MemoryUsage usage = permGenMemoryPool.getUsage();
65 usedPermGen = usage.getUsed();
66 maxPermGen = usage.getMax();
67 } else {
68 usedPermGen = -1;
69 maxPermGen = -1;
70 }
71 usedNonHeapMemory = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage().getUsed();
72 usedBufferedMemory = MBeansAccessor.getUsedBufferMemory();
73 loadedClassesCount = ManagementFactory.getClassLoadingMXBean().getLoadedClassCount();
74 garbageCollectionTimeMillis = buildGarbageCollectionTimeMillis();
75
76 usedPhysicalMemorySize = MBeansAccessor
77 .getLongFromOperatingSystem("TotalPhysicalMemorySize")
78 - MBeansAccessor.getLongFromOperatingSystem("FreePhysicalMemorySize");
79 usedSwapSpaceSize = buildUsedSwapSpaceSize();
80
81 memoryDetails = buildMemoryDetails();
82 }
83
84 private long buildUsedSwapSpaceSize() {
85 try {
86 return MBeansAccessor.getLongFromOperatingSystem("TotalSwapSpaceSize")
87 - MBeansAccessor.getLongFromOperatingSystem("FreeSwapSpaceSize");
88 } catch (final Throwable e) {
89
90
91 return -1;
92 }
93 }
94
95 private static MemoryPoolMXBean getPermGenMemoryPool() {
96 for (final MemoryPoolMXBean memoryPool : ManagementFactory.getMemoryPoolMXBeans()) {
97
98 if (memoryPool.getName().endsWith("Perm Gen")) {
99 return memoryPool;
100 }
101 }
102 return null;
103 }
104
105 private static long buildGarbageCollectionTimeMillis() {
106 long garbageCollectionTime = 0;
107 for (final GarbageCollectorMXBean garbageCollector : ManagementFactory
108 .getGarbageCollectorMXBeans()) {
109 garbageCollectionTime += garbageCollector.getCollectionTime();
110 }
111 return garbageCollectionTime;
112 }
113
114 private String buildMemoryDetails() {
115 final DecimalFormat integerFormat = I18N.createIntegerFormat();
116 final String nonHeapMemory = "Non heap memory = "
117 + integerFormat.format(usedNonHeapMemory / 1024 / 1024) + MO
118 + " (Perm Gen, Code Cache)";
119
120 final String classLoading = "Loaded classes = " + integerFormat.format(loadedClassesCount);
121 final String gc = "Garbage collection time = "
122 + integerFormat.format(garbageCollectionTimeMillis) + " ms";
123 String osInfo = "";
124 String osInfo2 = "";
125 final long totalPhysicalMemorySize = MBeansAccessor
126 .getLongFromOperatingSystem("TotalPhysicalMemorySize");
127 if (totalPhysicalMemorySize >= 0) {
128 osInfo = "Process cpu time = "
129 + integerFormat.format(
130 MBeansAccessor.getLongFromOperatingSystem("ProcessCpuTime") / 1000000)
131 + " ms,\nCommitted virtual memory = "
132 + integerFormat.format(
133 MBeansAccessor.getLongFromOperatingSystem("CommittedVirtualMemorySize")
134 / 1024 / 1024)
135 + MO + ",\nFree physical memory = "
136 + integerFormat.format(
137 MBeansAccessor.getLongFromOperatingSystem("FreePhysicalMemorySize")
138 / 1024 / 1024)
139 + MO + ",\nTotal physical memory = "
140 + integerFormat.format(totalPhysicalMemorySize / 1024 / 1024) + MO;
141 try {
142 osInfo2 = ",\nFree swap space = "
143 + integerFormat.format(
144 MBeansAccessor.getLongFromOperatingSystem("FreeSwapSpaceSize")
145 / 1024 / 1024)
146 + MO + ",\nTotal swap space = "
147 + integerFormat.format(
148 MBeansAccessor.getLongFromOperatingSystem("TotalSwapSpaceSize")
149 / 1024 / 1024)
150 + MO;
151 } catch (final Throwable e) {
152
153
154 }
155 }
156 if (usedBufferedMemory < 0) {
157 return nonHeapMemory + NEXT + classLoading + NEXT + gc + NEXT + osInfo + osInfo2;
158 }
159 final String bufferedMemory = "Buffered memory = "
160 + integerFormat.format(usedBufferedMemory / 1024 / 1024) + MO;
161 return nonHeapMemory + NEXT + bufferedMemory + NEXT + classLoading + NEXT + gc + NEXT
162 + osInfo;
163 }
164
165 public long getUsedMemory() {
166 return usedMemory;
167 }
168
169 public long getMaxMemory() {
170 return maxMemory;
171 }
172
173 public double getUsedMemoryPercentage() {
174 return 100d * usedMemory / maxMemory;
175 }
176
177 public long getUsedPermGen() {
178 return usedPermGen;
179 }
180
181 public long getMaxPermGen() {
182 return maxPermGen;
183 }
184
185 public double getUsedPermGenPercentage() {
186 if (usedPermGen > 0 && maxPermGen > 0) {
187 return 100d * usedPermGen / maxPermGen;
188 }
189 return -1d;
190 }
191
192 public long getUsedNonHeapMemory() {
193 return usedNonHeapMemory;
194 }
195
196 public long getUsedBufferedMemory() {
197 return usedBufferedMemory;
198 }
199
200 public int getLoadedClassesCount() {
201 return loadedClassesCount;
202 }
203
204 public long getGarbageCollectionTimeMillis() {
205 return garbageCollectionTimeMillis;
206 }
207
208 public long getUsedPhysicalMemorySize() {
209 return usedPhysicalMemorySize;
210 }
211
212 public long getUsedSwapSpaceSize() {
213 return usedSwapSpaceSize;
214 }
215
216 public String getMemoryDetails() {
217 return memoryDetails;
218 }
219
220
221 @Override
222 public String toString() {
223 return getClass().getSimpleName() + "[usedMemory=" + getUsedMemory() + ", maxMemory="
224 + getMaxMemory() + ']';
225 }
226 }
227