刚从京东面试回来,我才知道这些JVM知识有多重要

面试题
关于JVM的知识之前也写过相关的文章整理,但是从京东面试后,才发现这些JVM的知识点尤为重要,所以特意整理出来以供大家参考。
1.什么是类的加载?
2.哪些情况会触发类的加载?
3.讲一下JVM加载一个类的过程
4.什么时候会为变量分配内存?
5.JVM的类加载机制是什么?
6.双亲委派机制可以打破吗?为什么
答案放在文章的最后,来不及看原理也可以直接跳到最后直接看答案。
深入原理
类的生命周期
类的生命周期相信大家已经耳熟能详,就像下面这样:

不过这东西总是背了就忘,忘了又背,就像马什么梅一样,对吧?
其实理解之后,基本上就不会再忘了。
加载
加载主要做三件事:
1.找到类文件(通过类的全限定名来获取定义此类的二进制字节流)
2.放入方法区(将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构)
3.开个入口(生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口)
总的来讲,这一步就是通过类加载器把类读入内存。需要注意的是,第三步虽然生成了对象,但并不在堆里,而是在方法区里。
连接
连接分为三步,一般面试都比较喜欢问准备这一步。
校验
顾名思义,检查Class文件的字节流中包含的信息是否符合当前虚拟机的要求。
准备
这一步中将为静态变量和静态常量分配内存,并赋值。
需要注意的是,静态变量只会给默认值。比如下面这个:
public static int value = 123;
此时赋给value的值是0,不是123。
静态常量(static final修饰的)则会直接赋值。比如下面这个:
public static final int value = 123;
此时赋给value的值是123。
解析
解析阶段就是jvm将常量池的符号引用替换为直接引用。
恩......啥是常量池?啥是符号引用?啥是直接引用?
常量池我们放在jvm内存结构里说。先来说下什么是符号引用和直接引用。
符号引用和直接引用
假设有一个Worker类,包含了一个Car类的run()方法,像下面这样:
class Worker{
......
public void gotoWork(){
car.run(); //这段代码在Worker类中的二进制表示为符号引用
}
......
}
在解析阶段之前,Worker类并不知道car.run()这个方法内存的什么地方,于是只能用一个字符串来表示这个方法。该字符串包含了足够的信息,比如类的信息,方法名,方法参数等,以供实际使用时可以找到相应的位置。
这个字符串就被称为符号引用。
在解析阶段,jvm根据字符串的内容找到内存区域中相应的地址,然后把符号引用替换成直接指向目标的指针、句柄、偏移量等,这之后就可以直接使用了。
这些直接指向目标的指针、句柄、偏移量就被成为直接引用。
初始化
类的初始化的主要工作是为静态变量赋程序设定的初值。
还记得上面的静态变量吗:
public static int value = 123;
经过这一步,value的值终于是123了。
总结如下图:

类初始化的条件
Java虚拟机规范中严格规定了有且只有五种情况必须对类进行初始化:
1.使用new字节码指令创建类的实例,或者使用getstatic、putstatic读取或设置一个静态字段的值(放入常量池中的常量除外),或者调用一个静态方法的时候,对应类必须进行过初始化。
2.通过java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则要首先进行初始化。
3.当初始化一个类的时候,如果发现其父类没有进行过初始化,则首先触发父类初始化。
4.当虚拟机启动时,用户需要指定一个主类(包含main()方法的类),虚拟机会首先初始化这个类。
5.使用jdk1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、RE_invokeStatic的方法句柄,并且这个方法句柄对应的类没有进行初始化,则需要先触发其初始化。
除了以上这五种情况,其他任何情况都不会触发类的初始化。
比如下面这几种情况就不会触发类初始化:
1.通过子类调用父类的静态字段。此时父类符合情况一,而子类不符合任何情况。所以只有父类被初始化。
2.通过数组来引用类,不会触发类的初始化。因为new的是数组,而不是类。
3.调用类的静态常量不会触发类的初始化,因为静态常量在编译阶段就会被存入调用类的常量池中,不会引用到定义常量的类。
类加载机制
类加载器
在上面咱们曾经说到,加载阶段需要“通过一个类的全限定名来获取描述此类的二进制字节流”。这件事情就是类加载器在做。
jvm自带三种类加载器,分别是:
1.启动类加载器。
2.扩展类加载器。
3.应用程序类加载器
他们的继承关系如下图:

双亲委派
双亲委派机制工作过程如下:
1.当前ClassLoader首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。
2.?当前classLoader的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到bootstrp ClassLoader.
3.?当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。
为啥要搞这么复杂?自己处理不好吗?
双亲委派的优点如下:
1.避免重复加载。当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
2.为了安全。避免核心类,比如String被替换。
打破双亲委派
“双亲委派”机制只是Java推荐的机制,并不是强制的机制。
比如JDBC就打破了双亲委派机制。它通过Thread.currentThread().getContextClassLoader()得到线程上下文加载器来加载Driver实现类,从而打破了双亲委派机制。
至于为什么,以后再说吧。
答案
现在,我们可以回答文章开头提出的问题了。尽量在理解的基础上回答,不需要死记硬背。
1.什么是类的加载?
JVM把通过类名获得类的二进制流之后,把类放入方法区,并创建入口对象的过程被称为类的加载。经过加载,类就被放到内存里了。
2.哪些情况会触发类的初始化?
类在5种情况下会被初始化:
第一,假如这个类是入口类,他会被初始化。
第二,使用new创建对象,或者调用类的静态变量,类会被初始化。不过静态常量不算。
第三,通过反射获取类,类会被初始化
第四,如果子类被初始化,他的父类也会被初始化。
第五,使用jdk1.7的动态语言支持时,调用到静态句柄,也会被初始化。
3.讲一下JVM加载一个类的过程
同问题1。不过这里也可以问下面试官是不是想问类的生命周期。如果是问类的生命周期,可以回答有”加载、连接、初始化、使用、卸载“五个阶段,连接又可以分为”校验、准备、解析“三个阶段。
4.什么时候会为变量分配内存?
在准备阶段为静态变量分配内存。
5.JVM的类加载机制是什么?
双亲委派机制,类加载器会先让自己的父类来加载,父类无法加载的话,才会自己来加载。
6.双亲委派机制可以打破吗?为什么
可以打破,比如JDBC使用线程上下文加载器打破了双亲委派机制。原因是JDBC只提供了接口,并没有提供实现。

由于篇幅有限,关于这些问题,我整理了相关的文档有更好的解释这些问题原理。

领取方式:转发+评论,并私聊小编“JVM”免费领取。

原文地址:https://blog.51cto.com/14760318/2481672

时间: 2024-10-07 13:17:46

刚从京东面试回来,我才知道这些JVM知识有多重要的相关文章

Java程序员从京东、阿里、携程面试回来,已成功拿到京东offer

阿里巴巴(一面) 阿里找了一个前辈内推的,准确来说应该是直推,是他帮我直接录的简历,他本科进的阿里蚂蚁金服,厉害吧?是真的佩服.第一次在官网上填资料,想想马云有多出名,想想蚂蚁金服这样的顶级技术,有些兴奋,有些期待. 录完简历后等待简历评估,原来,找内推不一定能得到面试机会,能不能得到面试机会要经过简历评估(我这才知道,原来内推免笔试可不是那么容易的),毕竟内推能免去在线笔试直接面试,互联网第一梯队像百度.阿里,腾讯的笔试真的很有难度,做过前几年这些公司的笔试题,真的太难了.在阿里的校招群里看到

Java程序员从阿里、京东、美团面试回来,这些面试题你会吗?

最近有很多朋友去目前主流的大型互联网公司面试(阿里巴巴.京东.美团.滴滴),面试回来之后会发给我一些面试题.有些朋友轻松过关,拿到offer,但是有一些是来询问我答案的. 其实本来真的没打算写这篇文章,主要是自己得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问我的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回

小佬頭的春招之京东面试

2018年9月30号经过了工作交接,电脑退库,上交token,退回工卡,开实习证明,终于结束了我为期五个月的实习生活.很幸运八月转正考核通过,导师和小组长美女姐姐给我争取了一个好的结过,9月11号收到录用意向书,9月29号收到正式的offer call和录用涵,离职前一天收到了腾讯的正式offer,虽然待遇不算是我所有offer里面最好的,但是最起码是我满意的待遇,所以恭喜自己成为鹅厂的一只准新鹅. 从深圳到广州,再从广州坐卧铺回学校,在火车卧铺通道的座位上写下这篇春招. 说起腾讯,一直以来是一

想要去阿里面试?你必须得跨过 JVM 这道坎!

概述 很多人想要到阿里巴巴.美团.京东等互联网大公司去面试,但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累和实践经验,毕竟线上系统写好代码部署之后,每个工程师都必须关注JVM相关的东西,比如OOM.GC等问题. 所以一起来看看JVM的最基本的区域划分以及工作原理,这个基本上是互联网公司面试必问. 区域划分 jvm的区域划分如下所示: 大致就是分为:程序计数器,虚拟机栈,堆,方法区,本地方法栈,这几个部分. 接下来我们从自己写好的Java代码如何通过JVM来运行的角度,来分析一下JVM

能说出来,才是你的知识

投递人 itwriter 发布于 2016-08-17 09:56 评论(1) 有602人阅读 原文链接 [收藏] « » 文/Jason Ng 我们身处一个快速变化的时代,这个时代要求每一个人必须不断学习才能避免被淘汰.我们每天都在摄入信息,不管是从与朋友交谈.浏览朋友圈.查看 RSS 阅读等,但摄入信息不等于学习,学习不等于理解,理解不等于吸收,吸收也不代表你已经掌握了知识. 作为一个语文从未及格的工科生,从 2006 年到现在,已经坚持写博客 10 年了,现在回想起来,自己都不敢相信. 有

【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...

原文:前端面试“http全过程”将所有HTTP相关知识抛出来了... 来一篇串通,一个http全过程的问题,把所有HTTP相关知识点都带过一遍 http全过程 输入域名(url)-->DNS映射为IP-->TCP三次握手-->HTTP请求-->HTTP响应-->(浏览器跟踪重定向地址)-->服务器处理请求-->服务器返回一个html响应-->(视情况决定释放TCP连接)-->客户端解析HTML-->获取嵌入在HTML中的对象重新发起http请求

巨人大哥谈Java面试中常考的信息安全方面知识(MD5)

巨人大哥谈Java面试中常考的信息安全方面知识(MD5) Java MD5 加密算法介绍以及使用 MD5 算法的介绍 特点 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的. 2.容易计算:从原数据计算出MD5值很容易. 3.抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别. 4.强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的. 用途 1.可以用于加密用户密码 2.可以用于应用安装包的一致性验证 MD5 的简单

Java程序员卧底从阿里、京东、美团面试回来,这些面试题你会吗?

面试,难还是不难?最终结果好还是不好?取决于面试者的底蕴(气场+技能).心态和认知以及沟通技巧.而一些主流的大型互联网公司面试(阿里巴巴.京东.美团.滴滴)更是需要你在面试时展现出自己的能力,从而获得面试官的欣赏和肯定. 而程序员在应聘时更是需要经历层层面试.俗话说,磨刀不误砍柴工,做好面试前的准备工作可以帮助大家更好的应对面试官的问题以及面试中的突发情况.那么我们一起来看看大型互联网公司的面试题吧! 阿里巴巴面试 第一个:阿里面试都问什么? :(55分钟) 1.开发中Java用了比较多的数据结

阿里面试回来,想和Java程序员谈一谈(转载)

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论“面试前该不该刷题”这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习这个话题上