「java实现jvm」java实现多线程的几种方式
本篇文章给大家谈谈java实现jvm,以及java实现多线程的几种方式对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java的实现在于jvm实现跨平台这句话对吗
现在主流的机顶盒,均提供JVM。即机顶盒里有‘JAVA虚拟机’,你自己是无法直接导入JVM的,这是由生产厂家决定的,如果支持用户自己扩展功能,需要借助相关工具。游戏机如果支持java,将你成功编译的类文件导入就可以运行。就如同现在支持java的手机可以下载运行java开发的游戏,原理是相同的。java的跨平台性是因为jre和jdk都是由JVM编译支持的,成功编译的类文件由JVM解释执行。不同操作系统对java的支持都是由不同的JVM实现的。在没有安装JVM的WIN系统主机上需要将成功编译的文件转换为.exe可执行文件方能脱离JVM直接(双击)运行。
揭秘Java虚拟机:JVM设计原理与实现详细资料大全
《揭秘Java虚拟机:JVM设计原理与实现》是2017年电子工业出版社出版的图书,作者是封亚飞。
基本介绍
书名 :揭秘Java虚拟机:JVM设计原理与实现 作者 :封亚飞 ISBN :9787121315411 页数 :700 出版时间 :2017-06 开本 :16开 千 字 数 :942 内容简介,目录, 内容简介 《揭秘Java虚拟机:JVM设计原理与实现》从源码角度解读HotSpot的内部实现机制,本书主要包含三大部分——JVM数据结构设计与实现、执行引擎机制及记忆体分配模型。 数据结构部分包括Java位元组码档案格式、常量池解析、栏位解析、方法解析。每一部分都给出详细的源码实现分析,例如栏位解析一章,从源码层面详细分析了Java栏位重排、栏位继承等关键机制。再如方法解析一章,给出了Java多态特性在源码层面的实现方式。《揭秘Java虚拟机:JVM设计原理与实现》通过直接对原始码的分析,从根本上梳理和澄清Java领域中的关键概念和机制。 执行引擎部分包括Java方法调用机制、栈帧创建机制、指令集架构与解释器实现机制。这一话题是《揭秘Java虚拟机:JVM设计原理与实现》技术含量高的部分,需要读者具备一定的汇编基础。不过千万不要被“汇编”这个词给吓著,其实在作者看来,汇编相比于高级语言而言,语法非常简单,语义也十分清晰。执行引擎部分重点描述Java原始码如何转换为位元组码,又如何从位元组码转换为机器指令从而能够被物理CPU所执行的技术实现。同时详细分析了Java函式堆叠的创建全过程,在源码分析的过程中,带领读者从本质上理解到底什么是Java函式堆叠和栈帧,以及栈帧内部的详细结构。 记忆体分配部分主要包括类型创建与载入、对象实例创建与记忆体分配,例如new关键字的工作机制,import关键字的作用,再如java.lang.ClassLoader.loadClass()接口的本地实现机制。 《揭秘Java虚拟机:JVM设计原理与实现》并不是简单地分析源码实现,而是在描述HotSpot内部实现机制的同时,分析了HotSpot如此这般实现的技术必然性。读者在阅读《揭秘Java虚拟机:JVM设计原理与实现》的过程中,将会在很多地方看到作者本人的这种思考。 目录 第1章 Java虚拟机概述 1 1.1 从机器语言到Java——詹爷,你好 1 1.2 兼容的选择:一场生产力的革命 6 1.3 中间语言翻译 10 1.3.1 从中间语言翻译到机器码 11 1.3.2 通过C程式翻译 11 1.3.3 直接翻译为机器码 13 1.3.4 本地编译 16 1.4 神奇的指令 18 1.4.1 常见汇编指令 20 1.4.2 JVM指令 21 1.5 本章总结 24 第2章 Java执行引擎工作原理:方法调用 25 2.1 方法调用 26 2.1.1 真实的机器调用 26 2.1.2 C语言函式调用 41 2.2 JVM的函式调用机制 47 2.3 函式指针 53 2.4 CallStub函式指针定义 60 2.5 _call_stub_entry例程 72 2.6 本章总结 115 第3章 Java数据结构与面向对象 117 3.1 从Java算法到数据结构 118 3.2 数据类型简史 122 3.3 Java数据结构之偶然性 129 3.4 Java类型识别 132 3.4.1 class位元组码概述 133 3.4.2 魔数与JVM内部的int类型 136 3.4.3 常量池与JVM内部对象模型 137 3.5 大端与小端 143 3.5.1 大端和小端的概念 146 3.5.2 大小端产生的本质原因 148 3.5.3 大小端验证 149 3.5.4 大端和小端产生的场景 151 3.5.5 如何解决位元组序反转 154 3.5.6 大小端问题的避免 156 3.5.7 JVM对位元组码档案的大小端处理 156 3.6 本章总结 159 第4章 Java位元组码实战 161 4.1 位元组码格式初探 161 4.1.1 准备测试用例 162 4.1.2 使用javap命令分析位元组码档案 162 4.1.3 查看位元组码二进制 165 4.2 魔数与版本 166 4.2.1 魔数 168 4.2.2 版本号 168 4.3 常量池 169 4.3.1 常量池的基本结构 169 4.3.2 JVM所定义的11种常量 170 4.3.3 常量池元素的复合结构 170 4.3.4 常量池的结束位置 172 4.3.5 常量池元素总数量 172 4.3.6 第一个常量池元素 173 4.3.7 第二个常量池元素 174 4.3.8 父类常量 174 4.3.9 变数型常量池元素 175 4.4 访问标识与继承信息 177 4.4.1 aess_flags 177 4.4.2 this_class 178 4.4.3 super_class 179 4.4.4 interface 179 4.5 栏位信息 180 4.5.1 fields_count 180 4.5.2 field_info fields[fields_count] 181 4.6 方法信息 185 4.6.1 methods_count 185 4.6.2 method_info methods[methods_count] 185 4.7 本章回顾 205 第5章 常量池解析 206 5.1 常量池记忆体分配 208 5.1.1 常量池记忆体分配总体链路 209 5.1.2 记忆体分配 215 5.1.3 初始化记忆体 223 5.2 oop-klass模型 224 5.2.1 两模型三维度 225 5.2.2 体系总览 227 5.2.3 oop体系 229 5.2.4 klass体系 231 5.2.5 handle体系 234 5.2.6 oop、klass、handle的相互转换 239 5.3 常量池klass模型(1) 244 5.3.1 klassKlass实例构建总链路 246 5.3.2 为klassOop申请记忆体 249 5.3.3 klassOop记忆体清零 253 5.3.4 初始化mark 253 5.3.5 初始化klassOop._metadata 258 5.3.6 初始化klass 259 5.3.7 自指 260 5.4 常量池klass模型(2) 261 5.4.1 constantPoolKlass模型构建 261 5.4.2 constantPoolOop与klass 264 5.4.3 klassKlass终结符 267 5.5 常量池解析 267 5.5.1 constantPoolOop域初始化 268 5.5.2 初始化tag 269 5.5.3 解析常量池元素 271 5.6 本章总结 279 第6章 类变数解析 280 6.1 类变数解析 281 6.2 偏移量 285 6.2.1 静态变数偏移量 285 6.2.2 非静态变数偏移量 287 6.2.3 Java栏位记忆体分配总结 312 6.3 从源码看栏位继承 319 6.3.1 栏位重排与补白 319 6.3.2 private栏位可被继承吗 325 6.3.3 使用HSDB验证栏位分配与继承 329 6.3.4 引用类型变数记忆体分配 338 6.4 本章总结 342 第7章 Java栈帧 344 7.1 entry_point例程生成 345 7.2 局部变数表创建 352 7.2.1 constMethod的记忆体布局 352 7.2.2 局部变数表空间计算 356 7.2.3 初始化局部变数区 359 7.3 堆叠与栈帧 368 7.3.1 栈帧是什么 368 7.3.2 硬体对堆叠的支持 387 7.3.3 栈帧开辟与回收 390 7.3.4 堆叠大小与多执行绪 391 7.4 JVM的栈帧 396 7.4.1 JVM栈帧与大小确定 396 7.4.2 栈帧创建 399 7.4.3 局部变数表 421 7.5 栈帧深度与slot复用 433 7.6 最大运算元栈与运算元栈复用 436 7.7 本章总结 439 第8章 类方法解析 440 8.1 方法签名解析与校验 445 8.2 方法属性解析 447 8.2.1 code属性解析 447 8.2.2 LVTLVTT 449 8.3 创建methodOop 455 8.4 Java方法属性复制 459 8.5 与 461 8.6 查看运行时位元组码指令 482 8.7 vtable 489 8.7.1 多态 489 8.7.2 C++中的多态与vtable 491 8.7.3 Java中的多态实现机制 493 8.7.4 vtable与invokevirtual指令 500 8.7.5 HSDB查看运行时vtable 502 8.7.6 miranda方法 505 8.7.7 vtable特点总结 508 8.7.8 vtable机制逻辑验证 509 8.8 本章总结 511 第9章 执行引擎 513 9.1 执行引擎概述 514 9.2 取指 516 9.2.1 指令长度 519 9.2.2 JVM的两级取指机制 527 9.2.3 取指指令放在哪 532 9.2.4 程式计数器在哪里 534 9.3 解码 535 9.3.1 模板表 535 9.3.2 汇编器 540 9.3.3 汇编 549 9.4 栈顶快取 558 9.5 栈式指令集 565 9.6 运算元栈在哪里 576 9.7 栈帧重叠 581 9.8 entry_point例程机器指令 586 9.9 执行引擎实战 588 9.9.1 一个简单的例子 588 9.9.2 位元组码运行过程分析 590 9.10 位元组码指令实现 597 9.10.1 iconst_3 598 9.10.2 istore_0 599 9.10.3 iadd 600 9.11 本章总结 601 第10章 类的生命周期 602 10.1 类的生命周期概述 602 10.2 类载入 605 10.2.1 类载入——镜像类与静态栏位 611 10.2.2 Java主类载入机制 617 10.2.3 类载入器的载入机制 622 10.2.4 反射载入机制 623 10.2.5 import与new指令 624 10.3 类的初始化 625 10.4 类载入器 628 10.4.1 类载入器的定义 628 10.4.2 系统类载入器与扩展类载入器创建 634 10.4.3 双亲委派机制与破坏 636 10.4.4 预载入 638 10.4.5 引导类载入 640 10.4.6 载入、连结与延迟载入 641 10.4.7 父载入器 645 10.4.8 载入器与类型转换 648 10.5 类实例分配 649 10.5.1 栈上分配与逃逸分析 652 10.5.2 TLAB 655 10.5.3 指针碰撞与eden区分配 657 10.5.4 清零 658 10.5.5 偏向锁 658 10.5.6 压栈与取指 659 10.6 本章总结 661
jvm是如何实现的
编程语言和自然语言类似,都是为了交流,自然语言用于跟人交流,程序语言则用于指示机器。
jvm其实也就是一个程序,这个程序能接受你的Java代码,然后根据你的意愿执行一系列操作。
举个例子,你可以写一个这样的程序,这个程序接受用户输入一句话,如果用户输入“beep”则调用机器的鸣叫,如果用户输入“exit”,则关掉本程序。在这个例子中,其实用户写的“beep”和“exit”就充当了程序语言的角色,只不过这门语言过于简单因此不可能普及。而java则具有完善的体系能够支持你表达任何意愿,然后jvm理解你的java语言并执行相应操作,这就是程序语言的原理。
当然java还有优化的方案,它的编译器将你的java语言翻译成字节码,因为jvm执行字节码的速度比直接理解java代码要快很多,后来的版本还引入了JIT技术,实时将字节码再编译成机器码,这样就能让机器直接执行指令而不需要jvm去解释。
至于垃圾收集器,就是jvm维护着每一个对象的引用(可以理解成C++里面的指针),根据一定的算法判断其是否可达,如果这个引用不可达(也就是程序的后续部分已经无法获取这个引用,比如说已超出block范围了)那么就清除这个内存对象。这样的好处是能避免由于程序员的疏忽引起的内存泄露,缺点是内存的清理不够即时,因而无用的对象常常会占据内存很长时间。
你也可以在C++里实现垃圾回收器,思路是写一个用于管理内存的类,然后程序里不再用new来新建对象,而是用这个类来产生对象,类内部拥有这个对象的指针,并在适当的时候delete它,这样就实现垃圾自动回收了,当然要写这样一个类是很困难的事。
什么是JVM?Java跨平台的原理是什么?
首先我们要理解什么是跨平台,所谓的跨平台就是JAVA写的一份代码可以在任意的操作系统平台上运行。
为什么跨平台会成为一个问题呢?因为每一个操作系统平台支持不同的指令集我们所写的代码经过编译之后只能适用于一个平台,换一个平台就不支持了。而JAVA完美的解决了这个问题。
Java的一大特色就是“write once, run anywhere”即“一次编译,到处运行”。就是说你不用专门为每个平台写一份代码,你写的Java程序在任何平台都能跑起来。
它的实现原理是在系统层面上又增加了一层虚拟机(Java Virtual Machine,简称JVM),且为每个平台都定制了对应的虚拟机。然后Java程序是在虚拟机上跑的,因此平台无关。
Java的运行流程是:程序员写了源代码(Source Code,.java后缀,跨平台),然后经过编译器编译成字节码(Byte Code,.class后缀,二进制文件),字节码是所有虚拟机都能理解的中间文件。然后交给虚拟机(每个平台都有对应的虚拟机)去运行。
所以对“write once, run anywhere”更准确的理解是,“一次编译,到处装虚拟机,所以到处运行”。
整个流程如下图所示。
关于java实现jvm和java实现多线程的几种方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。