Você está na página 1de 56

JVM

vs
GraalVM
@anabneri

Entenda o funcionamento e o que há de


melhor dessas Virtual Machines
Agenda:
Processos de Compilamento WTF is GraalVM?

O que a JVM faz... Exemplos

Arquitetura JVM Compatibilidade

Memória JVM ou GraalVM?

Compiladores
Hello ( );

Engenheira de Software no Itaú

Co-Organizadora da @unicorn.tech

Graduanda em ADS pela BandTec Digital School

Meu blog: https://anabneri.github.io/

@anabneri linkedln.com/in/anabeatrizdev/
But first WTF is Java?
GreenTalk

Star Seven

Oak

Web
Runner

Java!! o/
Processos de
compilamento antes da
Java Virtual Machine
Vamos entender o que é compilamento...

0101010101
0101010011
0100101010
Assembly 0101010101
0101010101
0100101010
Mas esse era um processo complexo demais...
Entendeu man? O
processo de
compilamento do Java
é parecido...
Observe a “sutil” diferença, rs

BYTECO
JAVA DE
JavaC
JVM
Isso Possibilita que uma gama de linguagens
possam ser rodadas na JVM
Isso quer dizer que JVM é uma linguagem
multi-plataforma, roda aonde quiser e quando quiser!!!
Entenda como essa parada
toda funciona, com a
arquitetura da JVM
Class loader
Class files subsystem

Native
Method Java PC
Heap Method
area stacks Registers
Stacks

Runtime data areas

Native Native
Execution
Method Methods
engine
Interface libraries
Claro que tudo isso é salvo
em algum lugar, entenda o
processo de memória
Espaço de
sobrevivencia

EDEN SO SO1 TENURED PERMANENT

Memória Memória
Nova Velha
(Young
Generation)
Espaço de
sobrevivencia tor
o llec
geC
a
Garb

EDEN SO SO1 TENURED PERMANENT

Memória Memória
Nova Velha
(Young
Generation)
Olha ai o Garbage Collector
EDEN

Young
Generation FROM
(NEW)
heap
Survivor
TO

Tenured
(OLD)
Permanet
Generation non-heap
Mas o que exatamente essas memórias significam?
Grupo Heap e Stack (non-heap)

Heap = Lugar onde Non-Heap =


os objetos com Armazenados
semântica e objetos curtos e de
referência são pouca duração, é
armazenados, e é uma área de
referenciado pelo tamanho fixo
Garbage Collector semelhante a uma
pilha.
Mas o que exatamente essas memórias significam?
Grupo Heap e Stack (non-heap)
Mas o que exatamente essas memórias significam?

HEAP STACK

Produto produto = new Produto


import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
import java.util.List;
import java.util.Locale;
public class Main {

public static int MEGA = 1024 * 1024;


public static String FORMAT = " (%.2fmb)";

….
}
//o intellij ja traz os imports automaticamente referente a
memória
MemoryMXBean memoryMXBean =
ManagementFactory.getMemoryMXBean();

out.println(":::::Memória heap:::::");
out.println();
MemoryUsage heapMemory =
memoryMXBean.getHeapMemoryUsage();
out.println("Tamanho Inicial :: " + heapMemory.getInit() +
String.format(Locale.US, FORMAT,(double) heapMemory.getInit() / MEGA));

out.println("Tamanho atual :: " +


heapMemory.getInit() +
String.format(Locale.US, FORMAT, (double) heapMemory.getCommitted()
/ MEGA));
out.println("Usado :: " +heapMemory.getUsed() +
String.format(Locale.US, FORMAT, (double) heapMemory.getUsed() / MEGA));
out.println("Máximo :: " + heapMemory.getMax() +
String.format(Locale.US, FORMAT, (double) heapMemory.getMax() / MEGA));
out.println();
out.println(":: Pool de memórias Organ. JVM ::");
out.println();
List<MemoryPoolMXBean> list =
ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean m :list) {

out.println("Nome do Pool :: " + m.getName());


out.println("Grupo ::" + m.getType());
out.println();
}
MemoryUsage usage = m.getUsage();
out.println("Inicial: " + usage.getInit() +
String.format(Locale.US, FORMAT, (double) usage.getInit() / MEGA));

out.println("Atual: " +usage.getCommitted() +


String.format(Locale.US, FORMAT, (double) usage.getCommitted() /
MEGA));
out.println("Usado: " + usage.getUsed() +
String.format(Locale.US, FORMAT, (double) usage.getUsed() / MEGA));
out.println("Máximo: " + usage.getMax() +
String.format(Locale.US, FORMAT, (double) usage.getMax() / MEGA));
out.println();
Vale lembrar que
as Strings
funcionam
diferente no Java
for (int i = 0; true; i++){
String str2 = (str + i).intern();
if (i % 100000 == 0) {
MemoryUsage mu = mp.getUsage();
System.out.println("PermGen inicial: " +
String.format(FORMAT, (double) mu.getInit() / MEGA) +
"commitada: " + String.format(FORMAT, (double)
mu.getCommitted() / MEGA) +
"utilizada: " + String.format(FORMAT, (double)
mu.getUsed() / MEGA) +
"Max: " + String.format(FORMAT, (double) mu.getMax() /
MEGA));
}
if ( i == 200000){
System.out.println("Retirar a referencia das Strings do
Pool" );
textos = new ArrayList();
}

textos.add(str2);
for (MemoryPoolMXBean m : lista){
if ((m.getType() == MemoryType.NON_HEAP)
&& m.getName().toUpperCase().indexOf("METASPACE")
!= -1){
mp = m;
break;
}
}
return mp;
Temos também os
Compiladores, que entram
dentro e fora da JVM
também
Os compiladores
Just in time - JIT
Revolução da JVM A otimização do JIT
faz a JVM ser cada vez
Faz compilação em mais rápida!
modo dinâmico

Verifica quantas vezes


o método esta sendo
executado
HotsPot - JVM
Esta dentro da JVM, é Utiliza 10% do tempo
como se fosse outra para compilar 90% do
VM dentro do java pra código
otimizar tempo

Utiliza 10% do tempo Os dados são obtidos


para compilar 90% do através da executção
código real do programa
Vamos ver toda essa lógica na prática!!!!!
E se eu disser pra vocês, que
tem como melhorar
E o GraalVM é Open Source!
Vamos entender o mundo do
open source
É poliglota
const express = require('express');
const app = express();
....
var text = 'Hello World!';
const BigInteger = Java.type(
'java.math.BigInteger');
text += BigInteger.valueOf(2)
.pow(100).toString(16);
text += Polyglot.eval(
'R', 'runif(100)')[0];
res.send(text);
})
É NATIVO
$ javac HelloWorld.java
$ time java HelloWorld
user 0.070s
$ native-image HelloWorld
$ time ./helloworld
user 0.005s
JVM OU GRAALVM QUAL É O MELHOR….
Sim eu sei, muita informação
Por que é importante você
saber essa parada toda...
> Diferencial no
mercado e na vida

> Profundidade =
excelência
> Argumentos pra quando
alguem diz que Java é ruim
CONCLUINDO <3
Dúvidas, questionamentos, críticas,
lamentações?
Keep in touch

Meu blog: https://anabneri.github.io/

@anabneri

linkedln.com/in/anabeatrizdev/

bit.ly/jvmgraalvm
referências
https://www.baeldung.com/java-stack-heap

https://pt.wikipedia.org/wiki/HotSpot

Livro: Mundo Java Efetivo – A casa do Código

https://blog.mandic.com.br/artigos/java-garbage-collection-m
elhores-praticas-tutoriais-e-muito-mais/

Você também pode gostar