Java 如何判断你的活动距离记忆极限有多近?

Java 如何判断你的活动距离记忆极限有多近?,java,android,memory,mobile,Java,Android,Memory,Mobile,我正在为Android编写一个图形设计应用程序,用户可以在一个文档中添加多个图像,每个图像都存储为位图对象。每个位图的尺寸大约为800x400像素,并使用argb888像素格式(即每个约1.5Mb) 我知道大多数第一代安卓设备都有16Mb的堆限制,而对于较新的手机,这个限制是24Mb或更大。我也知道位图内存是从外部分配的,但我不知道这意味着什么 我的问题是:如何在运行时判断添加新位图是否会使我太接近内存限制 在有人建议“不要使用那么多内存”之前,我知道我有一个选择,那就是限制用户可以创建多少位图

我正在为Android编写一个图形设计应用程序,用户可以在一个文档中添加多个图像,每个图像都存储为位图对象。每个位图的尺寸大约为800x400像素,并使用argb888像素格式(即每个约1.5Mb)

我知道大多数第一代安卓设备都有16Mb的堆限制,而对于较新的手机,这个限制是24Mb或更大。我也知道位图内存是从外部分配的,但我不知道这意味着什么

我的问题是:如何在运行时判断添加新位图是否会使我太接近内存限制

在有人建议“不要使用那么多内存”之前,我知道我有一个选择,那就是限制用户可以创建多少位图,这样我就知道这个限制对于最基本的Android手机是安全的。但是,我希望有更大内存限制的手机支持更多位图和/或更大的位图

我知道在分配位图时要检查OutOfMemory异常。然而,在某些情况下,我只剩下足够的内存来分配一个位图。在这一点之后,整个应用程序将变得不稳定,因为即使分配字符串之类的小东西也可能导致OutOfMemory异常。这是我想避免的事情


我不确定如何定义“太接近内存限制”,但我怀疑类似“不要将超过一半的可用内存分配给位图”这样的东西可以正常工作,因为我存储在内存中的其他数据结构相比之下都很小。

也许重写onLowMemory类可以让你做你想做的事情

@Override
public void onLowMemory() {
    super.onLowMemory();
    //What you want to do
}

使用此方法记录已使用的内存,但我已经在

请看那篇文章进一步解释

public static void logHeap(Class clazz) {
    Double allocated = new Double(Debug.getNativeHeapAllocatedSize())/1048576.0);
    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(APP, "debug. =================================");
    Log.d(APP, "debug.heap native: allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free) in [" + clazz.getName().replaceAll("com.myapp.android.","") + "]");
    Log.d(APP, "debug.memory: allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory()/1048576.0)) + "MB of " + df.format(new Double(Runtime.getRuntime().maxMemory()/1048576.0))+ "MB (" + df.format(new Double(Runtime.getRuntime().freeMemory()/1048576.0)) +"MB free)");
    System.gc();
    System.gc();

    // don't need to add the following lines, it's just an app specific handling in my app        
    if (allocated>=(new Double(Runtime.getRuntime().maxMemory())/1048576.0)-MEMORY_BUFFER_LIMIT_FOR_RESTART)) {
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

谢谢,但为了澄清我在OP中写的内容,我不想陷入内存不足的情况,因为稳定性的原因。我想通过在进行大的分配之前检查剩余的内存量来避免陷入这种情况。当我做得太过分时,这个函数会告诉我。对不起,那时我帮不了你。看看这个,可能比你想象的要复杂一些。位图是在虚拟机之外分配的,所以你不容易在统计数据中“看到”它们。我也对这意味着什么感到困惑。无论如何,我不会使用onLowMemory:谢谢!顺便说一下,不要写“newdouble(x/122)”,只写“x/122.0”(这是一个Double,因为122.0是一个Double)。“new”会产生垃圾,而且很冗长。仅供参考,因为它涉及到这个主题-android博客上有一篇关于mem分析的新博文:关于
java.lang.Runtime.getRuntime.freemory
maxMemory
?不过我还没试过。干杯