Java Android RAM页面大小?

Java Android RAM页面大小?,java,android,linux,Java,Android,Linux,我想优化InputStream的读取,然后我认为最好有一个大小为RAM页面的byte[]缓冲区 有没有一种方法(可能是静态方法)可以知道它的大小 编辑: 最后,我成功地使用了NDK和JNI,我用C编写了以下代码: #include <jni.h> #include <unistd.h> jlong Java_it_masmil_tests_TestsActivity_pageSize(JNIEnv* env, jobject javaThis) { return

我想优化InputStream的读取,然后我认为最好有一个大小为RAM页面的byte[]缓冲区

有没有一种方法(可能是静态方法)可以知道它的大小

编辑: 最后,我成功地使用了NDK和JNI,我用C编写了以下代码:

#include <jni.h>
#include <unistd.h>

jlong Java_it_masmil_tests_TestsActivity_pageSize(JNIEnv* env, jobject javaThis) {
    return sysconf(_SC_PAGE_SIZE);
}
其中:

  • clibrary是我用NDK创建的库的名称
  • pageSize是在C文件中声明的方法的名称

页面大小由Linux(内核)定义,您可以通过调用libc()的
sysconf(\u SC\u PAGESIZE)
通过JNI获得它。由于Android运行在Linux上,并且大部分运行在ARM系统上,因此可以假设页面大小为4k

#include <unistd.h>
long sz = sysconf(_SC_PAGESIZE);
#包括
long sz=sysconf(_SC_PAGESIZE);
然而,您无法从Java/C中轻松地获得这种对齐方式。这意味着,即使您要求4k块,也没有人保证它将是4k对齐的


如果您在Linux上需要4k对齐的块,您应该使用保证页面大小对齐的块。

很难相信添加JNI等会真正偿还成本。只需像其他人一样使用4096或8192。

您通常可以假设页面大小为4KB或更大(可以处理较小页面大小的MMU实际上已经灭绝)。此外,如果您没有方法将缓冲区与精确的页面边界对齐,那么它很可能仍然跨越两个页面

最后,所有这些努力都是完全浪费的——如果MMU出现一到两个页面未命中,那么实际I/O成本将超过许多数量级。甚至不太可能收回增加的初始化成本,更不用说花在实现上的时间了


你做了一个过分热心的优化工作的完美例子,如果你只是分析你的应用程序,并在最常调用的方法中减少一到两个周期,你本可以花费所有的时间来获得更大的回报(例如)。

我从未使用过它,我尝试过它,但我不明白如何让它工作。。。(尝试此链接)我并不过分热心,我正在实现一个库,它可能用于Android应用程序中的内存操作,然后我需要知道如何获得这些信息。此外,我使用这个示例来学习如何使用NDK。如何使用这些信息是那些将使用这个库的人的工作,我的目的只是拥有这些价值,而不是使用它……我在回答你的问题时明确表示了我的意图:“我想优化输入流的阅读”。“一个可用于内存操作的库”也不能自动证明这项工作是合理的,请再次阅读我的整个答案——您基本上没有可行的方法来满足所有条件,以利用您对页面大小的了解。即使你可以,回报也无法证明投入其中的工作量是合理的。我严格地看成本和回报,而不是用抽象的合理化来说服自己它是值得的。
#include <unistd.h>
long sz = sysconf(_SC_PAGESIZE);