Java面试总结之JVM

开发者之家

2019-05-05 22:34
关注

对于Java程序员来说,JVM是面试过程中必备考题之一,只要我们掌握了其核心知识点,万变不离其中,无论怎么考你,都能应对自如。这篇文章我会根据在实际面试过程中遇到的考题,然后结合理论知识点,总结一下JVM的实战考点。

Java Virtual Machine

一、JVM总体知识点

JVM的考点总体为分4大块:

1.类的加载机制

2.JVM的内存结构

3.GC(包括GC算法,垃圾回收器)

4.JVM调优化

下面就这4方面的知识点分别进行归纳总结。

二、类的加载机制

类的加载过程是指将java编译之后的class文件读入到内存中,然后在堆区创建一个java.lang.Class对象,用于封装类在方法区内的数据结构。类加载的最终目的是封装类在方法区的数据结构,并向java程序员提供访问方法区数据的接口。

这里要理解类的加载过程就要先了解一下类的生命周期:

类的生命周期

类的生命周期一共分为5个阶段,加载、连接、初始化、使用、卸载。

加载:类的加载过程主要完成3件事件,1.通过类的全限定名来获取定义此类的二进制字节流,2.将这个类字节流代表的静态存储结构转为方法区的运行时数据结构,3.在堆中生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口。这个过程主要是类加载器完成的。

连接:这个过程分3个阶段(校验,准备,解析)完成。首先是校验,此阶段主要校验class文件包含的信息是否符合jvm的规范。具体的校验通过对文件格式,元数据,字节码,符号引用验证来完成。然后是准备,此阶段为类变量分配内存,并将其初始化为默认值。最后是解析,即把类型中的符号引用转换成为直接引用。具体的解析有4种,1.类或接口的解析,2.字段解析,3.类方法解析,4.接口方法解析。完成这3个阶段就完成了类的连接。

初始化:即执行类的构造器方法的过程。有5种方法可以完成初始化:1.调用new方法,2.使用Class类的newInstance方法(反射机制),3.使用Constructor类的newInstance方法(反射机制),4.使用Clone方法创建对象,5.使用(反)序列化机制创建对象

使用:完成类的初始化后,就可以对类进行实例化,在程序中进行使用了

卸载:当类被加载,连接和初始化后,它的生命周期就始了,当代表类的class对象不在被引用时,class对象就会结束生命周期,类在方法区内的数据就会被卸载。因此一个类何时结束生命,取决于代表它的class对象何时结束生命。

二、JVM的内存结构

JVM内存结构

Java中的内存分配:

Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

具体划分为如下5个内存空间:(非常重要)

栈:存放局部变量

堆:存放所有new出来的东西

方法区:被虚拟机加载的类信息、常量、静态常量等。

程序计数器(和系统相关)

本地方法栈

通常在面试中会围绕这5个空间展开

三、GC算法及垃圾回收器

常见的垃圾回收算法:标记-清除,复制,标记-压缩,分代收集

常用的垃圾回收集器:Serial收集器,ParNew收集器,Paralle收集器,Paralle Old收集器,Cms收集器,G1收集器

在实际应用中,我们可以根据不同的应用需求及服务器的配置来配置相应的垃圾回收器。

四、JVM调优

jvm调优没有一个固定模板配置说必须如何操作,它需要根据系统的情况不同对待。

但是可以有如下建议:

1、初始化内存和最大内存尽量保持一致,避免内存不够用继续扩充内存。最大内存不要超过物理内存,例如内存8g,你可以设置最大内存4g/6g但是不能超过8g否则加载类的时候没有空间会报错。

2、gc/full gc频率不要太高、每次gc时间不要太长、根据系统应用来定。

常用调优工具:

jps:查看所有的jvm进程,包括进程ID,进程启动的路径等等。

jstack:观察jvm中当前所有线程的运行情况和线程当前状态。

jstat:利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;

jmap:监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;

jinfo:观察进程运行环境参数,包括Java System属性和JVM命令行参数。

五:JVM常会问的面试题

jvm的初始化步骤?类的加载过程jvm的内存结构?每块内存分别存的什么信息双亲委派模型GC算法,如何调优FULL GC的条件

举报/反馈