1. 什么是 JVM?它有什么作用?
JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,顾名思义它是一个虚构计算机,也是 Java 程序可能实现跨平台的根底。它的作用是加载 Java 程序,把字节码翻译成机器码再交由 CPU 执行的一个虚构计算器。
2. 介绍一下类的生命周期
类的生命周期包含:加载 (Loading)、验证(Verification)、筹备(Preparation)、解析(Resolution)、初始化(Initialization)、应用(Using) 和卸载 (Unloading) 共 7 个阶段(验证、筹备、解析 3 个局部统称为连贯)。其中,加载、验证、筹备、初始化、卸载这 5 个阶段的程序是确定的,而解析阶段则不肯定,它在某些状况下能够在初始化实现后在开始,这是为了反对 Java 语言的运行时绑定。其中加载、验证、筹备、解析及初始化是属于类加载机制中的步骤。
3.JVM 的永恒代中会产生垃圾回收么?
垃圾回收不会产生在永恒代,如果永恒代满了或者是超过了临界值,会触发齐全垃圾回收(Full GC)。如果你认真查看垃圾收集器的输入信息,就会发现永恒代也是被回收的。这就是为什么正确的永恒代大小对防止 Full GC 是十分重要的起因。请参考下 Java8:从永恒代到元数据区 (注:Java8 中曾经移除了永恒代,新加了一个叫做元数据区的 native 内存区)。
4.Java 类加载的过程是什么?
Java 类加载须要经验一下几个过程:
(1) 加载:加载时类加载的第一个过程,在这个阶段,将实现一下三件事件:
a. 通过一个类的全限定名获取该类的二进制流。
b. 将该二进制流中的动态存储构造转化为办法去运行时数据结构。
c. 在内存中生成该类的 Class 对象,作为该类的数据拜访入口。
(2) 验证:验证的目标是为了确保 Class 文件的字节流中的信息不回危害到虚拟机. 在该阶段次要实现以下四钟验证
a. 文件格式验证:验证字节流是否合乎 Class 文件的标准,如主次版本号是否在以后虚拟机范畴内,常量池中的常量是否有不被反对的类型。
b. 元数据验证: 对字节码形容的信息进行语义剖析,如这个类是否有父类,是否集成了不被继承的类等。
c. 字节码验证:是整个验证过程中最简单的一个阶段,通过验证数据流和控制流的剖析,确定程序语义是否正确,次要针对办法体的验证。如:办法中的类型转换是否正确,跳转指令是否正确等。
d. 符号援用验证:这个动作在前面的解析过程中产生,次要是为了确保解析动作能正确执行。
e. 筹备:
筹备阶段是为类的动态变量分配内存并将其初始化为默认值,这些内存都将在办法区中进行调配。筹备阶段不调配类中的实例变量的内存,实例变量将会在对象实例化时随着对象一起调配在 Java 堆中。
(3)解析:该阶段次要实现符号援用到间接援用的转换动作。解析动作并不一定在初始化动作实现之前,也有可能在初始化之后。
(4)初始化:初始化时类加载的最初一步,后面的类加载过程,除了在加载阶段用户应用程序能够通过自定义类加载器参加之外,其余动作齐全由虚拟机主导和管制。到了初始化阶段,才真正开始执行类中定义的 Java 程序代码。
5. 内存溢出和内存透露的区别是什么?
内存溢出和内存透露的区别如下:
(1)内存溢出是指程序申请内存时,没有足够的内存,就会报错 OutOfMemory。
(2)内存透露是指垃圾对象无奈回收,能够应用 Memory Analyzer 等工具排出内存透露。
6. 罕用 GC 调优策略有哪些?
策略 1:将新对象预留在新生代,因为 Full GC 的老本远高于 Minor GC,因而尽可能将对象调配在新生代是理智的做法,理论我的项目中依据 GC 日志剖析新生代空间大小调配是否正当,适当通过“-Xmn”命令调节新生代大小,最大限度升高新对象间接进入老年代的状况。
策略 2:大对象进入老年代,尽管大部分状况下,将对象调配在新生代是正当的。然而对于大对象这种做法却值得商讨,大对象如果首次在新生代调配可能会呈现空间有余导致很多年龄不够的小对象被调配的老年代,毁坏新生代的对象构造,可能会呈现频繁的 full gc。因而,对于大对象,能够设置间接进入老年代(当然长寿的大对象对于垃圾回收来说几乎就是噩梦)。
-XX:PretenureSizeThreshold 能够设置间接进入老年代的对象大小。
策略 3:正当设置进入老年代对象的年龄,-XX:MaxTenuringThreshold 设置对象进入老年代的年龄大小,缩小老年代的内存占用,升高 full gc 产生的频率。
策略 4:设置稳固的堆大小,堆大小设置有两个参数:-Xms 初始化堆大小,-Xmx 最大堆大小。
策略 5:留神:如果满足上面的指标,则个别不须要进行 GC 优化。
MinorGC 执行工夫不到 50ms;Minor GC 执行不频繁,约 10 秒一次;Full GC 执行工夫不到 1s; Full GC 执行频率不算频繁,不低于 10 分钟 1 次。
7.JVM 调优的工具有哪些?
JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最罕用的是 jconsole 和 jvisualvm 这两款视图监控工具。
jconsole:Java Monitoring and Management Console 是从 java5 开始,在 JDK 中自带的 java 监控和治理控制台,用于对 JVM 中内存,线程和类等的监控。
jvisualvm:jdk 自带全能工具,能够剖析内存快照、线程快照; 监控内存变动、GC 变动等。
8. 类加载器的工作原理是什么?
Java 类加载器的作用就是在运行时加载类。Java 类加载器基于三个机制:委托、可见性和单一性。委托机制是指将加载一个类的申请交给父类加载器,如果这个父类加载器不可能找到或者加载这个类,那么再加载它。可见性的原理是子类的加载器能够看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。正确理解类加载器可能帮你解决 NoClassDefFoundError 和 java.lang.ClassNotFoundException,因为它们和类的加载相干。类加载器通常也是比拟高级的 Java 面试中的重要考题,Java 类加载器和工作原理以及 classpath 如何运作的常常被问到。Java 面试题中也经常出现“一个类是否能被两个不同类加载器加载”这样的问题。
本文由博客群发一文多发等经营工具平台 OpenWrite 公布