diff --git a/src/windows/native/com/sun/management/OperatingSystem_md.c b/src/windows/native/com/sun/management/OperatingSystem_md.c index b5248992ea45ab4a596ea81be43d238f67a0ca4a..62e5615c80a0eae3de6b076c9fc27b128dd16e74 100644 --- a/src/windows/native/com/sun/management/OperatingSystem_md.c +++ b/src/windows/native/com/sun/management/OperatingSystem_md.c @@ -100,18 +100,20 @@ JNIEXPORT jlong JNICALL Java_com_sun_management_OperatingSystem_getTotalSwapSpaceSize (JNIEnv *env, jobject mbean) { - MEMORYSTATUS ms; - GlobalMemoryStatus(&ms); - return (jlong)ms.dwTotalPageFile; + MEMORYSTATUSEX ms; + ms.dwLength = sizeof(ms); + GlobalMemoryStatusEx(&ms); + return (jlong) ms.ullTotalPageFile; } JNIEXPORT jlong JNICALL Java_com_sun_management_OperatingSystem_getFreeSwapSpaceSize (JNIEnv *env, jobject mbean) { - MEMORYSTATUS ms; - GlobalMemoryStatus(&ms); - return (jlong)ms.dwAvailPageFile; + MEMORYSTATUSEX ms; + ms.dwLength = sizeof(ms); + GlobalMemoryStatusEx(&ms); + return (jlong) ms.ullAvailPageFile; } JNIEXPORT jlong JNICALL @@ -137,21 +139,20 @@ JNIEXPORT jlong JNICALL Java_com_sun_management_OperatingSystem_getFreePhysicalMemorySize (JNIEnv *env, jobject mbean) { - MEMORYSTATUS ms; - GlobalMemoryStatus(&ms); - return (jlong) ms.dwAvailPhys; + MEMORYSTATUSEX ms; + ms.dwLength = sizeof(ms); + GlobalMemoryStatusEx(&ms); + return (jlong) ms.ullAvailPhys; } JNIEXPORT jlong JNICALL Java_com_sun_management_OperatingSystem_getTotalPhysicalMemorySize (JNIEnv *env, jobject mbean) { - MEMORYSTATUS ms; - // also returns dwAvailPhys (free physical memory bytes), - // dwTotalVirtual, dwAvailVirtual, - // dwMemoryLoad (% of memory in use) - GlobalMemoryStatus(&ms); - return ms.dwTotalPhys; + MEMORYSTATUSEX ms; + ms.dwLength = sizeof(ms); + GlobalMemoryStatusEx(&ms); + return (jlong) ms.ullTotalPhys; } // Seems WinXP PDH returns PDH_MORE_DATA whenever we send in a NULL buffer. diff --git a/test/com/sun/management/OperatingSystemMXBean/MemoryStatusOverflow.java b/test/com/sun/management/OperatingSystemMXBean/MemoryStatusOverflow.java new file mode 100644 index 0000000000000000000000000000000000000000..0925710c081f25a92b2ff6f72e319cb32c8c0ae2 --- /dev/null +++ b/test/com/sun/management/OperatingSystemMXBean/MemoryStatusOverflow.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +/* + * @test + * @bug 6853676 + * @summary On computers with more than 4 GB of memory, + * the GlobalMemoryStatus function can return incorrect information, + * reporting a value of -1 to indicate an overflow. + * + * @run main MemoryStatusOverflow + */ + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import java.lang.management.ManagementFactory; +import com.sun.management.OperatingSystemMXBean; + +public class MemoryStatusOverflow { + static final long MEMORYSTATUS_OVERFLOW = (1L << 32) - 1; // (DWORD) -1 + + public static void main(String... args) throws Exception { + OperatingSystemMXBean bean = (OperatingSystemMXBean) + ManagementFactory.getOperatingSystemMXBean(); + List failedGetterNames = new ArrayList(); + List testedGetterNames = Arrays.asList( + "getTotalSwapSpaceSize", "getFreeSwapSpaceSize", + "getTotalPhysicalMemorySize", "getFreePhysicalMemorySize"); + for (String getterName : testedGetterNames) { + Method getter = OperatingSystemMXBean.class.getMethod(getterName); + long value = (Long) getter.invoke(bean); + if (value == MEMORYSTATUS_OVERFLOW) { + failedGetterNames.add(getterName); + } + } + if (!failedGetterNames.isEmpty()) { + throw new AssertionError(failedGetterNames); + } + System.out.println("Test passed."); + } +}