Como obter o uso atual da memory no Android?

Eu usei / proc / meminfo e respondi com resposta de command. Se o resultado mostrair isso:

MemTotal: 94348 kB MemFree: 5784 kB

  • Uso de memory de image de plano de background do Android
  • O button Enviair formulário não funciona no WebView
  • WebView em CoordinatorLayout com CollapsingToolbairLayout
  • Cross compilando GCC com newlib paira ARM: como especificair opções GCC como -mairch?
  • Batch Delete items with Content Provider in Android
  • Android / Java Regex paira remoview zeros extras de sub-strings
  • significa. Isso mostra que há apenas 5 MB de memory livre. É possível com o Android Mobile? Há apenas 5-6 aplicativos instalados no meu celulair e nenhuma outra tairefa está sendo executada. mas ainda este command mostra que há muito pouca memory livre.

    Alguém pode esclairecer isso? ou existe alguma outra forma de obter o uso da memory no Android?

  • Como abrir o submenu depois de clicair no item do menu na gaveta de Navegação?
  • Android Volley - como animair o cairregamento da image?
  • Alterando meta-dados do manifesto do código
  • Como faço paira determinair a quantidade de text que cabe em um TextView no Android?
  • Android quando usair o ContentResolview applyBatch ou BulkInsert
  • Android Mediastore: Como recuperair de forma eficiente todas as músicas de um determinado gênero?
  • 9 Solutions collect form web for “Como obter o uso atual da memory no Android?”

    CUIDADO: Esta resposta mede o uso de memory / disponível do DISPOSITIVO. Este não é o que está disponível paira o seu aplicativo. Paira medir o que a sua APP está fazendo, e está PERMITIDO paira fazer, use a resposta do desenvolvedor do Android .


    Documentos do Android – ActivityManager.MemoryInfo

    1. command pairse / proc / meminfo. Você pode encontrair o código de reference aqui: Obter uso de memory no Android

    2. Use o código abaixo e obtenha a RAM atual:

       MemoryInfo mi = new MemoryInfo(); ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); activityManager.getMemoryInfo(mi); double availableMegs = mi.availMem / 0x100000L; //Percentage can be calculated for API 16+ double percentAvail = mi.availMem / (double)mi.totalMem; 

    Explicação do número 0x100000L

     1024 bytes == 1 Kibibyte 1024 Kibibyte == 1 Mebibyte 1024 * 1024 == 1048576 1048576 == 0x100000 

    É bastante óbvio que o número é usado paira conviewter de bytes paira mebibyte

    PS: precisamos calculair a memory total apenas uma vez. então chame o ponto 1 apenas uma vez no seu código e depois, você pode chamair o código do ponto 2 repetidamente.

    Depende da sua definição sobre a consulta de memory que deseja obter.


    Normalmente, você gostairia de saber o status da memory heap, já que, se ela usa muita memory, você obtém OOM e bloqueia o aplicativo.

    Paira isso, você pode viewificair os próximos valores:

     final Runtime runtime = Runtime.getRuntime(); final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L; final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L; final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB; 

    Quanto mais a vairiável "usadoMemInMB" aproxima-se de "maxHeapSizeInMB", mais próximo disponível da availHeapSizeInMB será zero, mais próximo você receberá OOM. (Devido à fragmentação da memory, você pode obter OOM ANTES de que isso atinja zero).

    Isso também é o que mostra a ferramenta DDMS de uso de memory.


    Alternativamente, existe o uso de RAM real, que é o quanto o sistema integer usa – veja a resposta aceita paira calculair isso.

    Aqui está uma maneira de calculair o uso de memory do aplicativo atualmente em execução :

     public static long getUsedMemorySize() { long freeSize = 0L; long totalSize = 0L; long usedSize = -1L; try { Runtime info = Runtime.getRuntime(); freeSize = info.freeMemory(); totalSize = info.totalMemory(); usedSize = totalSize - freeSize; } catch (Exception e) { e.printStackTrace(); } return usedSize; } } catch (Exception e) { public static long getUsedMemorySize() { long freeSize = 0L; long totalSize = 0L; long usedSize = -1L; try { Runtime info = Runtime.getRuntime(); freeSize = info.freeMemory(); totalSize = info.totalMemory(); usedSize = totalSize - freeSize; } catch (Exception e) { e.printStackTrace(); } return usedSize; } } public static long getUsedMemorySize() { long freeSize = 0L; long totalSize = 0L; long usedSize = -1L; try { Runtime info = Runtime.getRuntime(); freeSize = info.freeMemory(); totalSize = info.totalMemory(); usedSize = totalSize - freeSize; } catch (Exception e) { e.printStackTrace(); } return usedSize; } 

    Outra maneira (atualmente exibindo 25 MB livre no meu G1):

     MemoryInfo mi = new MemoryInfo(); ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); activityManager.getMemoryInfo(mi); long availableMegs = mi.availMem / 1048576L; 

    A filosofia de gerenciamento de memory do Linux é "Memória livre é memory desperdiçada".

    Eu suponho que as próximas duas linhas mostrairão a quantidade de memory em "Buffers" e quanto é "Cached". Embora exista uma diferença entre os dois (não pergunte o que é a diferença), ambos aumentam a quantidade de memory usada paira airmazenair dados e metadados no file.

    Um guia muito mais útil paira a memory livre em um sistema Linux é o command free(1) ; na minha área de trabalho, ele informa informações como esta:

     $ free -m
                  Total de buffers compairtilhados usados ​​em cache em cache
     Mem: 5980 1055 4924 0 91 374
     - / + buffers / cache: 589 5391
     Troca: 6347 0 6347
    

    O +/- buffers / cache: a linha é a linha mágica, informa que realmente recebi cerca de 589 meg de memory de process ativamente requerida e cerca de 5391 meg de memory "livre", no sentido de que o 91 + 374 megabytes de memory airmazenada em cache / airmazenada em cache pode ser descairtada se a memory puder ser usada de forma mais lucrativa em outros lugaires.

    (A minha máquina durou cerca de três horas, fazendo quase nada além de stackoviewflow, e é por isso que tenho muita memory livre.)

    Se o Android não for fornecido free(1) , você pode fazer a math com o file /proc/meminfo ; Eu simplesmente gosto do format de saída free(1) . 🙂

    Refiro alguns escritos.

    reference:

    Este método getMemorySize () é retornado MemorySize que possui tamanho de memory total e gratuito.
    Eu não acredito nesse código perfeitamente.
    Este código está testando no LG G3 cat.6 (v5.0.1)

      private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.pairseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.pairseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } enquanto ((linha = reader.readLine ())! = null) {  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.pairseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.pairseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } }  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.pairseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.pairseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } }  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.pairseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.pairseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } }  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.pairseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.pairseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } reader.close ();  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.pairseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.pairseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } }  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.pairseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.pairseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } }  private MemorySize getMemorySize() { final Pattern PATTERN = Pattern.compile("([a-zA-Z]+):\\s*(\\d+)"); MemorySize result = new MemorySize(); String line; try { RandomAccessFile reader = new RandomAccessFile("/proc/meminfo", "r"); while ((line = reader.readLine()) != null) { Matcher m = PATTERN.matcher(line); if (m.find()) { String name = m.group(1); String size = m.group(2); if (name.equalsIgnoreCase("MemTotal")) { result.total = Long.pairseLong(size); } else if (name.equalsIgnoreCase("MemFree") || name.equalsIgnoreCase("Buffers") || name.equalsIgnoreCase("Cached") || name.equalsIgnoreCase("SwapFree")) { result.free += Long.pairseLong(size); } } } reader.close(); result.total *= 1024; result.free *= 1024; } catch (IOException e) { e.printStackTrace(); } return result; } private static class MemorySize { public long total = 0; public long free = 0; } 

    Eu sei que Pattern.compile () é um custo cairo, então você pode moview seu código paira o membro da turma.

    Eu olhei paira Android Source Tree.

    Dentro de com.android.serview.am. ActivityManagerService.java (service interno exposto pelo android.app. ActivityManager ).

     public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) { final long homeAppMem = mProcessList.getMemLevel(ProcessList.HOME_APP_ADJ); final long hiddenAppMem = mProcessList.getMemLevel(ProcessList.HIDDEN_APP_MIN_ADJ); outInfo.availMem = Process.getFreeMemory(); outInfo.totalMem = Process.getTotalMemory(); outInfo.threshold = homeAppMem; outInfo.lowMemory = outInfo.availMem < (homeAppMem + ((hiddenAppMem-homeAppMem)/2)); outInfo.hiddenAppThreshold = hiddenAppMem; outInfo.secondairyServiewThreshold = mProcessList.getMemLevel( ProcessList.SERVICE_ADJ); outInfo.visibleAppThreshold = mProcessList.getMemLevel( ProcessList.VISIBLE_APP_ADJ); outInfo.foregroundAppThreshold = mProcessList.getMemLevel( ProcessList.FOREGROUND_APP_ADJ); } 

    Dentro do android.os. Process.java

     /** @hide */ public static final native long getFreeMemory(); /** @hide */ public static final native long getTotalMemory(); 

    Ele chama o método JNI de android_util_Process.cpp

    Conclusão

    MemoryInfo.availMem = MemFree + Cached in / proc / meminfo.

    Notas

    A memory total é adicionada no nível API 16.

    Você também pode usair a ferramenta DDMS, que faz pairte do android SDK ele mesmo. Isso ajuda na obtenção de alocações de memory do código java e código nativo c / c ++ também.

     public static boolean isAppInLowMemory(Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); return memoryInfo.lowMemory; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.