Problemas com consumo de memória ao usar JNI

2 respostas
G

Pessoal,

Tenho uma aplicação que acessa uma dll (C++) via JNI e essa dll acessa outra dll para realizar a validação de uma informação. É um processo que é muito utilizado e temos percebido que o garbage collector não libera memória após o uso.
Isso tem refletido intensamente na aplicação, já que a memória consumida cresce de forma proporcional ao uso do recurso.

Há alguma coisa que eu possa fazer para liberar memória?
No lado java eu não sei tanto o que pode ser feito, já que a chamada é bem simples. No lado C, já adicionei os métodos PushLocalFrame e PopLocalFrame mas sem sucesso. Tentei também usar o free() em algumas variáveis mas deu pau (não consegui descobrir o erro).

Alguém já teve algum tipo de experiência com esse problema? Alguma dica?

2 Respostas

ViniGodoy

Bem, no C++, tudo o que você cria com o new, você obrigatoriamente, tem que deletar com o delete. Tudo que você dá malloc (e você não deveria estar dando, já que usa C++), teria que liberar com free. Não existe garbage collector e um descuido pode ser fatal.

A melhor maneira de evitar isso, do lado do C++, é usando o conceito de RAII. Basicamente, se um recurso é alocado - e entenda por recurso qualquer coisa que precise ser desalocada depois, como memória, arquivos, sockets, conexões do BD, etc - alguma classe de gerência deve ser criada para administrar esse recurso, já durante a inicialização.

Um tipo simples e bastante utilizado de classe RAII são os smart pointers. A biblioteca boost disponibiliza uma série deles e, após usa-los, você se sente com uma espécie de garbage collector. O Bruno Sanches, fez uma série de artigos sobre eles, sendo o primeiro esse aqui.

J

ViniGodoy:
Bem, no C++, tudo o que você cria com o new, você obrigatoriamente, tem que deletar com o delete. Tudo que você dá malloc (e você não deveria estar dando, já que usa C++), teria que liberar com free. Não existe garbage collector e um descuido pode ser fatal.

A melhor maneira de evitar isso, do lado do C++, é usando o conceito de RAII. Basicamente, se um recurso é alocado - e entenda por recurso qualquer coisa que precise ser desalocada depois, como memória, arquivos, sockets, conexões do BD, etc - alguma classe de gerência deve ser criada para administrar esse recurso, já durante a inicialização.

Um tipo simples e bastante utilizado de classe RAII são os smart pointers. A biblioteca boost disponibiliza uma série deles e, após usa-los, você se sente com uma espécie de garbage collector. O Bruno Sanches, fez uma série de artigos sobre eles, sendo o primeiro esse aqui.

Esse conceito é realmente perfeito para uso. Se a vida do objeto termina, por causa do escopo, o destrutor é chamado e o remove da memória.

Criado 5 de novembro de 2009
Ultima resposta 6 de nov. de 2009
Respostas 2
Participantes 3