Java 获取android设备';s以编程方式存储所有RAM内存,而不仅仅是仅分配给用户进程的内存

Java 获取android设备';s以编程方式存储所有RAM内存,而不仅仅是仅分配给用户进程的内存,java,android,api,memory,memory-management,Java,Android,Api,Memory,Memory Management,我有一个设备,我知道它有512MB的RAM内存 希望能够以编程方式检索此值(512 MB) 到目前为止,我在互联网上主要接触到以下两种方式: 这给了我386MB 而且 这也给了386MB 我假设386 MB是用户进程可用的内存,因此我希望获得所有内存或其他进程的细分。我打赌您的设备与我的相同:Google Nexus S(或者它可能是具有类似配置的设备)。这款手机有512MB的物理RAM,但其中128个被GPU占用。这就是为什么Android只有384 MB可用,这就是系统报告的数量。从: N

我有一个设备,我知道它有512MB的RAM内存

希望能够以编程方式检索此值(512 MB)

到目前为止,我在互联网上主要接触到以下两种方式:

这给了我386MB

而且 这也给了386MB


我假设386 MB是用户进程可用的内存,因此我希望获得所有内存或其他进程的细分。

我打赌您的设备与我的相同:Google Nexus S(或者它可能是具有类似配置的设备)。这款手机有512MB的物理RAM,但其中128个被GPU占用。这就是为什么Android只有384 MB可用,这就是系统报告的数量。从:

Nexus S有512 MB的RAM(移动DDR)(128MB分配给 GPU,为操作系统留出384MB可用空间)


因为这是系统可用的所有内存(不仅仅是用户进程),所以您得到的值是正确的。

下面是通过以下代码查找已分配内存的方法:

{
        Double allocated = new Double(Debug.getNativeHeapAllocatedSize())/new Double((1048576));
        Double available = new Double(Debug.getNativeHeapSize())/1048576.0;
        Double free = new Double(Debug.getNativeHeapFreeSize())/1048576.0;
        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);
        df.setMinimumFractionDigits(2);

        Log.d("tag", "debug.heap native: allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free)");
        Log.d("tag", "debug.memory: allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory()/1048576)) + "MB of " + df.format(new Double(Runtime.getRuntime().maxMemory()/1048576))+ "MB (" + df.format(new Double(Runtime.getRuntime().freeMemory()/1048576)) +"MB free)");

    }

您的假设是错误的。@i我想我可以根据这一点来启发我们,您可以获得内核可访问的总内存和系统的可用内存。因此,任何未报告的内存都不可供任何用户或内核使用。我完全同意这一评论,但我的问题是:如何通过代码找出未报告的内存的总和?简短的回答是——你不能——至少通过安卓api(此时此刻)。您可能能够编写可以直接查询内存控制器并获取该信息的设备本机代码,但您需要逐个设备编写该代码。(我也投票赞成你的问题,因为我看不出有任何理由被否决)。Axel,我正在试图找到一种方法以编程方式获得总内存(512或1024或设备拥有的任何内存),因为我的程序将运行的每个设备中的总内存都会不同。那么有没有办法通过代码获得你标记的内存?”(移动DDR)”我认为没有办法,因为它受到硬件的限制。你的设备物理上有512mb,但硬件将其在gpu和系统可用内存之间分割。你也许可以找到gpu可用的内存,并将其添加到系统报告的值中。但我不知道是否有办法确定gpu内存是否可用是在同一个物理芯片上。当然,如果两者加起来都是2的幂,而其中任何一个都不是2的幂,这将是一个强烈的暗示,因为好吧,所有RAM模块的内存量都是2的幂。这种方法非常智能地解决了我的问题:)。我将用2的所有幂做一个查找表,并找到最接近“OS内存”的值。如果没有人会发布一个程序化的方法来检索准确的值,我会将您标记为正确的答案。
  public void getTotalRAM() {

        RandomAccessFile reader = null;
        String load = null;
        DecimalFormat twoDecimalForm = new DecimalFormat("#.##");
        double totRam = 0;
        String lastValue = "";
        try {
            reader = new RandomAccessFile("/proc/meminfo", "r");
            load = reader.readLine();

            // Get the Number value from the string
            Pattern p = Pattern.compile("(\\d+)");
            Matcher m = p.matcher(load);
            String value = "";
            while (m.find()) {
                value = m.group(1);
                // System.out.println("Ram : " + value);
            }
            reader.close();

            totRam = Double.parseDouble(value);
            // totRam = totRam / 1024;

            double mb = totRam / 1024.0;
            double gb = totRam / 1048576.0;
            double tb = totRam / 1073741824.0;

            if (tb > 1) {
                lastValue = twoDecimalForm.format(tb).concat(" TB");
            } else if (gb > 1) {
                lastValue = twoDecimalForm.format(gb).concat(" GB");
            } else if (mb > 1) {
                lastValue = twoDecimalForm.format(mb).concat(" MB");
            } else {
                lastValue = twoDecimalForm.format(totRam).concat(" KB");
            }



        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            // Streams.close(reader);
        }

        scanBtn.setText("" +"/"+lastValue );
    }