Ver quantidade de memória gasta pelo objeto

Gente gostaria de saber se tem alguma maneira de medir a quantidade de memória gasta pelo objeto.
Outra coisa HashMaps consomem muita memória como dissem ?

Alguem já teve problema de usar muitos hashMaps ?

Use um profiler.

JMeter não te ajuda?

Ps:hahahahha…esses Lipe´s slogans são muito divertidos

Tem e não tem. Melhor usar um profiler mesmo. Ja tive problema por usar muitos Maps. Tive não, estou tendo, performance patética e uso de memoria absurdo são os problemas que a estou tentando resolver com kilos de gambiarras.

Isso para uma quantidade razoavel de dados, abaixo do do uso esperado pelos usuarios mais importantes. Pelo menos a culpa não é minha dessa presepada.

Depois dessa declaração nem preciso mesmo medir…

É melhor fazer um if
ex:


public Config getConfig(String name)
{
   if (name.equals("config1")
      return new Config1();
   else if (name.equals("config2")
      return new Config2();
   else if (name.equals("config3")
      return new Config3();
      // assim vai...
}

doque



public Config getConfig(String name)
{
    return (Config) map.get(name);
}

Não, montes de if´s é sinal de bacalhau. A solução com map é mais clara e rapida.

No meu caso tenho Maps usados no lugar de DTOs.

[quote=Rafael Nunes]
Ps:hahahahha…esses Lipe´s slogans são muito divertidos[/quote]

Muito bom esse site!!!

que comédia…

hehehehe

[quote=Rafael Nunes]JMeter não te ajuda?
[/quote]

Que eu saiba, JMeter serve para teste de carga. Se ele agora faz profile de aplicação Java, é novidade para mim.

Se não me engano, o Mister M já postou no blog um código em Java 1.4 que você conseguia determinar o tamanho de um objeto.

Mister M, cadê você? :smiley:

[]'s
Marco Campêlo

Artigo simples, mas interessante sobre o assunto:
http://www.javalobby.org/java/forums/t17871

Mas o problema seria o número de itens no Map, por que ele faz a varredura depois para consultar.
Nesse caso poderei ter 1000 ietns.

Agora um DTO o Map poder ter 10, 20 no máximo.

E qual o problema de ter um Map com 1000 itens?

Pegando o bonde pra não abrir outro tópico, já vi diversas vezes falarem mal de Map. Então eu pergunto: se Map são toscos, por que existem? O que usar no lugar de Maps quando eu preciso de Maps? As coisas que li sobre Map não falam nada de desempenho e consumo de memória.

O que voce “ouviu falarem mal de maps”, Renato? Performance e consumo de memoria nao sao exatamente preocupacoes aqui, e o problema do Louds eh que na app dele usaram maps no lugar de um modelo de negocios, ou de alguma representacao mais decente do que um monte de dados (que, no fim das contas, eh o que um Map eh).

Olá pessoal,

Mas como realmente medir a quantidade de memória que um
objeto usa??? Tipo o sizeof de C???

Tirei isso deste endereco
http://www.javapractices.com/Topic83.cjp

/**
 * Measures the approximate size of an object in memory, given a Class which
 * has a no-argument constructor.
 */
public final class Fernando {

    /**
     * First and only argument is the package-qualified name of a class
     * which has a no-argument constructor.
     */
    public static void main(String[] aArguments) {
        Class theClass = null;
        try {

            theClass = Class.forName("javax.swing.JFrame"); // substitua aqui por sua classe que voce quer testar
        } catch (Exception ex) {
            System.err.println("Cannot build a Class object");
            System.err.println("Use a package-qualified name, and check classpath.");
        }
        long size = Fernando.getObjectSize(theClass);
        System.out.println("Approximate size of " + theClass + " objects :" + size);
    }


    /**
     * Return the approximate size in bytes, and return zero if the class
     * has no default constructor.
     *
     * @param aClass refers to a class which has a no-argument constructor.
     */
    public static long getObjectSize(Class aClass) {
        long result = 0;

        //if the class does not have a no-argument constructor, then
        //inform the user and return 0.
        try {
            aClass.getConstructor(new Class[]{});
        } catch (NoSuchMethodException ex) {
            System.err.println(aClass + " does not have a no-argument constructor.");
            return result;
        }

        //this array will simply hold a bunch of references, such that
        //the objects cannot be garbage-collected
        Object[] objects = new Object[fSAMPLE_SIZE];

        //build a bunch of identical objects
        try {
            Object throwAway = aClass.newInstance();

            long startMemoryUse = getMemoryUse();
            for (int idx = 0; idx < objects.length; ++idx) {
                objects[idx] = aClass.newInstance();
            }
            long endMemoryUse = getMemoryUse();

            float approximateSize = (endMemoryUse - startMemoryUse) / 100f;
            result = Math.round(approximateSize);
        } catch (Exception ex) {
            System.err.println("Cannot create object using " + aClass);
        }
        return result;
    }

    /// PRIVATE ////
    private static int fSAMPLE_SIZE = 100;
    private static long fSLEEP_INTERVAL = 100;

    private static long getMemoryUse() {
        putOutTheGarbage();
        long totalMemory = Runtime.getRuntime().totalMemory();

        putOutTheGarbage();
        long freeMemory = Runtime.getRuntime().freeMemory();

        return (totalMemory - freeMemory);
    }

    private static void putOutTheGarbage() {
        collectGarbage();
        collectGarbage();
    }

    private static void collectGarbage() {
        try {
            System.gc();
            Thread.currentThread().sleep(fSLEEP_INTERVAL);
            System.runFinalization();
            Thread.currentThread().sleep(fSLEEP_INTERVAL);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

Aqui funcionou

[quote=louds]Ja tive problema por usar muitos Maps. Tive não, estou tendo, performance patética e uso de memoria absurdo são os problemas que a estou tentando resolver com kilos de gambiarras.
[/quote]

Ele não está falando mal de maps? Bom, eu sei que não é preocupação aqui. Então acha que é melhor não perguntar aqui? Acha melhor em outro tópico? Talvez não devesse abrir um tópico. O que acha?

Resumindo: posso usar Maps quando precisar sem me preocupar?

louds no caso vc teria um arrayList de hashmaps é isso ?

Galerinha, Maps são tabelas associativas que possuem N implementações diferentes. A mais comum é a HashMap, cuja implementação é baseada em uma tabela hash. Mas não é a única. Tem implementações usando, por exemplo, árvores Red-Black (aquelas em que operações de inserção/remoção/busca são feitas em O(log(n)) e otimizam o armazenamento de dados). Logo, usem de maneira correta a implementação de Map mais adequada pro seu problema. “Ahh, Daniel! Que papo chato! E como eu vou descobrir estas coisas?”. Fácil! Leia o Javadoc e aprenda estrutura de dados antes de programar feito um retardado (com duplo sentido embutido).