Stefan Horochovec
Possuo 20 anos de experiência no desenvolvimento de soluções web. Nos últimos 10 anos tenho atuado como Arquiteto de Soluções auxiliando empresas a desenvolver projetos para nuvem com um grande foco em Java EE como tecnologia voltada ao backend, Angular e React voltada ao frontend e Flutter voltado ao desenvolvimento móvel. Com relação a plataformas na nuvem, atuo com projetos consumindo serviços da AWS, Azure, e GCP.

Gerenciamento de Memória — Android

Olá pessoal!

Quero compartilhar com vocês que não puderam estar presente na Android Conference Brasil 2011 um pouco da minha palestra. Antes de mais nada, quero dizer para quem não foi, que perdeu um evento incrível. Tivemos palestras bastante interessantes, e mais uma vez, pude confirmar a quantia que o mercado mobile está crescendo. Não apenas em celulares vendidos, mas também do interesse dos desenvolvedores em entrar nessa plataforma..

O tema da minha palestra foi o gerenciamento de memória no Android, eu iniciei minha palestra falando sobre as diferenças de aparelhos que temos hoje no mercado, explicando que esse “problema” não passa de um desafio do desenvolvedor. O Android está presente em mais de 500 aparelhos diferentes, obviamente que existe uma grande variedade de hardware, por isso, devemos estar atentos em como gerenciamos nossos recursos, para evitarmos aplicações lentas e o desconforto com o usuário final.

O desenvolvimento mobile não é apenas “compilou, funcionou”, ou simplesmente testarmos nosso aplicativo em nossos poderosos smartphones (sim, desenvolvedor não gosta de ter aparelho “desatualizado”), devemos abrir os olhos que uma boa parte dos nossos usuários não possuem super smartphones e talvez seja esse um dos grandes motivos da enorme expansão da plataforma, já que encontramos em diversas lojas aparelhos Android custando R$ 400.00, isso com certeza influencia muitas pessoas na hora da compra.

Mas voltando a parte técnica, recentemente o Google anunciou o tão esperado Ice Cream Sandwich. Uma versão que unificou as versões entre celulares e tablets. Ponto para nós desenvolvedores, que podemos trabalhar com um único SDK para ambos os devices. Essa união resultou em um recurso novo para os celulares que já estava presente para os tablets, mas muito pouco explorado. Agora, é possível adicionarmos uma tag em nosso AndroidManifest.xml para aumentarmos o heap de memória de nossa aplicação. Mas o que é o heap de memória?

O Android é baseado em Linux, e cada uma de suas aplicações são executadas como um processo dentro do sistema operacional. Por ser um sistema que permite multi-tarefas, diversas aplicações são executadas ao mesmo tempo, com isso, o recurso para cada aplicação se torna limitado. Seguem alguns números sobre o heapSize de alguns aparelhos:

  • Google Nexus One: 196mb (16mb de heapSize);
  • Motorola Droid: 256mb (24mb de heapSize);
  • Motorola Xoom: 1gb (48mb de heapSize);

O que podemos perceber, é que nem sempre o heapSize acompanha o aumento significativo de memória ram que o aparelho recebe, obviamente que a diferença entre 16mb e 48mb é enorme quando falamos em heap de memória, entretanto, não é uma proporção exata esse crescimento.

O recurso de largeHeap é extremamente desaconselhável, não utilize se você não tem um grande conhecimento sobre o Android e sobre o Garbage Collector. Isso acontece porque com o aumento de memória de sua aplicação, o Garbage Collector irá trabalhar de forma diferente, e você terá que assumir alguns controles que hoje são automáticos em sua aplicação. Quanto maior o heap de memória, mais lento é o processo do Garbage Collector, com isso, ao invés de sua aplicação ficar mais rápida, irá acontecer exatamente o contrário, ela irá ficar mais lenta, afetando a performance do aparelho, portanto, só utilize caso tenha conhecimento de como trabalhar com o Garbage Collector, depois não diga que não foi avisado!

Enfim, vamos ao código. Para você aumentar o heap de memória, em seu AndroidManifest.xml adicione a seguinte configuração no atributo application, conforme abaixo:

android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true">

Com isso, sua aplicação já está habilitada para consumir mais memória. Você poderá testar isso em sua aplicação da seguinte forma:

ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);
am.getMemoryClass();
am.getLargeMemoryClass();

Com o método getMemoryClass(), você irá consultar o heap “normal” da sua aplicação, e com o método getLargeMemoryClass(), você irá consultar a sua memória já aumentada. Ambos retornar um int. Vale lembrar também, que caso você apenas adicione isso em um novo projeto apenas para testar, irá perceber que ambos retornaram um mesmo valor. Isso acontece porque o aumento da memória irá ocorrer apenas no momento em que for necessário, caso não seja, ele permanecerá o mesmo.

Esse é o primeiro post desta série que irei fazer sobre o gerenciamento de memória abordando os tópicos da minha palestra. O próximo assunto irei falar sobre o Garbage Collector.

Seguem os slides da minha palestra:

Um abraço!

Share

You may also like...

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *