# JVM

JVM主要由类加载器,运行时数据区,执行引擎三部分组成。

# 一. 概述

在JAVA语言规范中,boolean类型的值只有两种,true和false 在JAVA虚拟机规范中,boolean类型被映射成int型。

执行每一条指令之前,Java 虚拟机要求该指令的操作数已被压入操作数栈中。在执行指令时,Java 虚拟机会将该指令所需的操作数弹出,并且将指令的结果重新压入栈中。

# 问题

# 1 为什么会有基本类型?

主要是工程上的考虑,因为使用基本类型能够在执行效率和内存使用两方面提升软件性能。

# 二、 经验

内存设置参数

-Xmx8g -Xms8g -Xmn2g -Xss1024k -XX:SurvivorRatio=8 
–XX:NewRatio=2 -XX:MaxMetaspaceSize=256m 

-XX:NewSize -XX:MaxNewSize
-XX:InitialHeapSize
-XX:MaxHeapSize

GC参数

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/home/gc.log -XX:-DisableExplicitGC 

-XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution

堆栈参数

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/dump.hprof -jar xxx.jar

# 三、 工具

jmap -dump:format=b,file=heap.hprof ${PID}
jmap -dump:live,format=b,file=heap.hprof ${PID}  # 会触发Full GC
jmap -histo:live ${PID} | head -20

# 三、类加载

java语言的类型分两大类

  • 基本类型(primitive types)
  • 引用类型(reference types)

引用类型可以分为四种

  • 接口
  • 数组类
  • 范性参数

范型参数在编译过程中被擦除,数组类由JVM生成,实际有字节流的只有类和接口。

java9 将扩展类加载器改为平台加载器,启动类加载器负责加载java.base模块,其他模块由平台加载器加载。


看一下自己虚拟机的参数列表

java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version | wc -l

当前的主流思路是这样子的,设计一个面向 Java 语言特性的虚 拟机,并通过编译器将 Java 程序转换成该虚拟机所能识别的指令序列,也称 Java 字节码。这 里顺便说一句,之所以这么取名,是因为 Java 字节码指令的操作码(opcode)被固定为一个字 节。

从虚拟机视角来看,执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机 中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法 区内的代码。

Java 虚拟机会将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C++ 写的 native 方法)的本地方法栈,以及存放各个线程执行位置的 PC 寄存器。

mQxl8O.jpg

在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成 一个栈帧,用以存放局部变量以及字节码的操作数