GERENCIAMENTO DE MEMÓRIA EM JAVA ALUNOS: ANTÔNIO FLÁVIO(in memorian) E HEDLEY LUNA ORGANIZAÇÃO • Alocação de memória em java • Windows – RESULTADOS JAVA – RESULTADOS C++ – COMPARAÇÃO JAVA X C++ • LINUX – RESULTADOS JAVA – RESULTADOS C++ – COMPARAÇÃO JAVA X C++ • COMPARAÇÃO LINUX X WINDOWS • CONCLUSÕES MOTIVAÇÃO • BRIGAS C++ X JAVA • BRIGAS WINDOWS X LINUX • BRIGAS SOFTWARE LIVRE X SOFTWARE PROPRIETÁRIO INTRODUÇÃO AO GERENCIAMENTO DE MEMÓRIA EM JAVA • A GERÊNCIA PROPRIAMENTE DITA É “ESCONDIDA” DO PROGRAMADOR. • QUEM GERENCIA TODA A MEMÓRIA É A JVM. • SE O PROGRAMADOR QUISER(OU PRECISAR) SABER COMO A MEMÓRIA ESTÁ SENDO ALOCADA ELE PODE USAR O COMANDO: • javap –c nomeDaClasse IMAGEM ARQUITETURA DA JVM INTRODUÇÃO AO GERENCIAMENTO DE MEMÓRIA EM JAVA • EM JAVA, ASSIM COMO EM OUTRAS LINGUAGENS, A MEMÓRIA DINÂMICA FICA NO HEAP, E A ESTÁTICA(LINEAR) NA STACK. • CADA THREAD TEM SEU PRÓPRIO PC(PROGRAM COUNTER) DENTRO DA JVM, E ESSE PC É ATUALIZADO A CADA INSTRUÇÃO DO BYTECODE. IMAGEM PROGRAM COUNTER IMAGEM HEAP INTRUDUÇÃO AO GERENCIAMENTO DE MEMÓRIA EM JAVA • COM EXCEÇÃO DA CLASSE STRING, TODAS AS OUTRAS INSTANCIAÇÕES PRECISAM DO “new” OU DO “newInstance()”. • ASSIM COMO C++, JAVA TAMBÉM TEM DESTRUTOR! • NO JAVA TAMBÉM EXISTEM MEMORY LEAKS, APESAR DA JVM. • A DESALOCAÇÃO DE MEMÓRIA É FEITA ATRAVÉS DO GARBAGE COLLECTOR. IMAGEM CRIAÇÃO DE OBJETO IMAGEM DESALOCAÇÃO DE OBJETO INTRODUÇÃO AO GERENCIAMENTO DE MEMÓRIA EM JAVA • ALGORITMOS DE GARBAGE COLLECTION: – REFERENCE COUNTING ALGORITHM – CYCLE COLLECTING ALGORITHM. • VANTAGENS: – DIMINUI MEMORY LEAKS – DIMINUI SEGMENTATION FAULTS • DESVANTAGENS: – ROTINAS DE GC GERALMENTE SÃO PESADAS – DIMINUIÇÃO DA EFICIÊNCIA JAVA • WINDOWS CÓDIGO DO VETOR ESTÁTICO • public class VetorEstatico { • • • • • • • • • • public static void main(String[] args) { int []vetor = new int [10000]; int y = 200; while(y>=0){ for(int i=0;i<vetor.length;i++){ vetor[i]=0; } y--; } } • } GRÁFICO VETOR ESTÁTICO JAVA WINDOWS Relação QxT do Vetor Estático em Java / Windows 1000 Tempo (ms) 100 10 1 VETOR ESTÁTICO 0.1 0.01 Quantidade CÓDIGO DO VETOR DINÂMICO(ARRAYLIST) • • import java.util.ArrayList; import java.util.List; • public class VetorDinamicoArrayList{ • • • • • • • • • • public static void main(String[] args) { List<Integer> lista = new ArrayList<Integer>(); int y = 200; while(y>=0){ for(int i=0;i<lista.size();i++){ lista.add(0); } y--; } } • } FORMA NÃO OTIMIZADA GRÁFICO VETOR DINÂMICO(ARRAYLIST) JAVA - WINDOWS Relação QxT do Vetor Dinâmico em Java / Windows 1000 Tempo (ms) 100 Vetor Dinâmico(ArrayList) 10 1 Quantidade CÓDIGO VETOR DINÂMICO(VECTOR) • • import java.util.List; import java.util.Vector; • public class VetorDinamicoVector{ • • • • • • • • • • public static void main(String[] args) { List<Integer> lista = new Vector<Integer>(); int y = 200; while(y>=0){ for(int i=0;i<lista.size();i++){ lista.add(0); } y--; } } • } FORMA NÃO OTIMIZADA GRÁFICO VETOR DINÂMICO(VECTOR) JAVA - WINDOWS Relação QxT do Vetor Dinâmico em Java / Windows 1000 Tempo (ms) 100 VETOR DINÂMICO(VECTOR) 10 1 Quantidade CÓDIGO LISTA ENCADEADA • import java.util.LinkedList; • public class ListaEncadeada{ • • • • • • • • • public static void main(String[] args) { LinkedList<Integer> lista = new LinkedList<Integer>(); int y = 200; while(y>=0){ for(int i=0;i<lista.size();i++){ lista.add(0); } y--; } } • } GRÁFICO LISTA ENCADEADA JAVA WINDOWS Relação QxT da Lista Encadeada em Java / Windows Tempo (ms) 1000 100 Lista Encadeada 10 1 Quantidade GRÁFICO COMPARATIVO ESTRUTURAS EM JAVA - WINDOWS Comparativo entre as Estruturas 3,83x(média) 300 30 LISTA ENCADEADA Tempo (ms) 1098x(média) VETOR DINÂMICO(ARRAYLIST) 3 VETOR DINÂMICO(VECTOR) 495x(média) VETOR ESTÁTICO 0.3 0.03 Quantidade C++ • WINDOWS CÓDIGO VETOR ESTÁTICO • #include<iostream> • • • • • • • • • • • • • int main() { int vetor[1000]; int y = 200; while(y>=0) { for(int i=0;i<1000;i++) { vetor[i]=0; } y--; } } GRÁFICO VETOR ESTÁTICO C++ WINDOWS Relação QxT do Vetor estático em C++/Windows Tempo (ms) 1 0.1 Vetor Estático 0.01 0.001 Quantidade CÓDIGO VETOR DINÂMICO • #include<iostream> • • • • • • • • • • • • • int main() { int *vetor = new int[10000]; int y = 200; while(y>=0) { for(int i=0;i<10000;i++) { vetor[i]=0; } y--; } } GRÁFICO VETOR DINÂMICO C++ WINDOWS Relação QxT do Vetor Dinâmico em C++/Windows 1000 Tempo (ms) 100 10 1 VETOR DINÂMICO 0.1 0.01 0.001 Quantidade CÓDIGO LISTA ENCADEADA • • • • • • • • • • • • • • • • void add(const T &x, bool no_fim=true) { nodo *q = new nodo(x); if (cnt==0) ptraiz=q; else { if (no_fim) { nodo *p = ptraiz; while (p->prox!=0) p=p->prox; p->prox=q; } else { q->prox = ptraiz; ptraiz = q; } } cnt++; } LISTA ENCADEADA C++ - WINDOWS Relação QxT da Lista Encadeada em C++/Windows 1000 Tempo (ms) 100 Lista Encadeada 10 1 Quantidade GRÁFICO COMPARATIVO ESTRUTURAS C++ - WINDOWS Comparativo entre as Estruturas 100 10 LISTA ENCADEADA 436x(média) Tempo (ms) 1241x(média) VETOR DINÂMICO VETOR ESTÁTICO 1 2,84x(média) 0.1 0.01 0.001 10^4 2*10^4 3*10^4 4*10^4 5*10^4 6*10^4 Quantidade 7*10^4 8*10~4 9*10^4 10^5 JAVA LINUX CÓDIGO VETOR ESTÁTICO • public class VetorEstatico { • • • • • • • • • • public static void main(String[] args) { int []vetor = new int [10000]; int y = 200; while(y>=0){ for(int i=0;i<vetor.length;i++){ vetor[i]=0; } y--; } } • } VETOR ESTÁTICO JAVA - LINUX Relação QxT do Vetor Estático em Java / Windows 1000 Tempo (ms) 100 10 Vetor Estático 1 0.1 Quantidade CÓDIGO VETOR DINÂMICO(ARRAYLIST) • • import java.util.ArrayList; import java.util.List; • public class VetorDinamicoArrayList{ • • • • • • • • • • public static void main(String[] args) { List<Integer> lista = new ArrayList<Integer>(); int y = 200; while(y>=0){ for(int i=0;i<lista.size();i++){ lista.add(0); } y--; } } • } FORMA NÃO OTIMIZADA VETOR DINÂMICO(ARRAYLIST) JAVA LINUX Relação QxT do Vetor Dinâmico em Java / Windows 1000 Tempo (ms) 100 Vetor Dinâmico(ArrayList) 10 1 Quantidade CÓDIGO VETOR DINÂMICO(VECTOR) • • import java.util.List; import java.util.Vector; • public class VetorDinamicoVector{ • • • • • • • • • • public static void main(String[] args) { List<Integer> lista = new Vector<Integer>(); int y = 200; while(y>=0){ for(int i=0;i<lista.size();i++){ lista.add(0); } y--; } } • } FORMA NÃO OTIMIZADA VETOR DINÂMICO(VECTOR) JAVA LINUX Relação QxT do Vetor Dinâmico em Java / Linux 1000 Tempo (ms) 100 Vetor Dinâmico(Vector) 10 1 Quantidade CÓDIGO LISTA ENCADEADA • import java.util.LinkedList; • public class ListaEncadeada{ • • • • • • • • • public static void main(String[] args) { LinkedList<Integer> lista = new LinkedList<Integer>(); int y = 200; while(y>=0){ for(int i=0;i<lista.size();i++){ lista.add(0); } y--; } } • } LISTA ENCADEADA JAVA - LINUX Relação QxT da Lista Encadeada em Java/ Linux 10000 Tempo (ms) 1000 100 Lista Encadeada 10 1 Quantidade COMPARATIVO ENTRE ESTRUTURAS LINUX Comparativo entre as Estruturas em Java/ Linux 10000 1000 4x(média) Tempo (ms) Lista Encadeada 100 Vetor Dinâmico(Vector) 1030x(média) 10 268x(média) 1 0.1 Quantidade Vetor Dinâmico(ArrayList) Vetor Estático C++ LINUX CÓDIGO VETOR ESTÁTICO C++ - LINUX • #include<iostream> • • • • • • • • • • • • • int main(int argc,char []argv) { int vetor[10000];; int y = 200; while(y>=0) { for(int i=0;i<10000;i++) { vetor[i]=0; } y--; } } VETOR ESTÁTICO C++ - LINUX Relação Q x T do Vetor Estático em C++/Linux 10 Tempo (ms) 1 Vetor Estático 0.1 0.01 Quantidade CÓDIGO VETOR DINÂMICO C++ LINUX • #include<iostream> • • • • • • • • • • • • • int main(int argc,char []argv) { int *vetor = new int[10000]; int y = 200; while(y>=0) { for(int i=0;i<10000;i++) { vetor[i]=0; } y--; } } VETOR DINÂMICO C++ - LINUX Relação QxT do Vetor Dinâmico em C++/Linux 10000 Tempo (ms) 100 Vetor Dinâmico 1 0.01 Quantidade CÓDIGO LISTA ENCADEADA C++ LINUX • • • • • • • • • • • • • • • • • void add(const T &x, bool no_fim=true) { nodo *q = new nodo(x); if (cnt==0) ptraiz=q; else { if (no_fim) { nodo *p = ptraiz; while (p->prox!=0) p=p->prox; p->prox=q; } else { q->prox = ptraiz; ptraiz = q; } } cnt++; } bool del(const Quantidade 4*10^6 3*10^6 2*10^6 10^6 9*10^5 8*10^5 7*10^5 6*10^5 5*10^5 4*10^5 3*10^5 2*10^5 10^5 9*10^4 8*10~4 7*10^4 6*10^4 5*10^4 4*10^4 3*10^4 2*10^4 10^4 Tempo (ms) LISTA ENCADEADA C++ - LINUX Relação QxT de Lista Encadeada em C++/Linux 1000 100 10 Lista Encadeada 1 COMPARATIVO ENTRE ESTRUTURAS C++ - LINUX Comparativo entre as Estruturas em C++/Linux 1000 100 21x(média) Tempo (ms) 27x(média) 10 25%(média) 1 0.1 0.01 Lista Encadeada Vetor Dinâmico Quantidade Vetor Estático • • JAVA X C++ Comparativos Windows • VETOR ESTÁTICO • VETOR DINÂMICO(ARRAYLIST) • LISTA ENCADEADA JAVA X C++ - VETOR ESTÁTICO WINDOWS Comparação entre Vetor Estático C++ versus Vetor Estático Java Windows Tempo (ms) 1 C++ 2x mais rápido 0.1 Vetor Estático C++ 0.01 Vetor Estático Java 0.001 10^4 2*10^4 3*10^4 4*10^4 5*10^4 6*10^4 Quantidade 7*10^4 8*10~4 9*10^4 10^5 JAVA X C++ - VETOR DINÂMICOWINDOWS Comparação entre Vetor Dinâmico Java versus Vetor Dinâmico C++ Windows 1000 100 167x(média) Tempo (ms) 10 1 0.1 Vetor Dinâmico Java 0.01 Vetor Dinâmico C++ 0.001 Quantidade JAVA X C++ - LISTA ENCADEADA WINDOWS Comparativo entre as Listas Encadeadas em Java e C++ / Windows 1000 Tempo (ms) 16%(média) 100 LISTA ENCADEADA - JAVA LISTA ENCADEADA - C++ 10 1 Quantidade COMPARATIVOS LINUX • VETOR ESTÁTICO • VETOR DINÂMICO(ARRAYLIST) • LISTA ENCADEADA JAVA X C++ - VETOR ESTÁTICO - LINUX Comparação entre Vetor Estático Java versus Vetor Estático C++ 10 4x(média) Tempo (ms) 1 Vetor Estático C++ Vetor Estático Java 0.1 0.01 Quantidade JAVA X C++ - VETOR DINÂMICO - LINUX Comparação entre Vetor Dinâmico Java versus Vetor Dinâmico C++ 1000 100 Tempo (ms) 49x(média) 10 Vetor Dinâmico Java 1 Vetor Dinâmico C++ 0.1 0.01 Quantidade JAVA X C++ - LISTA ENCADEADA LINUX Comparativo entre as Listas Encadeadas em Java e C++ / Linux 10000 1000 Tempo (ms) 8x(média) 100 10 LISTA ENCADEADA - JAVA LISTA ENCADEADA - C++ 1 Quantidade WINDOWS X LINUX COMPARATIVO WINDOWS X LINUX Comparativo entre as Listas Encadeadas em Java / Windows x Linux 1000 Tempo (ms) 16%(média) -Windows 100 10 LISTA ENCADEADA JAVA - WINDOWS LISTA ENCADEADA JAVA - LINUX 1 Quantidade • PERGUNTAS?!!!