想为我每一本看过的技术书籍都写一个书评,虽然自不量力,写出来的东西更是没有水准,但是我还是想写,因为这样可以加深我印象。本来这本书读完已经快一星期了,但我还是不忍翻翻,觉得很值得回味。我觉得对于我们Java程序员来说,有些章节是没必要看的,你又不是实现JVM,没有必要深入到每个指令都要熟悉。所以我整理了一下,觉得:第1章 Java体系结构介绍、第2章 平台无关、第3章 安全、第5章 Java虚拟机、第7章 类型的生命周期、第8章 连接模型、第9章 垃圾收集章节是必须看的,其他的都可以选看。
为这本书写书评其实也没什么好写的,所以我把以前在读此书时的笔记全部糅合进来,希望大家多多支持,呵呵。
==============================================================================================
书名:《Inside Java Virtual Machine》
中文译名:《深入Java虚拟机》
作者:Bill Venners
出版社:机械工业出版社

一、什么是Java虚拟机
当你谈到Java虚拟机时,你可能是指:
1、抽象的Java虚拟机规范
2、一个具体的Java虚拟机实现
3、一个运行的Java虚拟机实例
二、Java虚拟机的生命周期
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。
Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、直接受一个字符串数组。在程序执行时,你必须给Java虚拟机指明这个包换main()方法的类名。
Main()方法是程序的起点,他被执行的线程初始化为程序的初始线程。程序中其他的线程都由他来启动。Java中的线程分为两种:守护线程 (daemon)和普通线程(non-daemon)。守护线程是Java虚拟机自己使用的线程,比如负责垃圾收集的线程就是一个守护线程。当然,你也可 以把自己的程序设置为守护线程。包含Main()方法的初始线程不是守护线程。
只要Java虚拟机中还有普通的线程在执行,Java虚拟机就不会停止。如果有足够的权限,你可以调用exit()方法终止程序。
三、Java虚拟机的体系结构
在Java虚拟机的规范中定义了一系列的子系统、内存区域、数据类型和使用指南。这些组件构成了Java虚拟机的内部结构,他们不仅仅为Java虚拟机的实现提供了清晰的内部结构,更是严格规定了Java虚拟机实现的外部行为。
每一个Java虚拟机都由一个类加载器子系统(class loader subsystem),负责加载程序中的类型(类和接口),并赋予唯一的名字。每一个Java虚拟机都有一个执行引擎(execution engine)负责执行被加载类中包含的指令。
程序的执行需要一定的内存空间,如字节码、被加载类的其他额外信息、程序中的对象、方法的参数、返回值、本地变量、处理的中间变量等等。Java虚拟机将 这些信息统统保存在数据区(data areas)中。虽然每个Java虚拟机的实现中都包含数据区,但是Java虚拟机规范对数据区的规定却非常的抽象。许多结构上的细节部分都留给了 Java虚拟机实现者自己发挥。不同Java虚拟机实现上的内存结构千差万别。一部分实现可能占用很多内存,而其他以下可能只占用很少的内存;一些实现可 能会使用虚拟内存,而其他的则不使用。这种比较精炼的Java虚拟机内存规约,可以使得Java虚拟机可以在广泛的平台上被实现。
数据区中的一部分是整个程序共有,其他部分被单独的线程控制。每一个Java虚拟机都包含方法区(method area)和堆(heap),他们都被整个程序共享。Java虚拟机加载并解析一个类以后,将从类文件中解析出来的信息保存与方法区中。程序执行时创建的 对象都保存在堆中。
当一个线程被创建时,会被分配只属于他自己的PC寄存器“pc register”(程序计数器)和Java堆栈(Java stack)。当线程不掉用本地方法时,PC寄存器中保存线程执行的下一条指令。Java堆栈保存了一个线程调用方法时的状态,包括本地变量、调用方法的 参数、返回值、处理的中间变量。调用本地方法时的状态保存在本地方法堆栈中(native method stacks),可能再寄存器或者其他非平台独立的内存中。
Java堆栈有堆栈块(stack frames (or frames))组成。堆栈块包含Java方法调用的状态。当一个线程调用一个方法时,Java虚拟机会将一个新的块压到Java堆栈中,当这个方法运行结束时,Java虚拟机会将对应的块弹出并抛弃。
Java虚拟机不使用寄存器保存计算的中间结果,而是用Java堆栈在存放中间结果。这是的Java虚拟机的指令更紧凑,也更容易在一个没有寄存器的设备上实现Java虚拟机。
方法区到底存放些什么?
1、类型信息(Type Information)
每一个被加载的类型,在Java虚拟机中都会在方法区中保存如下信息:
1)、类型的全名(The fully qualified name of the type)
2)、类型的父类型的全名(除非没有父类型,或者弗雷形式java.lang.Object)(The fully qualified name of the typeís direct superclass)
3)、给类型是一个类还是接口(class or an interface)(Whether or not the type is a class )
4)、类型的修饰符(public,private,protected,static,final,volatile,transient等)(The typeís modifiers)
5)、所有父接口全名的列表(An ordered list of the fully qualified names of any direct superinterfaces)
类型全名保存的数据结构由虚拟机实现者定义。除此之外,Java虚拟机还要为每个类型保存如下信息:
1)、类型的常量池(The constant pool for the type)
2)、类型字段的信息(Field information)
3)、类型方法的信息(Method information)
4)、所有的静态类变量(非常量)信息(All class (static) variables declared in the type, except constants)
5)、一个指向类加载器的引用(A reference to class ClassLoader)
6)、一个指向Class类的引用(A reference to class Class)
下面我们简单描述下这些数据,相信这些数据在日常编程中是很常见的:
1)、类型的常量池(The constant pool for the type)
常量池中保存中所有类型是用的有序的常量集合,包含直接常量(literals)如字符串、整数、浮点数的常量,和对类型、字段、方法的符号引用。常量池 中每一个保存的常量都有一个索引,就像数组中的字段一样。因为常量池中保存中所有类型使用到的类型、字段、方法的字符引用,所以它也是动态连接的主要对象。
2)、类型字段的信息(Field information)
字段名、字段类型、字段的修饰符(public,private,protected,static,final,volatile,transient等)、字段在类中定义的顺序。
3)、类型方法的信息(Method information)
方法名、方法的返回值类型(或者是void)、方法参数的个数、类型和他们的顺序、字段的修饰符(public,private,protected,static,final,volatile,transient等)、方法在类中定义的顺序
如果不是抽象和本地本法还需要保存
方法的字节码、方法的操作数堆栈的大小和本地变量区的大小、异常列表
4)、类(静态)变量(Class Variables)
类变量被所有类的实例共享,即使不通过类的实例也可以访问。这些变量绑定在类上(而不是类的实例上),所以他们是类的逻辑数据的一部分。在Java虚拟机使用这个类之前就需要为类变量(non-final)分配内存
常量(final)的处理方式于这种类变量(non-final)不一样。每一个类型在用到一个常量的时候,都会复制一份到自己的常量池中。常量也像类变 量一样保存在方法区中,只不过他保存在常量池中。(可能是,类变量被所有实例共享,而常量池是每个实例独有的)。Non-final类变量保存为定义他的 类型数据(data for the type that declares them)的一部分,而final常量保存为使用他的类型数据(data for any type that uses them)的一部分。
5)、指向类加载器的引用(A reference to class ClassLoader)
每一个被Java虚拟机加载的类型,虚拟机必须保存这个类型是否由原始类加载器或者类加载器加载。那些被类加载器加载的类型必须保存一个指向类加载器的引 用。当类加载器动态连接时,会使用这条信息。当一个类引用另一个类时,虚拟机必须保存那个被引用的类型是被同一个类加载器加载的,这也是虚拟机维护不同命 名空间的过程。
6)、指向Class类的引用(A reference to class Class)
Java虚拟机为每一个加载的类型创建一个java.lang.Class类的实例。你也可以通过Class类的方法:
public static Class forName(String className)来查找或者加载一个类,并取得相应的Class类的实例。通过这个Class类的实例,我们可以访问Java虚拟机方法区中的信息。具体参照Class类的JavaDoc。
一个类的Class对象代表这个类运行时的类信息,之所以要为每个类生成一个class对象,那是因为我们有时在运行时需要这个类的类信息。
为了更有效的访问所有保存在方法区中的数据,这些数据的存储结构必须经过仔细的设计。所有方法区中,除了保存了上边的那些原始信息外,还有一个为了加快存 取速度而设计的数据结构,比如方法列表。每一个被加载的非抽象类,Java虚拟机都会为他们产生一个方法列表,这个列表中保存了这个类可能调用的所有实例 方法的引用,报错那些父类中调用的方法。
Java堆中到底存放些什么?
当Java程序创建一个类的实例或者数组时,都在堆中为新的对象分配内存。虚拟机中只有一个堆,所有的线程都共享他。Java中所有的对象都存放在堆中,包括class对象和异常对象。
那么这些对象中有存放些什么呢?实例数据是肯定的,还有就是当通过对象访问类信息时就必须有一个指针将对象和方法区中的类信息关联起来,关联的方法有多种。一个可能的堆的设计是将堆分为两个部分:引用池和对象池。一个对象的引用就是指向引用池的本地指针。每一个引用池中的条目都包含两个部分:指向对象池中对 象数据的指针和方法区中对象类数据的指针。这种设计能够方便Java虚拟机堆碎片的整理。当虚拟机在对象池中移动一个对象的时候,只需要修改对应引用池中 的指针地址。但是每次访问对象的数据都需要处理两次指针。
另一种堆的设计是:一个对象的引用就是一个指向一堆数据和指向相应对象的偏移指针。这种设计方便了对象的访问,可是对象的移动要变的异常复杂。
无论虚拟机实现者使用哪一种设计,他都可能为每一个对象保存一个类似方法列表的信息。因为他可以提升对象方法调用的速度,对提升虚拟机的性能非常重要,但 是虚拟机的规范中比没有要求必须实现类似的数据结构。
除此之外,堆上的对象数据还有一种逻辑部分,那就是对象锁,这是一个互斥对象。虚拟机中的每个对象都有一个对象锁,它被用于协调多个线程访问同一个对象时的同步。只有当第一次需要加锁的时候才分配对应的锁数据,但这时虚拟机需要用某种间接方法来联系对象数据和对应的锁数据。这也是为什么很多对象在其整个生命周期内都没有被任何线程加锁。除了实现锁所需要的数据外,每个Java对象逻辑上还与实现等待集合(wait set)相关联。
最后一种数据类型-是与垃圾收集器有关的数据。垃圾收集器必须以某种方式跟踪程序引用的每个对象,这个任务不可避免的要附加一些数据给这些对象。
分享到:
相关推荐
《深入理解Java虚拟机(第二版)》是一本专注于Java虚拟机(JVM)内部机制和实现原理的书籍,它的书评可能会包括如下知识点: 1. JVM架构和功能:详细解释Java虚拟机的内部架构,包括类加载器、运行时数据区(包括...
内容概要:本文详细介绍了如何使用COMSOL Multiphysics进行金属纳米盘的散射、消光和吸收截面的计算。首先,通过几何建模创建一个直径80nm、厚度20nm的金纳米盘,并设置了精确的材料参数(如Drude模型),确保模拟的准确性。接着,选择了电磁波频域作为物理场,配置了合适的边界条件(如散射边界条件和端口激发),并进行了精细的网格划分,特别是在纳米盘边缘加密网格以提高计算精度。然后,利用后处理脚本提取了散射、消光和吸收截面的数据,提供了具体的计算公式和注意事项。最后,强调了验证结果的重要性和一些常见的错误避免方法,如检查能量守恒和调整网格密度。 适合人群:从事纳米光子学研究的科研人员和技术爱好者,尤其是对COMSOL Multiphysics有一定基础的用户。 使用场景及目标:适用于需要精确计算金属纳米盘光学特性的研究人员,帮助他们理解和掌握COMSOL中相关参数的设置和优化方法,从而更好地进行科学研究和发表高质量论文。 其他说明:文中还提供了一个详细的录屏教程,涵盖了从建模到后处理的完整流程,方便用户跟随操作。同时,提醒用户注意单位转换和数据归一化等问题,以确保计算结果的正确性。
DL/T 645-2007 的规定帧编写读写函数,对收到原始数据进行解码
餐饮行业: 店外引流:在餐厅门口放置爆店码,顾客进店前碰一碰,就能了解今日特色菜品、优惠套餐等信息,吸引顾客进店消费。 店内互动:在餐桌等位置设置爆店码,顾客用餐过程中碰一碰,可参与抽奖活动、领取餐后优惠券,或跳转到电子菜单进行加菜,增加顾客的用餐乐趣和二次消费几率。 零售店铺: 服装门店:在橱窗展示新品时,贴上爆店码,顾客碰一碰可查看模特穿搭视频、获取商品详情和尺码信息,以及该商品的会员专属折扣。在试衣镜旁放置爆店码,顾客碰一碰能查看搭配建议、关注公众号或加入会员,提升引流转粉效率。 便利店:在收银台设置爆店码,顾客付款时碰一碰,可领取满减优惠券、了解会员积分规则,或获取当季新品推荐,促进顾客当场购买或成为会员,提升销售额和顾客忠诚度。 线下活动: 展会:在展会入口、展位等位置放置爆店码,参与者碰一碰就能快速获取展会详情、参展商名单、活动议程、展位地图等信息,方便活动的推广和组织,同时也能收集参与者的信息,为后续营销做准备。 促销活动:在商场中庭、店铺门口等举办促销活动时,使用爆店码。顾客碰一碰可了解活动规则、参与方式,还能直接领取电子优惠券或参与线上互动游戏,增加活动的参与度和传播度。 服务行业: 美业:在美甲美睫店的服务台、镜子旁等地方设置爆店码,顾客碰一碰可自动引导添加美业小助理微信,方便预约下次服务,也可获取美容护肤知识、会员专属优惠等信息。 健身行业:在健身房的前台、更衣室门口、器械旁放置爆店码。顾客碰一碰能了解课程安排、教练介绍,还可参与打卡活动,分享训练成果到社交平台,领取健身优惠券或小礼品,吸引更多潜在顾客。 旅游行业: 景区:在景区入口、景点打卡处等设置爆店码,游客碰一碰可获取景区地图、景点介绍、语音讲解,还能领取景区纪念品优惠券或参与线上互动活动,提升游客的旅游体验和景区的知名度。 酒店:在酒店大堂、客房门口、餐厅等位置放置爆店码。客人碰一碰可了解酒店
MIL-STD-454N.PDF
内容概要:本文提出了一种基于标准视频编解码器和优化特征平面的高效压缩方法,用于处理3D高斯点阵(3D Gaussian Splatting)。该方法通过引入统一架构将点云数据和特征平面结合,利用2D特征平面实现连续空间表示,并通过频率域熵建模和通道位分配优化压缩性能。实验结果表明,该方法在显著减少存储需求的同时保持了高质量的渲染效果,特别是在“自行车”场景中实现了146倍的压缩率而图像质量几乎无损。此外,该模型与现有3DGS渲染管道无缝集成,维持了相似的渲染速度。 适合人群:对3D场景压缩和渲染技术感兴趣的计算机视觉研究人员及工程师,特别是关注实时应用和移动设备性能优化的专业人士。 使用场景及目标:①需要在资源受限环境中(如移动设备或头戴显示器)进行高效3D场景表示的应用开发者;②寻求在不牺牲渲染质量的前提下大幅降低存储和传输成本的技术团队;③希望利用标准视频编解码器实现快速硬件解码的研究者。 其他说明:该研究不仅适用于特定的数据集,还为未来3D表示技术的发展提供了关键见解,促进了更高效的3D压缩技术发展。实验验证了该方法的有效性,展示了显著的存储节省和视觉保真度。
内容概要:本文详细介绍了超声波焊接技术在汽车门板塑焊机中的应用,涵盖了从源码程序到硬件加工的各个方面。首先强调了超声波焊接在汽车制造中的重要性,然后展示了控制板和显示板的源码程序,包括初始化代码、PID控制算法、频率跟踪算法等。此外,还讨论了超声波换能器、手柄外壳、铝件和焊头的加工技术及其具体要求。文中提供了多个代码示例,如STM32的PWM配置、DMA传输、PID算法实现等,展示了如何通过软件和硬件的紧密结合实现高效的超声波焊接。 适合人群:从事汽车制造业、电子工程、嵌入式开发等相关领域的技术人员,尤其是对超声波焊接技术和嵌入式系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解超声波焊接技术原理和技术实现的读者,帮助他们掌握从源码编写到硬件加工的全流程知识,提高焊接系统的稳定性和可靠性。 其他说明:文章不仅提供了详细的代码示例,还分享了许多实践经验,如频率跟踪算法、温度补偿、硬件互锁机制等,有助于读者更好地理解和应用这些技术。
可配置阶数和位宽的级联型IIR滤波器(具体代码和工程私聊qq947336191)
程序设计语言基础JAVAWEB_Java的常用工具类[2025网盘版.备考复习]
内容概要:本文详细介绍了Halcon与C#联合开发的一个稳定版工业视觉框架,涵盖环境配置、图像处理流水线设计、异常处理、内存管理和算法模块化等方面的内容。首先,文章强调了环境配置的重要性,确保Halcon的runtime版本与开发环境一致,避免常见的dll版本不匹配问题。接着,描述了图像处理流水线的设计,采用了Task+async/await的方式提高效率,并通过状态机实现流程引擎,使配置更加灵活。此外,文章深入探讨了内存管理,提供了多个实例,如使用using语句确保HRegion对象正确释放,以及通过HalconMemoryKiller类防止内存泄漏。异常处理方面,文章展示了如何将Halcon的错误码转化为易读的信息,并实现了全局异常捕获和日志记录。最后,文章提到了框架的实际应用场景,如PCB板检测,并分享了许多实战经验和技巧,如相机断线自动重连、图像显示控件的手势操作等。 适合人群:具备一定编程基础并希望深入了解Halcon与C#联合开发的工程师和技术爱好者。 使用场景及目标:适用于工业视觉项目的开发,旨在帮助开发者构建高效稳定的图像处理系统,提高系统的鲁棒性和维护性。 其他说明:文中提供的代码片段和实战经验对于解决常见问题非常有价值,尤其是内存管理和异常处理方面的最佳实践。
内容概要:本文详细介绍了基于三菱FX1N-30MR PLC和威纶TK6070触摸屏的恒压供水系统的实战应用。主要内容涵盖系统的关键功能如定时锁定、模式切换、PID控制、故障联锁以及小泵控制等。文中不仅提供了具体的梯形图代码片段,还分享了许多实际调试经验和注意事项。例如,定时锁定功能通过M384和M385实现,确保系统稳定运行;模式切换由M400-M403控制,可在触摸屏上进行选择;PID控制可以选择变频器或3A模块,后者提供更平稳的压力曲线;故障联锁机制能够在变频器故障时自动切换到工频泵,保障供水安全;小泵控制则用于应对压力波动,保持管网压力稳定。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和触摸屏应用有一定基础的人群。 使用场景及目标:适用于需要理解和实施恒压供水系统的工程项目。目标是帮助读者掌握三菱PLC和威纶触摸屏的具体应用技巧,提高系统的可靠性和效率。 其他说明:文中提到的一些特殊操作和调试技巧,如通过D129输入4016解锁系统,以及在触摸屏上设置隐藏菜单等,有助于解决实际工程中的常见问题。此外,文章强调了硬件配置和通信设置的重要性,提醒读者在实际操作中避免常见的错误。
内容概要:本文详细介绍了基于51单片机的全自动洗衣机系统的设计与实现。系统支持手动和自动两种操作模式,能够灵活调整水位、洗涤时间和漂洗次数等参数。文中提供了详细的Proteus 8仿真图、C语言源码及Hex文件的使用说明。硬件方面,采用STC89C52作为主控芯片,搭配LCD1602显示屏、按键阵列、直流电机驱动模块、水位传感器和门磁开关等组件。软件部分涵盖了按键处理、电机控制、水位检测等功能模块的具体实现方法。此外,还讨论了一些常见的调试技巧和注意事项。 适合人群:具有一定单片机基础知识的学习者、电子爱好者、嵌入式系统开发者。 使用场景及目标:适用于希望深入了解51单片机及其外围设备的应用开发,特别是对于嵌入式控制系统感兴趣的读者。通过本项目的实践,读者可以掌握单片机的基本编程技能,学会如何构建和调试小型自动化系统。 其他说明:文中提供的代码和仿真图可以帮助初学者更好地理解和掌握相关知识点。同时,针对可能出现的问题给出了实用的解决方案,如按键消抖、电机驱动保护等。
Java在线教育学习平台LW PPT
系统名称:基于SSM实现的小说网站 技术栈:SSM框架、MYSQL数据库、JS语言、B/S架构 系统功能:前台界面功能包括站内信息查看(通过作者、小说名、小说类型查找小说)、用户注册、小说列表查看(按章节查看并阅读,用户登录后收藏,付费或免费查看)、在线支付、排行榜(热门小说、点击率);后台功能包括用户管理(管理员和注册用户)、站内信息管理、小说类别管理、小说信息管理、章节信息管理、支付信息管理。 摘要:简单而言信息化就是为了人们的生活便利所带来的新时代的东西,有了淘宝、京东,我们可以进行网购漂亮的衣服;有了快手、抖音我们可以真实的感受主播给我们带来最真实的货物;有了美团我们可以在家就吃到全城的美食。这就是信息化带给我们的福利,别看一个小小的APP或者WEB应用,它能够解决的是社会上的某一类问题。企业资源计划ERP这类软件可能有很多人都听到过,熟悉它的人都知道一个小小的TOB应用软件可以指挥数以万计的企业员工有条不紊的进行着企业各项的生产任务。可想而知,信息化软件的力量足可以撼动整个企业乃至整个行业的情况。此次我们的设计所做的应用也是根据现实生活当中的需求来进行针对性的功能解决的,所有的业务也好,功能啥的都是根据实际的需求设计而来。各种各样应运而生的信息化软件都是为了解决生活当中的问题的,我们也不例外,就是为了能够解决这样或者那样的问题才进行的设计。随着近几年的疫情不断发展,居家办公的情况更多出现在人们的生活当中,那么一些单调无味的工作和生活就影响着人们的心情。小说的需求场景也就越来越多了,人们的娱乐方式也由此变得更加丰富些。电子小说的出现可以大概率的帮助人们随时随地进行小说的阅读,同时还能够搜寻出自己喜欢小说。
内容概要:本文详细介绍了基于模型预测控制(MPC)的异步电机电流环改进仿真项目。首先,文章阐述了双闭环矢量控制框架的整体架构,即外层采用PI控制的速度环和内层采用MPC控制的电流环。接着,深入探讨了电机模型的核心代码,包括磁链观测器的简化处理以及预测控制器的代价函数设计。文中还分享了多个实际调试过程中遇到的技术挑战及其解决方案,如离散化方法的选择、开关频率惩罚项的设定、预测步长的影响等。此外,作者通过实验数据展示了MPC相较于传统PI控制在动态响应、电流跟踪精度等方面的显著优势。 适合人群:电气工程专业学生、从事电机控制系统研究的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解并掌握异步电机模型预测电流控制技术的研究人员。主要目标是通过理论与实践相结合的方式,提高对MPC的理解和应用能力,特别是在电流环控制方面的优化。 其他说明:文章不仅提供了详细的数学公式和代码实现,还附带了一些实用的小技巧和注意事项,有助于读者更好地理解和复现相关研究成果。同时,文中引用了多篇权威文献作为参考,进一步增强了内容的专业性和可信度。
lvgl-8.3.0 在github下载了好久才下载下来,希望方便大家使用。
兰州石化职业技术大学岗位实习手册(学生)印9200册.doc
On-device Model 在 KMP 的集成与用例.pptx
数据集介绍 整理平台上的几个数据集,调整格式,将验证码内容作为图片名称 整理相关验证码数据集57800张,统一使用验证码内容作为对应图片的文件名,使用的时候可以根据根据需求自行决定切分比例。
中职语文《一碗清汤荞麦面》教学设计.docx