# 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 寄存器。

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