打印Android程序所占内存

本博客介绍了一个用于监控程序内存使用情况的脚本,通过打印内存使用信息到日志文件,并利用这些数据在Excel中生成图表,提供更直观的内存使用视图。

项目中内存溢出,故关注程序内存使用情况

写了个打印内存使用情况的脚本:

 

  1. import java.io.BufferedReader;  
  2. import java.io.BufferedWriter;  
  3. import java.io.File;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.InputStreamReader;  
  8.   
  9. public class CdMemoryReader {  
  10.     BufferedWriter writer;  
  11.   
  12. /** 
  13.  *  
  14. * @Description: TODO 
  15. * @param @param args  args[0] : process name  args[1]: execute time (int) args[2]: sleep time  (long) 
  16. * @return void 
  17. * @throws @param args 
  18. * @date:2010/06/19 
  19. * author: 
  20.  */  
  21.     public static void main(String args[]) {  
  22.         final String brower= "brower";  
  23.         final String mms= "mms";  
  24.           
  25.         long sleeptime = 2000;  
  26.         int times  = 1000 ;  
  27.         String procName = heco ;  
  28.           
  29.        // CdMemoryReader cdMemoryReader  = new CdMemoryReader() ;  
  30.         System.out.println();  
  31.         switch (args.length){  
  32.             default :  
  33.                 System.out.println("the args more than 3 is useless !");  
  34.                 System.out.println();  
  35.             case 3 :  
  36.                 try{  
  37.                     long sleepT = Long.parseLong(args[2]);  
  38.                     sleeptime = sleepT < 1000 ? 1000 : sleepT ;  
  39.                 }catch(NumberFormatException e){  
  40.                     System.out.println("the args: " +args[2] + "is not a number .");  
  41.                     System.exit(0);  
  42.                 }  
  43.             case 2 :  
  44.                 try{  
  45.                     int exectime = Integer.parseInt(args[1]);  
  46.                     times = exectime <= 0 ? 1 : exectime ;  
  47.                 }catch(NumberFormatException e){  
  48.                     System.out.println("the args: " +args[1] + "is not a number .");  
  49.                     System.exit(0);  
  50.                 }  
  51.             case 1 :  
  52.                 String name = args[0];  
  53.                      //这里可以不做判断 直接使用传入的参数 我们是特定打印  
  54.                 if (name.contains(brower)) {  
  55.                     procName = brower;  
  56.                 }else if (name.contains(mms)){  
  57.                     procName = mms;  
  58.                 }else {  
  59.                     System.out.println("the process name is wrong !!");  
  60.                     System.exit(0);  
  61.                 }    
  62.             case 0 :  
  63.                 System.out.println("proce name: " + procName);  
  64.                 System.out.println();  
  65.                 System.out.println("execute times: " + times);  
  66.                 System.out.println();  
  67.                 System.out.println("sleep time: " + sleeptime);  
  68.                 System.out.println();  
  69.                 new CdMemoryReader().cdAccess(sleeptime,times,20,procName);  
  70.                 break ;  
  71.         }  
  72.           
  73.     }  
  74.   
  75.     private void cdAccess(long time, int times, int lines,String procName) {  
  76.   
  77.         Runtime rt = Runtime.getRuntime();  
  78.         StringBuffer buffer = new StringBuffer();  
  79.         String title  = " PID      Vss      Rss      Pss      Uss  cmdline" ;  
  80.         System.out.println(title);  
  81.         try {  
  82.             writer = new BufferedWriter(new FileWriter(new File("D:/log.txt")));  
  83.             writer.write(title + "/n");  
  84.         } catch (IOException e) {  
  85.             // TODO Auto-generated catch block  
  86.             e.printStackTrace();  
  87.         }  
  88.         int printTime = 1 ;  
  89.         for (int i = 0; i < times; i++) {  
  90.             try {  
  91.                 String cmd = "adb shell procrank";  
  92.                 buffer.delete(0, buffer.length());  
  93.                 Process proc = rt.exec(cmd);  
  94.                 InputStream stderr = proc.getInputStream();  
  95.                 InputStreamReader isr = new InputStreamReader(stderr);  
  96.                 BufferedReader br = new BufferedReader(isr);  
  97.   
  98.                 String line = null;  
  99.                 int j = 0;  
  100.                 while ((line = br.readLine()) != null) {  
  101.                     if (j < lines) {  
  102.                         if (line.contains(procName)){  
  103.                             System.out.println(line + "  PrintTime : " + printTime+++ "  execute time : " + (i+1));  
  104.                             buffer.append(line + "/n");  
  105.                             break ;  
  106.                         }  
  107.                     }  
  108.                     j++;  
  109.                 }  
  110. //              buffer.append("/n");  
  111. //              buffer.append("/n");  
  112.                 writer.write(buffer.toString());  
  113.                 writer.flush();  
  114. //              System.out.println("buffer.toString()" + buffer.toString());  
  115.                   
  116.             } catch (Throwable t) {  
  117.                 t.printStackTrace();  
  118.             }  
  119.             try {  
  120.                 Thread.sleep(time);  
  121.             } catch (InterruptedException ie) {  
  122.                 ie.printStackTrace();  
  123.             }  
  124.         }  
  125.         try {  
  126.             writer.close();  
  127.         } catch (IOException e) {  
  128.             // TODO Auto-generated catch block  
  129.             e.printStackTrace();  
  130.         }  
  131.     }  
  132. }  

 

 日志文件默认放在D盘

将uss 的数据获取 放在excel 中可以生成以下的图,更直观些

 

from:  http://blog.youkuaiyun.com/zhanghw0917/archive/2010/06/19/5680229.aspx

 

在 Unity 中针对 Android 平台进行内存打印或监控,可以通过以下几种方式实现: ### 使用 `Android Logcat` 工具 Unity 提供了对 Android Logcat 的集成支持,允许开发者查看设备上的日志信息,包括内存使用情况。首先需要确保项目中已导入 Android Logcat 包,并且设备连接正常[^3]。 #### 操作步骤: 1. 在 Unity Package Manager 中导入 Android Logcat 包(适用于 Unity 2019.4 及以上版本); 2. 连接 Android 设备,并发布应用程序; 3. 打开 Android Logcat(Window → Analysis → Android Logcat 或使用快捷键 Alt+6),将其设置为 Auto Run,会自动打印设备上所有日志信息,包括内存相关的数据。 ### 使用 Unity 内置 API 监控内存使用 Unity 提供了一些内置的 API 来获取当前应用的内存使用情况,例如 `SystemInfo.systemMemorySize` 和 `Profiler.usedHeapSize`,这些值可以帮助开发者了解运行时内存分配状况。 #### 示例代码: ```csharp using UnityEngine; using System; public class MemoryMonitor : MonoBehaviour { void Update() { if (Input.GetKeyDown(KeyCode.M)) { long usedMemory = Profiler.usedHeapSizeLong; long totalMemory = SystemInfo.systemMemorySize; Debug.Log($"Used Memory: {usedMemory / 1024 / 1024} MB"); Debug.Log($"Total System Memory: {totalMemory} MB"); } } } ``` ### 使用 ADB 命令行工具 通过 Android SDK 提供的 ADB 工具,可以在命令行中执行相关命令来获取应用的内存使用情况。 #### 示例命令: ```bash adb shell dumpsys meminfo <package_name> ``` 这将显示指定包名的应用程序在设备上的详细内存使用信息。 ### 使用 Android Studio 调试工具 Android Studio 提供了强大的调试工具,可以实时监控应用的内存使用情况。打开 Android Studio,连接设备后选择目标设备并运行或调试应用,利用其内置的性能分析工具来观察内存变化。 #### 操作步骤: 1. 在 Android Studio 中打开项目; 2. 连接 Android 设备,确保开启了开发者模式和 USB 调试; 3. 打开 AS 项目,右上角 Device 选择目标设备; 4. 点击 Run → Run ‘launcher’/Debug ‘launcher’(若为灰色,重启 AS 即可),即部署至设备开始调试; ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值