使用MemoryInfo类获取进程的Native Heap、Java Heap、Graphics Heap判断递增Native内存对象

目录

  • 认识MemoryInfo类
  • 获取内存对象
  • 释放对象
  • 判断来源

认识MemoryInfo类

这些变量是MemoryInfo类的成员之一,用于表示进程在不同内存区域(Dalvik Heap、Native Heap、其他Heap)中使用的内存情况。具体描述如下:

内存区域 变量名 描述 单位
Dalvik Heap dalvikPrivateDirty 进程内存大小(已修改) KB
dalvikPss 进程使用的实际物理内存大小 KB
dalvikSharedDirty 进程共享内存大小(已修改) KB
Native Heap nativePrivateDirty 进程独占内存大小(已修改) KB
nativePss 进程使用的实际物理内存大小 KB
nativeSharedDirty 进程共享内存大小(已修改) KB
Other Heap otherPrivateDirty 进程独占内存大小(已修改) KB
otherPss 进程使用的实际物理内存大小 KB
otherSharedDirty 进程共享内存大小(已修改) KB

需要注意的是,这些变量仅表示进程在不同内存区域中使用的内存情况,不包括进程使用的其他内存,例如Java Heap、Stack、Code等。如果需要获取进程的完整内存使用情况,可以使用ActivityManager.MemoryInfo类,该类中包含了更详细的内存信息。

获取内存对象

使用MemoryInfo类可以获取当前进程的内存信息,包括Native Heap、Java Heap、Graphics Heap等,可以用来判断app不断增加的Native内存对象。以下是一个简单的示例:

private long mLastNativeHeapSize = 0;
private long mLastNativeHeapAllocatedSize = 0;

private void monitorNativeHeap() {
    MemoryInfo mi = new MemoryInfo();
    Debug.getMemoryInfo(mi);

    long nativeHeapSize = mi.nativeHeapSize;
    long nativeHeapAllocatedSize = mi.nativeHeapAllocatedSize;

    if (mLastNativeHeapSize > 0
            && nativeHeapSize > mLastNativeHeapSize
            && nativeHeapAllocatedSize > mLastNativeHeapAllocatedSize) {
        Log.e(TAG, "Native heap has increased: "
                + (nativeHeapSize - mLastNativeHeapSize) / 1024 + " KB");
    }

    mLastNativeHeapSize = nativeHeapSize;
    mLastNativeHeapAllocatedSize = nativeHeapAllocatedSize;

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            monitorNativeHeap();
        }
    }, 1000);
}

在上面的示例中,我们定义了一个monitorNativeHeap方法,该方法使用MemoryInfo类获取Native Heap的内存信息,并与上一次获取的信息进行比较。如果Native Heap的内存占用超过上一次获取的信息,就会输出日志信息,提示Native Heap的内存增加了多少。通过不断地调用monitorNativeHeap方法,我们可以监控Native Heap的内存使用情况,并及时采取相应的措施来释放内存。

需要注意的是,MemoryInfo类获取的是当前进程的内存信息,如果应用程序中有多个进程,我们需要在每个进程中都进行监控。此外,我们还应该注意内存信息的单位,MemoryInfo类返回的是字节(Byte),如果要输出日志信息,需要将字节转换为KB、MB等单位。

释放对象


使用MemoryInfo类获取进程的Native Heap可以判断递增Native内存对象,并释放。以下是一个简单的示例:

private long mLastNativeHeapSize = 0;
private long mLastNativeHeapAllocatedSize = 0;

private void monitorNativeHeap() {
    MemoryInfo mi = new MemoryInfo();
    Debug.getMemoryInfo(mi);

    long nativeHeapSize = mi.nativeHeapSize;
    long nativeHeapAllocatedSize = mi.nativeHeapAllocatedSize;

    if (mLastNativeHeapSize > 0
            && nativeHeapSize > mLastNativeHeapSize
            && nativeHeapAllocatedSize > mLastNativeHeapAllocatedSize) {

        // 递增的Native内存对象
        long incrementNativeHeapSize = nativeHeapSize - mLastNativeHeapSize;
        Log.e(TAG, "Native heap has increased: "
                + incrementNativeHeapSize / 1024 + " KB");

        // 释放Native内存对象
        releaseNativeHeap(incrementNativeHeapSize);
    }

    mLastNativeHeapSize = nativeHeapSize;
    mLastNativeHeapAllocatedSize = nativeHeapAllocatedSize;

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            monitorNativeHeap();
        }
    }, 1000);
}

private void releaseNativeHeap(long incrementNativeHeapSize) {
    // 释放Native内存对象的方法
    // 例如,如果Native内存对象是通过JNI创建的,可以使用JNI的相关函数进行释放
    // 例如,如果Native内存对象是通过BitmapFactory创建的,可以使用Bitmap的recycle方法进行释放
    // 例如,如果Native内存对象是通过NIO创建的,可以使用Buffer的clear方法进行释放
}

在上面的示例中,我们定义了一个monitorNativeHeap方法,该方法使用MemoryInfo类获取Native Heap的内存信息,并与上一次获取的信息进行比较。如果Native Heap的内存占用超过上一次获取的信息,就会输出日志信息,提示Native Heap的内存增加了多少,并调用releaseNativeHeap方法来释放Native内存对象。


判断来源

使用MemoryInfo类获取进程的Native Heap可以判断递增Native内存对象,并判断对象的来源。以下是一个简单的示例:

private long mLastNativeHeapSize = 0;
private long mLastNativeHeapAllocatedSize = 0;

private void monitorNativeHeap() {
    MemoryInfo mi = new MemoryInfo();
    Debug.getMemoryInfo(mi);

    long nativeHeapSize = mi.nativeHeapSize;
    long nativeHeapAllocatedSize = mi.nativeHeapAllocatedSize;

    if (mLastNativeHeapSize > 0
            && nativeHeapSize > mLastNativeHeapSize
            && nativeHeapAllocatedSize > mLastNativeHeapAllocatedSize) {

        // 递增的Native内存对象
        long incrementNativeHeapSize = nativeHeapSize - mLastNativeHeapSize;
        Log.e(TAG, "Native heap has increased: "
                + incrementNativeHeapSize / 1024 + " KB");

        // 判断对象的来源
        String objectSource = getObjectSource(incrementNativeHeapSize);
        Log.e(TAG, "Object source: " + objectSource);

        // 释放Native内存对象
        releaseNativeHeap(incrementNativeHeapSize, objectSource);
    }

    mLastNativeHeapSize = nativeHeapSize;
    mLastNativeHeapAllocatedSize = nativeHeapAllocatedSize;

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            monitorNativeHeap();
        }
    }, 1000);
}

private String getObjectSource(long incrementNativeHeapSize) {
    // 判断递增的Native内存对象的来源
    // 例如,如果Native内存对象是通过JNI创建的,可以使用JNI的相关函数进行判断
    // 例如,如果Native内存对象是通过BitmapFactory创建的,可以使用Bitmap的getConfig方法进行判断
    // 例如,如果Native内存对象是通过NIO创建的,可以使用Buffer的getClass方法进行判断
    return "";
}

private void releaseNativeHeap(long incrementNativeHeapSize, String objectSource) {
    // 释放Native内存对象的方法
    // 例如,如果Native内存对象是通过JNI创建的,可以使用JNI的相关函数进行释放
    // 例如,如果Native内存对象是通过BitmapFactory创建的,可以使用Bitmap的recycle方法进行释放
    // 例如,如果Native内存对象是通过NIO创建的,可以使用Buffer的clear方法进行释放
}

nativeHeapSize和nativeHeapAllocatedSize都是MemoryInfo类的成员之一,用于表示进程在Native Heap区域中使用的内存情况。具体描述如下:

  • nativeHeapSize:Native Heap区域的总内存大小,单位为KB。
  • nativeHeapAllocatedSize:Native Heap区域中已分配的内存大小,单位为KB。

需要注意的是,nativeHeapSize表示Native Heap区域的总内存大小,而不是进程独占的内存大小。而nativeHeapAllocatedSize表示Native Heap区域中已分配的内存大小,包括进程独占和共享的内存。如果需要获取进程在Native Heap区域中独占的内存大小,可以使用nativePrivateDirty成员变量。

需要注意的是,nativeHeapAllocatedSize只在Android 6.0及以上版本中才被添加到MemoryInfo类中。如果您的应用程序需要支持低于Android 6.0的设备,可以使用以下代码进行兼容:

MemoryInfo mi = new MemoryInfo();
Debug.getMemoryInfo(mi);

long nativeHeapSize = mi.nativeHeapSize;
long nativeHeapAllocatedSize;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    nativeHeapAllocatedSize = mi.nativeHeapAllocatedSize;
} else {
    nativeHeapAllocatedSize = nativeHeapSize - mi.nativeHeapFreeSize;
}

在上面的代码中,我们首先通过Debug.getMemoryInfo(mi)方法获取MemoryInfo类的实例,并获取nativeHeapSize的值。然后,我们判断当前设备的Android版本是否高于或等于6.0,如果是,则可以直接获取nativeHeapAllocatedSize的值,否则,我们需要通过nativeHeapSize和nativeHeapFreeSize计算出nativeHeapAllocatedSize的值。


你可能感兴趣的:(Android,Native内存优化,java,开发语言,android,Native,heap,MemoryInfo)