这些变量是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区域的总内存大小,而不是进程独占的内存大小。而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的值。