1.基础概念
1、程序语言类型
分为编译型和解释型程序语言。编译型语言是指在特定平台上编译器将代码直接编译成机器平台上能够执行代码,如C++。解释型语言是指在特定平台上能通过解释器边解释边执行代码,如JavaScript。而Java呢?Java是编译型+解释型的编程语言,当然不是因为Java源代码需要javac编译器将源文件编译成class文件。更多的是因为类文件需要通过JVM来翻译才能在各种平台上运行,而翻译的过程包括编译和解释,当然更多的是解释。
2、JVM、jdk和jre之间的关系
jdk是java develop kit,指的是Java开发包,里面呢包含了jre和各种组件如javac编译器等。而jre是java运行时库,也包含了底层的Java虚拟机。
2.JVM工作流程、结构和垃圾回收机制
1、流程
源代码通过javac编译器编译成class文件,然后通过类加载器将类文件加载到Java虚拟机内存当中(经过装载、链接和初始化过程),再通过一系列的翻译动作翻译成各平台上能够进行执行的代码。
2、结构
JVM内存结构主要由方法区、堆、Java虚拟栈、原生方法栈以及程序计数器组成。方法区主要存储静态变量、常量以及类信息。堆主要存储对象和数组,是jvm内存中最大的一块。堆和方法区是线程共享的。Java虚拟栈是线程私有的,一个线程调用的方法分别以栈帧的形式压入栈中,一个栈帧包含局部变量、方法返回地址等信息。本地方法栈和Java虚拟栈一样,但是存入的是原生方法。
3、内存模型
Minor GC新生代垃圾回收。
Morjor GC老年代垃圾回收。
FullGC 新生代+老年代垃圾回收。
Morjor GC一般也会进行Minor GC。
为避免老年代内存占用太满,在新生代分成伊甸园Eden区和Survivor区,执行Minor GC存活的对象会放在存活区,如果16次Minor GC后对象仍存活则放在老年区。这样避免老年代内存使用增长过快导致性能下降的问题。
4、垃圾回收机制
一般有两种算法。一种是通过计数器实现,一种是通过指针实现。通过计数器计算对象被引用的次数,如果为0则为等待回收的垃圾。通过指针是否有被GC root对象直接或间接指向来判断对象是否为等待回收的垃圾。
3.JVM调优
一般有程序代码和非代码的调优。代码调优主要是减少循环和冗余代码。非代码调优如内存、GC以及cpu等层面的调优,通过修改相关的JVM参数达到调优的效果。