首页 > 解决方案 > 如何让机器直接记忆?

问题描述

我目前正在尝试获取服务器直接内存值并将其存储到数据库中,但是我一直在获取0值,我的方法是否无法返回正确的500 MB.

我的方法是这样的:

import java.lang.management.BufferPoolMXBean;
import java.lang.management.ManagementFactory;
...
public int toGb(long valueInBytes) {
    return (int) (valueInBytes / (1024 * 1024 * 1024));
}

public int getMemoryDirect() {
    long memoryDirect = 0;
    List<BufferPoolMXBean> pools = ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
    for(BufferPoolMXBean pool : pools) {
        if(pool.getName().equals("direct")) {
            memoryDirect = pool.getTotalCapacity();
        }
    }
    return toGb(memoryDirect);
}

还有其他方法可以检索此值吗?

任何帮助都可以接受 :)

标签: javamemory

解决方案


您的问题可能出在toGb方法上。在 Java 中,整数除法是截断。这意味着,如果您有 500 MB 打算由方法 (500*1024*1024) 返回并打算将其作为整数 GB 值返回,则除以 (1024*1024*1024),它将始终返回 0。您可以通过尝试返回浮点值(例如 double 或 float)来解决此问题。

或者,memoryDirect如果没有池名称等于“直接”,则您的变量可能从未设置过。在这种情况下,memoryDict 也将始终为 0。


推荐阅读