android 获取当前程序所占内存

目录

android jni中c++获取当前程序所占内存

可以使用 Runtime 类和 MemoryInfo 类。

获取特定进程(例如当前应用程序)的内存信息,可以使用 getProcessMemoryInfo 方法,

android java代码当cpu占用超过85,报警,内存占用超过85报警

获取cpu占用率的例子:


android jni中c++获取当前程序所占内存

在Android的JNI环境中,获取当前进程的内存使用情况需要通过读取 /proc/self/statm 文件来实现。这个文件包含了进程的内存使用情况的信息。以下是一个简单的C++函数,可以获取当前进程的内存使用情况:

#include <cstdio>

long getMemoryUsage() {
    FILE* file = fopen("/proc/self/statm", "r");
    if (file == nullptr) {
        return -1;
    }

    long size; //       total program size (pages) (same as VmSize in /proc/[pid]/status)
    long resident;//   resident set size (pages) (same as VmRSS in /proc/[pid]/status)
    long share;//      shared pages (i.e., backed by a file)
    long text;//       text (code)
    long lib;//        library (unused in Linux 2.6)
    long data;//       data + stack
    long dt;//         dirty pages (unused in Linux 2.6)

    int count = fscanf(file, "%ld %ld %ld %ld %ld %ld %ld", &size, &resident, &share, &text, &lib, &data, &dt);
    fclose(file);

    if (count != 7) {
        return -1;
    }

    // 注意: 这里获取的是以页为单位的内存使用情况,需要乘以页面大小才能转换为字节
    long page_size = sysconf(_SC_PAGESIZE);

    return resident * page_size;
}

这个函数会返回当前进程的内存使用情况(以字节为单位)。如果发生错误,它会返回-1。

这个函数获取的是进程的常驻集大小(Resident Set Size,RSS),这是进程在物理内存中占用的部分的大小。这不包括交换空间中的部分,也不包括共享的部分。

请注意,这个函数只适用于Linux和Android,不适用于其他操作系统。在Android上,你可能需要添加适当的权限才能读取 /proc/self/statm 文件。

可以使用 Runtime 类和 MemoryInfo 类。

以下是一个简单的示例:

import android.app.ActivityManager;
import android.content.Context;
import android.os.Debug;

...

// 获取 ActivityManager 服务
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

// 创建一个 MemoryInfo 对象
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();

// 获取当前应用程序的内存信息
activityManager.getMemoryInfo(memoryInfo);

// 输出当前应用程序的内存使用情况
Log.i("Memory Info", "Memory usage: " + memoryInfo.availMem);

这段代码会输出当前应用程序的可用内存。请注意,这是整个应用程序的可用内存,而不仅仅是当前运行的Activity。

获取特定进程(例如当前应用程序)的内存信息,可以使用 getProcessMemoryInfo 方法,

如下所示:

// 获取当前应用程序的 PID
int pid = android.os.Process.myPid();

// 获取指定 PID 的内存信息
Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(new int[]{pid});

// 获取当前应用程序的总 PSS
int totalPss = memoryInfoArray[0].getTotalPss();

// 输出当前应用程序的内存使用情况
Log.i("Memory Info", "Memory usage: " + totalPss);

这段代码会输出当前应用程序的总 PSS(Proportional Set Size),这是一个表示应用程序实际使用的内存量的指标。

请注意,这些方法需要 android.permission.GET_TASKS 权限,你需要在你的 AndroidManifest.xml 文件中声明这个权限。

最后,需要注意的是,这些方法只能提供一个大概的内存使用情况,如果你需要更详细的内存使用情况,你可能需要使用更复杂的工具,例如 Android Profiler。

android java代码当cpu占用超过85,报警,内存占用超过85报警

public class MainActivity extends AppCompatActivity {

    private Handler mHandler = new Handler();
    private Runnable mRunnable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRunnable = new Runnable() {
            @Override
            public void run() {
                double cpuUsage = getCpuUsage();
                double memoryUsage = getMemoryUsage();

                if (cpuUsage > 85) {
                    // CPU使用率超过85%,发出警告
                    Log.w("Warning", "CPU usage is over 85%: " + cpuUsage);
                }

                if (memoryUsage > 85) {
                    // 内存使用率超过85%,发出警告
                    Log.w("Warning", "Memory usage is over 85%: " + memoryUsage);
                }

                // 每隔一秒钟检查一次
                mHandler.postDelayed(this, 1000);
            }
        };

        mHandler.post(mRunnable);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacks(mRunnable);
    }

    private double getCpuUsage() {
        // 这里需要实现获取CPU使用率的逻辑
        // 可以使用 /proc/stat 和 /proc/[pid]/stat 文件
        return 0;
    }

    private double getMemoryUsage() {
        Runtime runtime = Runtime.getRuntime();
        long usedMemory = runtime.totalMemory() - runtime.freeMemory();
        long totalMemory = runtime.maxMemory();
        return 100.0 * usedMemory / totalMemory;
    }
}

获取cpu占用率的例子:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private Handler mHandler = new Handler();
    private Runnable mRunnable;
    private long mLastCpuTime;
    private long mLastAppCpuTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRunnable = new Runnable() {
            @Override
            public void run() {
                double cpuUsage = getCpuUsage();

                if (cpuUsage > 85) {
                    // CPU使用率超过85%,发出警告
                    Log.w("Warning", "CPU usage is over 85%: " + cpuUsage);
                }

                // 每隔一秒钟检查一次
                mHandler.postDelayed(this, 1000);
            }
        };

        mHandler.post(mRunnable);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacks(mRunnable);
    }

    private double getCpuUsage() {
        try {
            long cpuTime = readSystemCpuTime();
            long appCpuTime = readProcessCpuTime();

            long cpuTimeDiff = cpuTime - mLastCpuTime;
            long appCpuTimeDiff = appCpuTime - mLastAppCpuTime;

            mLastCpuTime = cpuTime;
            mLastAppCpuTime = appCpuTime;

            return 100.0 * appCpuTimeDiff / cpuTimeDiff;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    private long readSystemCpuTime() throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("/proc/stat"));
        String[] tokens = reader.readLine().split(" ");
        reader.close();

        long idleTime = Long.parseLong(tokens[4]);
        long totalTime = 0;
        for (int i = 2; i < tokens.length; i++) {
            totalTime += Long.parseLong(tokens[i]);
        }

        return totalTime - idleTime;
    }

    private long readProcessCpuTime() throws IOException {
        int pid = android.os.Process.myPid();
        BufferedReader reader = new BufferedReader(new FileReader("/proc/" + pid + "/stat"));
        String[] tokens = reader.readLine().split(" ");
        reader.close();

        long utime = Long.parseLong(tokens[13]);
        long stime = Long.parseLong(tokens[14]);
        long cutime = Long.parseLong(tokens[15]);
        long cstime = Long.parseLong(tokens[16]);

        return utime + stime + cutime + cstime;
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值