- public static ProcessMemoryCounters getMemoryCounters(ProcessMemoryCounters out) {
- if (out == null)
- out = new ProcessMemoryCounters();
-
- OS os = OS.calculate();
- Arch arch = Arch.calculate();
- switch (os) {
- case WINDOWS: {
- HANDLE proc = Kernel32.INSTANCE.GetCurrentProcess();
- switch (arch) {
- case X86: {
- Psapi32.PROCESS_MEMORY_COUNTERS_EX pmem = new Psapi32.PROCESS_MEMORY_COUNTERS_EX();
- boolean ok = Psapi32.INSTANCE.GetProcessMemoryInfo(proc, pmem, pmem.size());
- if (ok)
- pmem.writeTo(out);
- return out;
- }
-
- case X86_64: {
- Psapi64.PROCESS_MEMORY_COUNTERS_EX pmem = new Psapi64.PROCESS_MEMORY_COUNTERS_EX();
- boolean ok = Psapi64.INSTANCE.GetProcessMemoryInfo(proc, pmem, pmem.size());
- if (ok)
- pmem.writeTo(out);
- return out;
- }
-
- default:
- throw new UnsupportedOperationException("Architecture " + arch + " not supported on operating system " + os);
- }
+ public static ProcessMemoryInfo getMemoryInfo(ProcessMemoryInfo out) {
+ switch (OS.calculate()) {
+ case WINDOWS:
+ return getProcessMemoryCounters(out);
+
+ case APPLE:
+ return getCMemoryInfo(out);
+
+ case LINUX: {
+ CMemoryInfo info = getCMemoryInfo(out);
+ info.peakRSS *= 1024L;
+ getCurrentRSS(info);
+ return info;
+ }
+
+ default:
+ return DummyProcessMemoryInfo.INSTANCE;
+ }
+ }
+
+ private static ProcessMemoryCounters getProcessMemoryCounters(ProcessMemoryInfo out) {
+ ProcessMemoryCounters counters = castOrCreate(out, ProcessMemoryCounters.class);
+ HANDLE proc = Kernel32.INSTANCE.GetCurrentProcess();
+ switch (Arch.calculate()) {
+ case X86: {
+ Psapi32.PROCESS_MEMORY_COUNTERS_EX pmem = new Psapi32.PROCESS_MEMORY_COUNTERS_EX();
+ boolean ok = Psapi32.INSTANCE.GetProcessMemoryInfo(proc, pmem, pmem.size());
+ if (ok)
+ pmem.writeTo(counters);
+ return counters;
+ }
+
+ case X86_64: {
+ Psapi64.PROCESS_MEMORY_COUNTERS_EX pmem = new Psapi64.PROCESS_MEMORY_COUNTERS_EX();
+ boolean ok = Psapi64.INSTANCE.GetProcessMemoryInfo(proc, pmem, pmem.size());
+ if (ok)
+ pmem.writeTo(counters);
+ return counters;
+ }
+
+ default:
+ return counters;
+ }
+ }
+
+ private static CMemoryInfo getCMemoryInfo(ProcessMemoryInfo out) {
+ CMemoryInfo info = castOrCreate(out, CMemoryInfo.class);
+
+ switch (Arch.calculate()) {
+ case X86: {
+ Resource32.Rusage rusage = new Resource32.Rusage();
+ int ok = Resource32.INSTANCE.getrusage(Resource.RUSAGE_SELF, rusage);
+ if (ok == 0)
+ rusage.writeTo(info);
+ return info;
+ }
+
+ case X86_64: {
+ Resource64.Rusage rusage = new Resource64.Rusage();
+ int ok = Resource64.INSTANCE.getrusage(Resource.RUSAGE_SELF, rusage);
+ if (ok == 0)
+ rusage.writeTo(info);
+ return info;
+ }
+
+ default:
+ return info;
+ }
+ }
+
+ private static CMemoryInfo getCurrentRSS(ProcessMemoryInfo out) {
+ CMemoryInfo info = castOrCreate(out, CMemoryInfo.class);
+
+ switch (Arch.calculate()) {
+ case X86: {
+ long rss = Stat.getCurrentRSS(Resource32.INSTANCE);
+ if (rss >= 0)
+ info.currentRSS = rss;
+ return info;
+ }
+
+ case X86_64: {
+ long rss = Stat.getCurrentRSS(Resource64.INSTANCE);
+ if (rss >= 0)
+ info.currentRSS = rss;
+ return info;