JVM
༺鲸落༻
Life is transient
展开
-
解决PC寄存器两个面试问题
1. 使用PC寄存器存储字节码指令地址有什么用?(为什么使用PC寄存器记录当前线程的执行地址呢?)因为CPU需要不停的切换各个线程,这时候切换回来以后就得知道接着从哪开始继续执行,所以JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。如上图所示,三个线程由一个执行引擎来执行,这三个线程看似是并行执行,实际是并发执行,即线程A执行一段时间,再切换到线程B执行一段时间,那这时候我们需要知道线程A执行到哪里,所以,就需要用PC寄存器记录当前线程的执行地址来明确下一条应该原创 2020-10-19 11:42:12 · 272 阅读 · 0 评论 -
详谈双亲委派机制(面试常问)
前言Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且,加载某个类的class文件时,Java虚拟机采用的是双亲委派机制,即把请求交由父类处理,它是一种任务委派模式工作原理(1)如果一个类加载器收到了类加载请求,它并不会自己先加载,而是把这个请求委托给父类的加载器去执行(2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的引导类加载器;(3)如果父类加载器可以完成类加载任务,就成原创 2020-10-18 16:03:17 · 15707 阅读 · 5 评论 -
为什么要自定义类加载器?
前言在Java的日常应用和程序开发中,类的加载几乎是由引导类加载器、扩展类加载器、系统类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式为什么要自定义类加载器(1) 隔离加载类在某个应用中需要使用中间件,这个中间件有自己的依赖的jar包,在同一个工程里面,如果引用多个框架的话,有可能会出现某些类的路径一样、类名也相同,这样就会出现类的冲突了,这个时候就需要做一个类的仲裁,像现在主流的容器类的框架一样,它们都会自定义类的加载器,实现不同的中间件隔离,避免类的冲突(2)修改原创 2020-10-18 13:45:43 · 1567 阅读 · 0 评论 -
JVM两种架构模型的区别
序Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。区别1. 基于栈式架构的特点➢设计和实现更简单,适用于资源受限的系统; .➢避开了寄存器的分配难题:使用零地址指令方式分配。➢指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。➢不需要硬件支持,可移植性更好,更好实现跨平台2. 基于寄存器架构的特点➢典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虛拟机。➢指令集架构原创 2020-10-16 12:09:04 · 126 阅读 · 0 评论