JVM 真的很难学么?不、只是你“不敢学”而已

       许多招聘的信息上面都说,要了解jvm、多线程什么的对于 java 程序员来说,这是工作好多年的程序员都不一定能掌握的东西,但是面试就会问啊,你不掌握咋整你说?

为什么面试会问呢?

       因为面试时间就那么一个小时半个小时的,问不出什么东西,所以许多面试官都会问什么是类加载、jvm的结构、垃圾回收算法啊什么的,网上有很多的理论知识,我们背一背和面试官聊一聊就完事了,或者有的面试管技术实力很强问的很细节这时候如果掌握的不是很好的话就会被问懵逼 例如:

  • 什么是类加载器?

  • 类加载器都有哪些?

  • 如何自定义自己的类加载器?

  • 什么是双亲委托机制?

  • 双亲委托机制的好处和问题?

  • 那么双亲委托机制的问题如何解决的?

  • 那么类是如何加载的?

  • 类的加载和接口的加载有什么区别和注意事项?

  • 类的初始化步骤是什么?

  • 类的主动使用和被动使用都有什么?

  • 什么时候类会被卸载?

  • 什么是类的命名空间?

    但是作为一个java程序员这些东西如果掌握了的话对自己的好处是显而易见的,遇见面试官你“喷他”就完了(学完之后)

      先从比较好理解的jvm的类加载器开始学习:从第一个问题开始来

1、什么是类加载器?

     Java类加载器是Java运行时环境的一部分,负责动态加载Java类到Java虚拟机的内存空间中


2、类加载器都有哪些

  • 根加载器(bootstrap)
  • 扩展类加载器(Extension)
  • 系统(应用)类加载器(system)
  • 用户自定义类加载
  • 上下文类加载器

3、如何自定义自己的类加载器?

       用户要创建自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name) 方法即可,该方法根据参数指定的类的名字,返回对应的Class对象的引用


4、什么是双亲委托机制?

       当java程序请求加载器loader加载一个类时.加载器loader先去请求其父类去加载它当前要加载的类,若父加载器无法加载当前要加载的类,则加载器loader本身才去加载当前所要加载的类


5、双亲委托机制的好处和问题?

好处

       可以确保Java核心库的安全,所有的ava应用都会引用java.lang.Object类也就是说在运行期java.lang.Object这个类会被加载到java虚拟机中,如果这个加载过程是由我们自己的类加载器完成的,那么很可能就会在jvm中存在多个版本的java.lang.Object类,而且这些类之间还是不兼容的,相互不可见的(正是命名空间的存在导致的),但是由于双亲委托机制的存在Java核心库中类的加载工作都是由根类加载器所加载的,从而确保了Java应用所使用的都是同一个版本Java核心类库,他们之间都是相互兼容的

可以确保Java核心类库所提供的类不会被自定义的类所替代

问题

       实例场景说明:在双亲委托模型下,类加载器是由下至上的,即下层的类加载器会委托上层类加载器加载。但是对于SPI来说,有些接口是java核心库所提供的而java核心库是由启动类加载器加载的,而这些接口的实现确是来自于不同的jar包,java的启动类加载器是不会加载其他来源的jar包的,这样传统的双亲委托模型就无法满足SPI的要求。(jdbc链接数据库问题)还有好多场景能打破双亲委托机制


6、那么双亲委托机制的问题如何解决的?

      传统的双亲委托模型就无法满足SPI的要求。而通过给当前线程设置上下文类加载器,就可以由设置的上下文类加载器来实现对于接口实现类的加载。(利用上下文类加载器)


7、那么类是如何加载的?(见下图)



8、类的加载和接口的加载有什么区别和注意事项?

     比如类加载了它的父类一定会被加载,但是如果是接口被加载了但是它的父级接口不一定被加载


9、类的初始化步骤是什么?

  • 假如这个类还没有被加载和连接,那么就先进行类的加载和连接
  • 假如类存在直接父类,并且这个父类还没有被初始化,那就先初始化直接父类
  • 假如类中存在初始化语句,那就一次执行这些初始化

10、类的主动使用和被动使用都有什么?

主动使用:

  • 创建类的实例
  • 访问某个类或接口的静态变量,或者对该静态变量赋值
  • 调用类的静态方法
  • 反射(Class.forName("com.test"))
  • 初始化一个类的子类(初始化子类的话父类必定会被初始化)
  • java虚拟机在启动时被标明为主动类的类(main方法的类)
  • JDK1.7开始提供的动态语言支持(比如java可以调用js语言):java.lang.invoke.MethodHandle实例的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic句柄对应的类没有被初始化,则初始化

被动使用:

       除了上面的7种情况,其他使用java类的方式都被看做是对类的被动使用,都不会导致类的(初始化,但并不意味着类不进行加载和连接)所有的java虚拟机的实现必须在每个类或接口被java程序(首次主动)使用时才初始化他们


11、什么时候类会被卸载?

       当一个类经历被加载、链接、初始化三个步骤后它的生命周期就开始了。当该类初始化生成的对象不在被引用的时候,Class对象就会结束生命周期。该类在方法区内的数据也会被卸载,从而该类的生命周期就结束了。所以一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期(即没有被引用)


12、什么是类的命名空间?

       类的命名空间是由类的名称以及类的加载器和加载器的所有父级别的加载器一起构成的


13、类加载器之间的关系

       加载器顺序:用户自定义加载 -> 系统类加载器 -> 扩展类加载器 -> 根加载器


        更多的类加载的详情我整理了一份jvm的类加载的知识点如下图(需要的请留言)

与君共勉 .....

JVM 真的很难学么?不、只是你“不敢学”而已的更多相关文章

  1. 转:Eric Lippert:阅读代码真的很难

    转自:http://blog.jobbole.com/438/ 相关文章 微软资深软件工程师:阅读代码真的很难(第2篇) 阅读优秀代码是提高开发人员修为的一种捷径 学会阅读源代码 如何阅读大型代码库? ...

  2. What?废柴, 模拟登陆,代码控制滑动验证真的很难吗?Are you kidding???

    1.简介 在前边的python接口自动化的时候,我们由于博客园的登录机制的改变,没有用博客园的登录测试接口.那么博客园现在变成了滑动验证登录,而且现在绝大多数的登录都变成这种滑动验证和验证码的登录验证 ...

  3. HDU 3038 How Many Answers Are Wrong(带权并查集,真的很难想到是个并查集!!!)

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  4. 如何在MAC下安装Myeclipse2015真的很虐心!!!!!!!!!!

    最近笔者换了一个新的笔记本,mac pro 因为同学说大公司的web开发都是写在Linux操作系统下的,所以我决定搞一个,但是装软件就是很困难啊!找了大量资料发现都不全,最后,终于搞好了,分享给同样虐 ...

  5. 面试阿里百分百问的Jvm,别问有没有必要学,真的很有必要朋友

    面试阿里百分百问的Jvm,别问有没有必要学,真的很有必要朋友 前言: JVM 的内存模型和 JVM 的垃圾回收机制一直是 Java 业内从业者绕不开的话题(实际调优.面试)JVM是java中很重要的一 ...

  6. 如果你不了解Java的JVM,那真的很难进BAT一线大厂!

    前言 对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试 ...

  7. 听说 JVM 性能优化很难?今天我小试了一把!

    文章首发于公众号「陈树义」及个人博客 shuyi.tech,欢迎关注访问. 对于 Java 开发的同学来说,JVM 性能优化可以说是比较难掌握的知识点.这不仅因为 JVM 性能优化需要掌握晦涩难懂的 ...

  8. 函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网

    函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网 函数式编程很难,这正是你要学习它的原因 156 次分享 新浪微博 腾讯微博 Tweet 人人网 QQ空间 很奇怪不是,很少有人每天都使用函数 ...

  9. MySQL开发篇,存储引擎的选择真的很重要吗?

    前言 谁说MySQL查询千万级别的数据很拉跨?我今天就要好好的和你拉拉家常,畅谈到深夜,一起过除夕!这篇文章也是年前的最后一篇,希望能带给大家些许收获,不知不觉查找文档和参考实体书籍就写了这么多,自己 ...

随机推荐

  1. Premultiplied Alpha

    Xcode 的工程选项里有一项 Compress PNG Files,会对 PNG 进行 Premultiplied Alpha.游戏开发中会更加关注这个格式,省一些运行时计算. Premultipl ...

  2. java web综合案例

    1.采用的技术: bootstrap+jsp+servlet+三层架构(servlet,service,dao)+mysql 注意:mysql使用的是5.5版本,使用高版本会有很多问题.可以将5.5版 ...

  3. 发现钉钉打卡定位算法的一个bug

    最近公司取消了指纹打卡,改用钉钉打卡. 天天用这个打卡上班,经常忘记,困扰. 最烦的是好几次明明人在办公室,打卡地址显示在10分钟前的位置,定位失败,不得不重新打卡. 经历过几次定位失败后,我就琢磨起 ...

  4. JS同步和异步的理解

    js的同步和异步问题通常是指ajax的回调,如果是同步调用,程序在发出ajax调用后就会暂停,直到远程服务器产生回应后才会继续运行.而如果是异步调用,程序发出ajax调用后不会暂停,而是立即执行后面的 ...

  5. Html 慕课园编程练习10-1

    23:10:25 2019-08-14 自己写的这个好丑.... 题目:利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: (另外 这个动图是怎么插入的 用url就行 复制就 ...

  6. php连接数据库,php连接mysql并查询的几种方式,PHP PDO连接以及预处理

    PHP连接数据库 面向过程 $config = [ 'host'=>'127.0.0.1', //数据库地址 'name'=>'test', //库名 'user'=>'root', ...

  7. NAT及静态转换,动态转换及PAT

    NAT及静态转换,动态转换及PAT 案例1:配置静态NAT 案例2:配置端口映射 案例3:配置动态NAT 案例4:PAT配置 案例5:办公区Internet的访问 1 案例1:配置静态NAT 1.1 ...

  8. 个推push数据统计(爬虫)

    该方案基于任务调度框架Gearman,采用Python开发的分布式数据统计系统. 项目的目录结构很简单: # apple at localhost in ~/Develop/getui [11:24: ...

  9. python_Mock基本使用

    ## 1.mock简介 1. py3已将mock集成到unittest库中 2. 为的就是更好的进行单元测试 3. 简单理解,模拟接口返回参数 4. 通俗易懂,直接修改接口返回参数的值 5. 官方文档 ...

  10. 通过operator函数将字符串转换回运算符

    需求 由于某些需要,将一些运算符做了列表,以便后续的程序判断传入的字符串中是否包含该列表中的某一个运算符,如果包含,就用该运算符做运算. 但该运算符已经转换是字符串了,没有办法做运算符用,经过全网搜索 ...