二、JVM 篇

\16. Java 类加载器有几种?

  • 启动类加载器,由C++实现,没有父类。
  • 拓展类加载器(ExtClassLoader),由Java语言实现,父类加载器为启动类加载器
  • 系统类加载器(AppClassLoader),由Java语言实现,父类加载器为ExtClassLoader

\17. 说一下有哪些类加载场景?

\18. 说说 Java 类加载机制是什么?说说 new 创建一个普通对象的过程?

  • 类加载指的是将class文件读入内存,并为之创建一个java.lang.Class对象,即程序中使用任何类时,系统都会为之建立一个java.lang.Class对象,系统中所有的类都是java.lang.Class的实例。
  • 类的加载由类加载器完成,JVM提供的类加载器叫做系统类加载器,此外还可以通过继承ClassLoader基类来自定义类加载器。
  • 第一步,判断常量池是否能定位类的符号引用,并且检查这个符号引用代表的类是否被加载、解析、初始化过。如果没有则执行第一步,如果有则执行第二步
  • 第二步类加载和初始化(初次使用),具体可分为加载、验证、准备、解析、初始化
  • 第三步创建对象,具体可分为实例对象分配内存、赋值、执行实例初始化代码、返回引用

\19. 说说类的生命周期?

java字段怎么实现拓展存储数据库和显示json对设备档案自定义扩展不同属性 java如何扩展类_Java

\20. 什么是双亲委派模型?

双亲委派模型的工作过程是: 如果一个类加载器接收到了类加载的请求,它首先不会自己去尝试去加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的类加载请求都应该传送到顶层启动类加载器中,只有当父加载器反馈自己无法加载这个请求,子类加载器才会去尝试自己加载。

\21. 如何破坏双亲委派模型?

只需要重写ClassLoader类的loadClass()方法。

如果不想打破双亲委派模型,就重写ClassLoader类中的findClass()方法即可

\22. 能不能自己也写一个 java.lang.String 类?

无用

但是如果在web应用中我们可以在WEB-INF/classess下面创建对应的String类,这样在每次启用tomcat的时候都会先去加载我们自己的String类

\23. 说一下 JVM 运行时数据区有哪些?分别说一下它们的功能

堆 堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。

方法区 方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。

java栈 :栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。

本地方法栈 与栈功能相同,本地方法栈执行的是本地方法,一个Java调用非Java代码的接口。

程序计数器 程序计数器中存放的是当前线程所执行的字节码的行数。JVM工作时就是通过改变这个计数器的值来选取下一个需要执行的字节码指令。

\24. 方法区和永久代有什么区别?

我们可以说,永久带是方法区的一种实现

\24. JVM 运行时数据区哪些地方会产生内存溢出?

栈溢出(StackOverflowError):我们需要使用参数 -Xss 去调整JVM栈的大小

堆溢出(OutOfMemoryError:java heap space):可以通过 -Xmx4096M 调整堆的总大小

\25. 为什么要用 metaspace 替换 permspace 呢?

  • 字符串存在永久代中,容易出现性能问题和内存溢出
  • 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出
  • 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低
  • 将 HotSpot 与 JRockit 合二为一

\26. 熟悉哪些 JVM 调优参数?

  • -Xss JVM栈大小
  • -Xmx JVM堆的最大内存
  • -Xms 设置堆的初始内存
  • -Xmn:设置堆中新生代的大小
  • XX参数:非标准参数,用于JVM开发的debug和调优,参数以-XX:开始。-XX:参数名称

\27. Java 对象的引用类型有哪些?

强引用:Object o =new Object(); o就是一个强引用:如果一个对象具有强引用,JVM就不会去GC它,JVM宁可会报OOM来终止程序,也不回收该对象。

软引用: 如果一个对象只具备软引用,如果内存空间足够,那么JVM就不会GC它,如果内存空间不足了,就会GC该对象。

弱引用: 如果一个对象只具有弱引用,只要JVM的GC线程检测到了,就会立即回收。弱引用的生命周期要比软引用短很多。不过,如果垃圾回收器是一个优先级很低的线程,也不一定会很快就会释放掉软引用的内存。

虚引用:如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当作垃圾进行GC。

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

常用的垃圾回收算法有如下四种:标记-清除、复制、标记-整理和分代收集。

\29. 垃圾收集器有哪些?

\30. 说说 JVM 中内存的分配与回收策略

对象会先存放在新生区eden中 经过垃圾回收剩下的会存放在from to区中,经过15垃圾回收会放入老年区