1.双亲委派模型的兼容性优化
双亲委派模型在jdk1.2才开始,在以前是通过覆盖loadClass()方法来自定义类加载器,但是不做兼容,由于多态性,那么实际上加载时是直接用ClassLoader子类的loadClass()方法,ClassLoader的loadClass()方法不会被调用,所以为了兼容,添加了findClass(),这样自定义的类加载器只需要把方法名从loadClass()修改为findClass(),这样ClassLoader的loadClass()方法就会被调用,就能实现双亲委派模型
2.Parallel Scavenge收集器与ParNew和Serial的区别
Parallel Scavenge收集器与ParNew和Serial的区别在于他的关注点是吞吐量,对于要与用户交互的程序应该尽可能缩短停顿时间,而后台计算任务则需要高效的利用CPU时间,这时应该提高吞吐量(吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间))
3.访问者模式实现Java的动态双分派
Java语言是一门静态多分派和动态单分派的语言,但Java可以借助访问者模式,支持动态双分派。
在编译期,Java可以通过调用方法的对象(接收方法调用请求的对象)的静态类型和方法参数来决定所用的具体方法的直接引用;在运行期,则只能通过接受请求的对象的实际类型来决定具体方法的直接引用,而不管方法的入参对象的实际类型是什么。
但借助访问者模式,可以在运行期,通过调用方法的对象和方法的入参对象的实际类型来决定具体方法的直接引用
4.StackOverFlowError与OutOfMemoryError
在32位虚拟机下,单个进程最大内存为2G。虚拟机栈有一个总内存,如果是用单线程栈深度超过阈值,或用-Xss配置单个线程的栈内存,然后单个方法栈帧太大,最终会出现StackOverFlowError,只有在可以动态扩展栈内存才会出现OutOfMemoryError。假如是创建过多的线程导致溢出,且不能减少线程数量,只能通过-Xss减少每个线程的栈容量,让系统能创建更多的线程。
5.线程停顿的时机
Java线程需要在安全点才能被停顿从而让GC线程stop the world,同时在线程上下文切换需要停顿线程,也是要在安全点才可以。