6840305: Discrepancy in system memory details (when 4G or greater) reported by JVM and Windows OS
Summary: GlobalMemoryStatus() does not report correct memory usage when the system has more than 4gb of RAM. GlobalMemoryStatusEx() should be used in place of GlobalMemoryStatus().
Reviewed-by: kamg, coleenp
--- a/hotspot/src/os/windows/vm/os_windows.cpp Mon Jun 29 14:42:12 2009 -0700
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Thu Jul 16 18:21:40 2009 -0700
@@ -616,12 +616,13 @@
}
julong os::win32::available_memory() {
- // FIXME: GlobalMemoryStatus() may return incorrect value if total memory
- // is larger than 4GB
- MEMORYSTATUS ms;
- GlobalMemoryStatus(&ms);
-
- return (julong)ms.dwAvailPhys;
+ // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
+ // value if total memory is larger than 4GB
+ MEMORYSTATUSEX ms;
+ ms.dwLength = sizeof(ms);
+ GlobalMemoryStatusEx(&ms);
+
+ return (julong)ms.ullAvailPhys;
}
julong os::physical_memory() {
@@ -1579,16 +1580,17 @@
st->print("Memory:");
st->print(" %dk page", os::vm_page_size()>>10);
- // FIXME: GlobalMemoryStatus() may return incorrect value if total memory
- // is larger than 4GB
- MEMORYSTATUS ms;
- GlobalMemoryStatus(&ms);
+ // Use GlobalMemoryStatusEx() because GlobalMemoryStatus() may return incorrect
+ // value if total memory is larger than 4GB
+ MEMORYSTATUSEX ms;
+ ms.dwLength = sizeof(ms);
+ GlobalMemoryStatusEx(&ms);
st->print(", physical %uk", os::physical_memory() >> 10);
st->print("(%uk free)", os::available_memory() >> 10);
- st->print(", swap %uk", ms.dwTotalPageFile >> 10);
- st->print("(%uk free)", ms.dwAvailPageFile >> 10);
+ st->print(", swap %uk", ms.ullTotalPageFile >> 10);
+ st->print("(%uk free)", ms.ullAvailPageFile >> 10);
st->cr();
}
@@ -3135,11 +3137,13 @@
_processor_level = si.wProcessorLevel;
_processor_count = si.dwNumberOfProcessors;
- MEMORYSTATUS ms;
+ MEMORYSTATUSEX ms;
+ ms.dwLength = sizeof(ms);
+
// also returns dwAvailPhys (free physical memory bytes), dwTotalVirtual, dwAvailVirtual,
// dwMemoryLoad (% of memory in use)
- GlobalMemoryStatus(&ms);
- _physical_memory = ms.dwTotalPhys;
+ GlobalMemoryStatusEx(&ms);
+ _physical_memory = ms.ullTotalPhys;
OSVERSIONINFO oi;
oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);