JVM - Java é Verboso Mesmo? Parte IV
Tags: beginners, java, jvm
Published: 2023-02-14 00:11:25

Fala dominadores (do Java, claro kkk)!
Sem muita delonga, vamos continuar nosso papo sobre a JVM !!! #partiu

Tivemos [aqui](https://dev.to/eguadorodrigo/jvm-java-e-verboso-mesmo-parte-iii-aquilo-que-ninguem-te-conta-ej9) o inicio das explicações da JVM e como ela procura trabalhar com o Java e hoje vamos dar seguimento a essa explicação.

## O subsistema de área de pilha (Stack area)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yfw21qpmbarwdhpxyyf7.png)

#### Área de método (Method area) 
Esta área na JVM é responsável por armazenar todos os métodos do escopo de uma classe, trazendo nosso exemplo da classe Programa, temos:

```
public class Programa{
	public static void main(String[] args){
		System.out.println("Hello Programa");
	}
}
```

O escopo de classe é tudo que está depois do colchete "{" após a palavra Programa até o fechamento deste escopo com o outro colchete ao contrário "}", então na nossa classe, podemos notar que só existe a declaração de um método, o método main. Então, na área de método, para o nosso exemplo, será disponibilizado em memória o método main, beleza?
Ah! vale lembrar que a área de método é um recurso compartilhado dentro da JVM e que só existe uma área por JVM, você não encontrará duas áreas de método dentro da mesma JVM, por tanto, fica ligado que neste exemplo, tinhamos apenas uma classe sendo enviada à JVM, um caso simples, mas há casos complexos onde a necessidade de analisar o que a JVM está recebendo é essencial pra entender se as classes estão fazendo a sua JVM trabalhar bem ou talvez um ajuste de código para otimizar o seu uso seja necessário, pois, dependemos de recursos de máquina, infraestrutura e sem um bom código infelizmente você precisará demandar muito mais poder de infra, memória, cpu, etc...

#### Área de empilhamento (Heap area)
Nesta área ficarão armazenados *todos os objetos e suas instancias correspondentes*. Importante lembrar que assim como a área anterior, a área de empilhamento (heap area) também é um recurso compartilhado que deve ser olhado com carinho, já que um código mal implementado por ocasionar estouro de pilha (que é quando não há mais espaço em memória para armazenar novos objetos, gerando exceções como _java.lang.OutOfMemoryError: Java heap space_)

#### Área de dados em tempo de execução (Stack area)
 Nesta área, vamos arranhar a superfície do conceito de *Threads*:

  * Threads - São criadas em decorrência de processos computacionais, por exemplo, quando um processo dentro de um computador precisa ser executado, aí nasce a thread. Toda vez que uma aplicação é aberta, é lançada uma thread dela mesma e a cada nova tarefa daquela aplicação, outra thread poderá ser criada...logo, quanto mais aplicações abertas você têm, mais sobrecarga você coloca sobre o processamento do seu equipamento.

Então como vimos acima, cada execução cria-se uma Thread e para cada execução alocada na memória damos o nome de Stack Frame. No Stack Frame todas as variáveis locais serão inicializadas, e também dizemos que é thread-safe, pois esse recurso, diferente dos anteriores não á um recurso compartilhado, ele é exclusivo daquela execução.
Dentro do Stack Frame temos ainda três subcategorias:
* Local Variable Array (LVA) - Corresponde a quantas variáveis locais estão envolvidas e seus respectivos valores serão armazenados aqui, no nosso exemplo:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oni2xq1f3btn4je1pxrh.png)

Na nossa classe, por ser simples, o método main pode ser representado por uma única referencia de LVA que pode ter de 0 até n entradas quando invocado;

* Operand Stack (OS) - É um recurso que entra em cena caso haja a necessidade de alguma operação intermediária para ser executada, o OS age como area de trabalho para realizar as operações demandadas.
Vamos alterar um pouco nossa classe para tentar exemplificar isso:

```
public class Programa{
	public static void main(String[] args){
		System.out.println("Hello Programa");
		System.out.println("O resultado da soma é: " + soma(2,3));
	}
	
	public static int soma(int a, int b){
		return a + b;
	}
		
}

```

Vejam que para que o segundo System.out.println seja possível, é necessário invocar um novo método que chamamos de *soma*, essa seria uma tentativa de exemplificar quando o OS entra em ação devido a necessidade de uma operação extra!

* Frame Data (FD) - O frame data é o carinha que agiliza as coisas na execução, é como se fosse um assistente de execução, ele fica de olho no pool da Stack Frame e consegue linkar as referencias de forma a agilizar aquela execução através de ponteiros de classe, interface, campos ou métodos.


#### PC Registradores (PC Registers) 
 Cada Thread terá seu próprio registrador que será responsável por armazenar o seu endereço, isso viabiliza a execução atual para ser realizada e prepara aquele endereço armazenado para a próxima execução que essa Thread necessitar fazer.

#### Pilha de método nativo (Native method stacks)
É uma pilha que guarda informações de métodos nativos para que quando houver uma nova execução (Thread), ela seja feita da maneira mais performática possível já tendo algumas informações (como métodos nativos) carregados e disponíveis para uso.



E por hoje é isso dominadores, cada vez mais mergulhando no que o Java pode nos oferecer, você tá satisfeito em ser só usuário? Vem nos comentários e me diz, fico mega feliz quando vejo vocês por aqui, um abraço e até a próxima!


Referências: 
* The JVM Architecture Explained - https://dzone.com/articles/jvm-architecture-explained
* How JVM Works – JVM Architecture? - https://www.geeksforgeeks.org/jvm-works-jvm-architecture/?ref=rp
* What are Threads in Computer Processor or CPU? -  https://www.geeksforgeeks.org/what-are-threads-in-computer-processor-or-cpu/?ref=gcse
* The Java Virtual Machine - https://www.artima.com/insidejvm/ed2/jvm8.html