摘要: Aug 24th, 2017 Posted by 飒然Hang in architecture 之前开头的《架构设计原则》一文一直没有把坑填上。而最近在公司内部做了一次架构交流/培训,把架构的概念、架构的形式、架构设计原则都做了阐述,正好算是对此文的完成和补充。 阅读全文
posted @ 2019-12-03 22:52 mongotea 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 除了可能会出现在class文件中的这200条指令的操作码,Java虚拟机规范还定义了另外两类操作码: 保留的操作码和"quick”操作码,这两种操作码不会合法地出现在Java class文件中。 Java虚拟机规范列出了三种保留操作码,如表A-1所示。这些操作码是为Java虚拟机实现及其工具所保留的 阅读全文
posted @ 2019-12-03 22:43 mongotea 阅读(257) 评论(0) 推荐(0) 编辑
摘要: Java虚拟机的指令集包括四种调用方法的指令,本章对这四种指令和这些指令执行的环境进 行阐述。 19.1方法调用 Java程序设计语言提供了两种基本的方法:实例方法和类(或者静态)方法。这两种方法的区别在于: 1)实例方法在被调用之前,需要一个实例,而类方法不需要。 2)实例方法使用动态(迟)绑定, 阅读全文
posted @ 2019-12-03 22:42 mongotea 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 不过,大多数情况下,监视器保护那些通过监视区域代码来访问的数据,在这种情况下一即要求数据仅可以由监视区域访问,监视器可以确保线程会互斥地访问这些数据。 另一种我们提到的被监视器所支持的同步是协作。互斥帮助线程在访问共享数据时不被其他线程干扰,而协作帮助线程与其他线程共同工作。 当一个线程需要一些特别 阅读全文
posted @ 2019-12-03 22:42 mongotea 阅读(166) 评论(0) 推荐(0) 编辑
摘要: javac为remainder ()方法产生下列字节码序列: // The main bytecode sequence for remainder (); // Push local variable 0 {arg passed as0 iload_0 // dividend) // Push t 阅读全文
posted @ 2019-12-03 22:41 mongotea 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 18.1微型子例程 字节码中的finally子句在方法内部的表现很像“微型子例程”。Java虚拟机在每个try语句块和与其相关的catch子句的结尾处都会“调用”finally子句的子例程。finally子句结束后(这里的结束指的是finally子句中最后一条语句正常执行完毕,不包括抛出异常,或执行 阅读全文
posted @ 2019-12-03 22:41 mongotea 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 只有对象引用和基本类型可以在Java的桟中以局部变量形式存在。Java栈不能容纳对象。 Java虚拟机中的对象和基本类型的结构分离在java编程语言中体现为:对象不能作为局部变量声明,只有对象引用和基本类型可以。对象引用在声明后并不指向任何有意义的东西,只有在引用被显式初始化后(无论是使引用指向一个 阅读全文
posted @ 2019-12-03 22:40 mongotea 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 16.1条件分支 在Java源代码中,可以在一个方法中使用if、if-else、while、 do-while、for和switch语句来指定基本的控制流。当把所有源代码转换成为字节码的时候,除了switch语句外,Java编译器使用同样的操作码集。例如,Java提供的最简单的控制流是if语句。当编 阅读全文
posted @ 2019-12-03 22:40 mongotea 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 12.1 二进制补码运算Java虚拟机所支持的所有的整数类型-byte, short、int和long,它们都是带符号的二进制补码数。二进制补码方案既能够描述正整数,也能够描述负整数。在一个二进制补码数中,最重要的位就是它的符号位。符号位为1,表示负整数;符号位为0,表示正整数和数字0。 能够被二进 阅读全文
posted @ 2019-12-03 22:39 mongotea 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 13.1逻辑操作码Java虚拟机的逻辑操作主要针对int和long类型。这些处理int和long类型的操作与处理带符号二进制补码数的方式不同,而是按照通用的位模式进行处理。整数移位通过ishl、ishr, iushr操作码进行。Java的“<<”操作符由ishl实现,“>>”操作符由ishr实现,“ 阅读全文
posted @ 2019-12-03 22:39 mongotea 阅读(79) 评论(0) 推荐(0) 编辑
摘要: 10.1常量入栈操作许多操作码执行常量入栈操作。操作码在执行常量入栈操作之前,使用如下三种方式指明 常量的值:常量值隐式包含在操作码内部,常量值在字节码流中如同操作数一样紧随在操作码 之后,或者从常量池中取出常量。 一些操作码自行指明入栈的常量的类型和值,例如,iconst_1操作码告知Java虚拟 阅读全文
posted @ 2019-12-03 22:38 mongotea 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 11.1转换操作码Java虚拟机包括许多进行基本类型转换工作的操作码,这些执行转换工作的操作码后面没有 操作数,转换的值从桟顶端获得。Java虚拟机从栈顶端弹出一个值,对它进行转換,然后再把转 换结果压入栈。进行int、long, float和double类型之间转换的操作码如表11-1所示,针对这 阅读全文
posted @ 2019-12-03 22:38 mongotea 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 堆碎块是在正常的程序运行过程中产生的。新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活 动的对象之间。请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空闲空间 是足够的,这是因为,堆中没有连续的空闲空间放得下新的对象。在一个虚拟内存系统中,增 长的堆所需要的额外分页 阅读全文
posted @ 2019-12-03 22:19 mongotea 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 8.1.20示例:类型安全性与装载约束 在Java虚拟机的早期实现中,搞乱Java的类型系统是有可能的。一个Java程序可能欺骗Java 虚拟机,用一种类型的对象冒充另一种类型的对象。这种能力让破坏者非常高兴,因为他们可 以欺骗受信任的类非法访问非公开的数据,或者通过把类替换成新的版本改变方法的行为 阅读全文
posted @ 2019-12-03 22:14 mongotea 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 8.1.19示例:卸载无法触及的greeter类 动态装载的类型变为无法触及而要被虚拟机卸载时的例子如下面的程序: 因为引用的类(这里是HowDoYouDo )是被GreeterClassLoader对象装载的。这两个类都是Java API的一部分,不管怎样都会最终被启动类装载器装载,因为loadC 阅读全文
posted @ 2019-12-03 22:12 mongotea 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 不同之处在于,loadClass()试图保证被装载的类型是被装载到用户自定义的类装载器的命名空 间里,而forName()试图确认所需的类型被装载到当前命名空间中,这个当前命名空间就是类 型(该类型的方法包括forName ()调用)所属的定义类装载器的命名空间。 因为forName ()从类Eas 阅读全文
posted @ 2019-12-03 21:55 mongotea 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 8.1.17使用1.2版本的用户自定义类装载器 前一节描述的类装载器最初是为1.1版虚拟机设计的,但也可以在1.2版本中工作。虽然1.2版 本为java.lang.ClassLoader加人了默认的loadClass ()具体实现,这个具体的方法仍然可以被子 类所覆盖。因为loadClass ()的 阅读全文
posted @ 2019-12-03 21:55 mongotea 阅读(123) 评论(0) 推荐(0) 编辑
摘要: loadCIass ()方法从检查被请求调用的类型是否已经被自己装载过了开始。这是通过调用 findLoadedClass ()实现的,后者是ClassLoader的一个方法,传递被请求的类型的全限定名作为参数。如果这个类装载已经被标记为是这个具有该全限定名的类型的初始类装载器, findLoade 阅读全文
posted @ 2019-12-03 21:54 mongotea 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 8.1.12直接引用 •常量池解析的最终目标是把符号引用替换为直接引用。符号引用的格式在第6章中详细定义了,但是直接引用应该是什么格式呢?你可能认为,直接引用的格式也是由不同的java虚拟机实现的设计者决定的。然而,在大多数实现中,总会有一些通用的特征。 指向类型、类变量和类方法的直接引用可能是指向 阅读全文
posted @ 2019-12-03 21:53 mongotea 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 8.1.13 _quick 指令 Java虚拟机的第一版规范中描述了一种用来加速字节码解释的技术,Sun早期的一种java虚拟机实现中曾经使用过它。这种方案是,如果常量池入口已经被解析过,使用常量池人口的操 作码会被一个“_quick”操作码取代。当虚拟机遇到一个_quick指令时,它就知道常量池人 阅读全文
posted @ 2019-12-03 21:53 mongotea 阅读(193) 评论(0) 推荐(0) 编辑