1.JVM的主要组成部分及其作用?

两个子系统:类加载子系统、执行引擎

两个组件:运行时数据区、本地接口

(1)类加载子系统:根据给定的全限定名类名,来加载class文件到运行时数据区的方法区。

(2)执行引擎:执行classed中的指令。

(3)本地接口:与native libraries交互,是其他编程语言交互的接口。

(4)运行时数据区:JVM内存。

2.java程序的运行机制

编译器把java代码转换成字节码,类加载器把字节码加载到内存中,将其放在运行时数据区的方法区内,而字节码文件只是JVM的一套指令集规范,并不能交给底层操作系统去执行,因此需要特定的命令解析器执行引擎,将字节码翻译成底层系统指令,再交给CPU去执行,而这个过程需要调用其他语言的本地库接口来实现整个程序的功能。

3.JVM运行时数据区。

java虚拟机在执行java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。叫做JVM运行时数据区。

4.JVM运行时数据区的组成及作用?

(1)程序计数器:当前线程所执行的字节码的行号指示器。

(2)java虚拟机栈:服务于java方法的,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

(3)本地方法栈:服务于Native方法的。

(4)java堆:java虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存。

(5)方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码。

5.简述java垃圾回收机制(GC)。

在java中对象内存的释放是由虚拟机自行执行的,交给垃圾回收线程执行,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,对没有被任何引用的对象回收。有效的防止内存泄露,有效的使用可使用的内存。

6.怎么判断对象是否可以被回收?

(1)引用计数器法:当计数器为0时被回收。

(2)可达性分析算法:从GC Roots开始向下搜索。搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象是可以被回收的。

7.JVM有哪些垃圾回收算法?

(1)标记清除算法:标记无用对象,然后进行清除回收。缺点:效率不高、无法清除垃圾碎片。

(2)复制算法:按照容量划分两个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,是有原来的一半。

(3)标记整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉边界以外的内存。

(4)分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。

8.简述java类加载机制?

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。

9.什么是类加载器,类加载器有哪些?

通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。

(1)启动类加载器:用来加载java核心类库,无法被java程序直接引用。

(2)扩展类加载器:用来加载java的扩展库

(3)系统类加载器:根据java应用的类路径来加载java类。

(4)自定义加载器:继承java.lang.ClassLoader类的方式实现。

10.什么是双亲委派模型?

如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求时,子加载器才会尝试去加载。

11.说一下JVM调优的工具?

JDK的bin目录下,最常用的是jconsole和jvisualvm

12.常用的JVM调优的参数都有哪些?

-Xms2g:初始化堆大小为2g

-Xmx2g:堆最大内存为2g

-XX:NewRatio=4:设置年轻的和老年代的内存比例为1:4

--XX:+PrintGC:开启打印gc信息。