类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。类加载器可以说是Java语言的一项创新,也是Java语言流行的重要原因之一,它最初是为了满足JavaApplet的需求而开发出来的。虽然目前JavaApplet技术基本上已经“死掉”,但类加载器却在类层次划分、OSGi、热部署、代码加密等领域大放异彩,成为了Java技术体系中一块重要的基石,可谓是失之桑榆,收之东隅
鲲鹏处理器片上系统架构一、鲲鹏处理器片上系统与Taishan处理器内核架构1.鲲鹏处理器片上系统概况a.鲲鹏处理器片上系统与鲲鹏芯片家族b.鲲鹏920处理器片上系统的组成部件c.鲲鹏920处理器片上系统的特征d.鲲鹏920处理器片上系统的逻辑结构2.TaishanV110处理器内核微架构a.TaishanV110处理器内核的特征b.TaishanV110处理器内核的功能结构3.鲲鹏920处理器片上系统的逻辑结构a.处理器内核集群b.I/O集群c.超级内核集群d.超级I/O集群e.鲲鹏920系统的部件互联4.鲲鹏920处理器片上系统的内存存储系统a.鲲鹏920处理器存储系统的层次结构b.鲲鹏92
虚拟机类加载的时机和过程一、类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking),这7个阶段的发生顺序如图7-1所示。 类的生命周期 上图中加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而
一小时速通ARMv8-A体系结构一、ARMv8-A处理单元核心架构1.ARMv8-A架构的处理器运行模式a.ARMv8-A的执行架构A.AArch64执行状态B.AArch32执行状态b.ARMv8-A架构支持的指令集c.ARMv8-A支持的数据类型d.ARMv8-A的异常等级与安全模型e.ARMv8-A的虚拟化架构f.ARMv8-A的调试支持2.ARMv8-A架构的寄存器a.ARMv8-A系统寄存器b.AArch64状态下的通用寄存器c.AArch64执行状态下的处理状态PSTATEd.AArch64执行状态下的特殊功能寄存器3.ARMv8-A架构的异常与中断二、ARMv8-A处理器单元的存
字节码指令简介 Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的架构(这两种架构的区别和影响将在第8章中探讨),所以大多数的指令都不包含操作数,只有一个操作码。 字节码指令集是一种具有鲜明特点、优劣势都很突出的指令集架构,由于限制了Java虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过256条;又由于Class文件格式放弃了编译后代码的操作数长度对齐,这就意味着虚拟机处理那些超过一
Class类文件的结构 Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的的程序存储格式——字节码(ByteCode),从而实现了程序的“一次编写,到处运行”。 Java虚拟机提供的语言无关性 “Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。使用Java编译器可以把Java代码编译为存储字节码的Class文件。Class类文件的结构: 根据Ja
读书笔记|【项目思维与管理】➾顺势而动一、企业步入“终结者时代”二、过去成功的经验也许是最可怕的三、做好非重复性的事四、适应客户是出发点五、向知识型企业转变六、速度是决胜条件💖TheBegin💖点点关注,收藏不迷路💖一、企业步入“终结者时代”🔷西方有个谚语:人无法逃避的只有两件事,一件是交税,另一件是死亡。对于当今企业来说,无法避免的似乎也只有两件事:一件是竞争,另一件是死亡!目前各类企业均面临十分严峻的竞争形势,那些处于垄断行业的企业自认为会有一个安全的未来,这是十分幼稚的。企业之间的竞争态势让我们先来看兼并。或许大家已经感觉到,前几年为人们所津津乐道的企业兼并之风已不再盛行,“打造航空母舰
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。关于回收内存这一点,我们已经使用了大量篇幅去介绍虚拟机中的垃圾收集器体系以及运作原理,现在我们再一起来探讨一下给对象分配内存的那点事儿。 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。
垃圾收集器 HotSpot虚拟机包含的所有收集器如图3-5所示。图3-5展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。新生代收集器:Serial、ParNew、ParallelScavenge,新生代收集器均采用复制算法老年代收集器:SerialOld(标记-整理算法)、ParallelOld(标记-整理算法)、CMS(标记-清除算法)不分代的收集器:G1(整体来看基于标记-整理和局部来看基于复制算法)图3-5HotSpot虚拟机的垃圾收集器一、Serial收集器Serial收集器是一个单线程的收集器,它的“单线程”的意义并不仅仅说明它只会使用一个CPU
HotSpot的算法实现HotSpot的算法实现概要1、枚举根节点由于目前的主流Java虚拟机使用的都是准确式GC(这个概念在第1章介绍ExactVM对ClassicVM的改进时讲过),所以当执行系统停顿下来后,并不需要一个不漏地检查完所有执行上下文和全局的引用位置,虚拟机应当是有办法直接得知哪些地方存放着对象引用。在HotSpot的实现中,是使用一组称为OopMap的数据结构来达到这个目的的,在类加载完成的时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也会在特定的位置记录下栈和寄存器中哪些位置是引用。这样,GC在扫描时就可以直接得知这些信息了。 2、