字节码

java解释执行和编译执行

匿名 (未验证) 提交于 2019-12-02 21:35:18
解释执行:将编译好的字节码一行一行地翻译为机器码执行。 编译执行:以方法为单位,将字节码一次性翻译为机器码后执行。 前者的优势在于不用等待,后者则在实际运行当中效率更高。 为了满足不同的场景,HotSpot虚拟机内置了多个即时编译器:C1,C2与Graal。 C1:即Client编译器,面向对启动性能有要求的客户端GUI程序,采用的优化手段比较简单,因此编译的时间较短。 C2:即Server编译器,面向对性能峰值有要求的服务端程序,采用的优化手段复杂,因此编译时间长,但是在运行过程中性能更好。   从Java7开始,HotSpot虚拟机默认采用分层编译的方式:热点方法首先被C1编译器编译,而后 热点方法中的热点再进一步被C2编译(理解为二次编译,根据前面的运行计算出更优的编译优化)。为了不干扰程序的正常运行,JIT编译时放在额外的线程中执行的,HotSpot根据实际CPU的资源,以1:2的比例分配给C1和C2线程数。在计算机资源充足的情况,字节码的解释运行和编译运行时可以同时进行,编译执行完后的机器码会在下次调用该方法时启动,已替换原本的解释执行(意思就是已经翻译出效率更高的机器码,自然替换原来的相对低效率执行的方法)。 JIT编译: 现在主流的商用虚拟机(如Sun HotSpot、IBM J9)中几乎都同时包含解释器和编译器(三大商用虚拟机之一的 JRockit 是个例外

初识java技术体系

落花浮王杯 提交于 2019-12-02 21:31:50
以前一直在学java程序设计语言,学完了就以为自己已经把java学得差不多了,直到最近在看一本书《深入理解java虚拟机》,才发现自己以前学的只不过是冰山一角。相信很多小伙伴跟我一样,在没有了解过java技术体系之前,都搞不明白Java SE,Java EE一系列跟Java是什么关系,今天就来简单说一下java技术体系。 (1)从传统意义上来说,sun公司定义的Java技术体系包括以下几个部分: Java程序设计语言 各种硬件平台上的Java虚拟机 Class文件格式 Java API类库 来自商业机构和开源社区的第三方Java类库 Java程序语言 不用多说,就是我们平常编写的代码等等,我们一开始也是从语言学起; Java虚拟机 则是很重要的一部分,我们都知道Java除了面向对象之外,还有很多其他优点,比如:摆脱了硬件平台的束缚,实现“一次编写,到处运行”,那java是怎么实现这个技术的呢?是因为Java虚拟机有自己一套完善的硬件架构和指令系统,不管具体的操作系统平台是什么,Java程序只要生成在Java虚拟机上运行的目标代码,就可以在多种平台上运行。 Class文件格式 也是Java能够跨平台的基础,Java字节码能够跨不同的虚拟机在不同的平台上运行,是因为这些字节码按照Calss文件格式规范组成了Class文件

简单认识JVM

≡放荡痞女 提交于 2019-12-02 19:39:25
准备:   在具体聊JVM之前,我们先看两张图,通过分析图,咱们慢慢来聊聊JVM。 JVM内存结构图 JVM内存结构脑图   上面两张图中,第二张图相对来说比较直观,就是JVM内存结构都划分成了哪些模块,各个模块各有什么特点。其实这些我们都可以在第一张图中,找到答案,不着急咱们先慢慢的一点点的分析一下第一张图。     我们先来看一下JVM整体的体系结构。 JVM体系结构:    类加载器(ClassLoader): 负责加载.class文件。我们编译期通过javac将.java文件编译成.class文件。在程序运行的时候则就是根据.class文件特有的标示,由类装载器(ClassLoader)来加载.class文件。加载成功后,至于它是否可以运行,就要交给后面的执行引擎(ExecutionEngine)来判断了。    运行时数据区: 这也是我们今天主要分析的部分,也就是JVM的内存结构。它主要分为 方法区、堆、Java栈、程序计数器、本地方法栈 五个部分。    执行引擎: 上面我们说一个.class文件是否可以运行,要看执行引擎,很显然执行引擎负责的最主要的工作就是执行字节码(即.class文件)以及本地方法。      接下来,我想和大家再说说JVM整体工作的流程,或者说JVM从创建到消亡都经历了什么。 JVM工作流程:   我们知道JVM主要的工作就是将编译成

Java注解

狂风中的少年 提交于 2019-12-02 18:26:35
摘抄并学习   以前,【XML】是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越大,XML 的内容也越来越复杂,维护成本变高。   于是,有人提出一种标记式高耦合的配置方式,【注解】。方法上可以进行注解,类上也可以注解,字段属性也可以注解,反正几乎需要配置的地方都可以进行注解。   关于【注解】和【XML】两种不同的配置模式,争论了好多年,各有各的优劣,注解可以提供更大的便捷性,易于维护修改,但耦合度高,而 XML 相对于注解则是相反的。   追求低耦合就要抛弃高效率,追求效率必然会遇到耦合。 注解的本质   接口中有这么一句话,用来描述注解,“ 所有的注解类型都继承自这个普通的接口(Annotation) ”    一个注解准确意义上来说,只不过是一种特殊的注释,如果没有解析它的代码,它可能连注释都不如 。   而解析一个类或者方法的注解往往有两种形式,一种是编译期直接的扫描,一种是运行期反射。反射的事情我们待会说,而编译期的扫描指的是编译器在对 java 代码编译字节码的过程中会检测到某个类或者方法被一些注释修饰,这时它就会对于这些注解进行某些处理。   典型的就是注解 @Override,一旦编译器检测到某个方法被修饰了 @Override 注解,编译器就会检查当前方法的签名是否真正重写了父类的某个方法

我应该采用 Java 12 还是坚持使用 Java 11?

筅森魡賤 提交于 2019-12-02 17:26:37
开发四年只会写业务代码,分布式高并发都不会还做程序员? 编译自 https://blog.joda.org/2018/10/adopt-java-12-or-stick-on-11.html 原文作者 Stephen Colebourne 是一名 Java 开发者,同时也是一位知名的 Java 博主和会议演讲者。 距离 Java 11 的正式发布已过去一个多月,而 Java 12 也正在赶来的路上。根据此前开源中国发起的一项关于开发者使用的 Java 版本的 调查 ,Java 8 仍然是开发者的主流选择,而 Java 11 是 Java 8 之后的首个 LTS 版本,所以有不少开发者表示会选择升级至 Java 11。按照 Java 的发布计划,Java 12 将于明年 3 月推出。那么问题来了,我们是应该采用 Java 12,还是坚持使用 Java 11 呢? 可能你会觉得这是一个无关紧要的问题,但对于那些需要在 JVM 中使用 Java 的开发者,或是比较看重 Java 新特性的开发者,这是一项十分重要的决策。这篇文章将和大家就这个问题进行相关的分析。 Java 发布计划 现在每六个月就会发布一个新的 Java 版本,所以尽管 Java 11 才发布不久,但距离 Java 12 的发布也就剩下不到五个月的时间。作为发布计划的一部分,某些版本会被指定为长期支持版本(LTS)

Java中AOP实现的三种方式

走远了吗. 提交于 2019-12-02 15:13:34
Java中AOP实现的三种方式 字节码:重新编译Java字节码,将切面插入字节码的某些点面上,如 cglib 类加载器:定制类加载器,在类加载时对字节码就行补充,在字节码中插入切面,如 Java Agent 动态代理组件:Java提供的动态代理 来源: https://www.cnblogs.com/HeCG95/p/11751566.html

深入字节码 -- 玩转 ASM-Bytecode

会有一股神秘感。 提交于 2019-12-02 14:32:22
本文是《 深入字节码 -- 使用 ASM 实现 AOP 》的后续博文。在上一篇文章中介绍了如何使用 ASM 动态安插代码到类中,从而简单实现 Aop。文章得到了广大朋友好评,我也希望可以不负众望继续写出可以得到大家认可的更多相关文章。废话不多 进入正题。 古语有云“工欲善其事,必先利其器”。由于 JVM 对字节码十分敏感修改过程中稍微有一丝错误都会导致虚拟机错误,而想要排查错误却是一件比较困难的事情。再加上后面的博文将会很大程度上依赖 “ASM-Bytecode” 工具。因此我觉得有必要在深入制定字节码之前介绍一下如何使用 “ASM-Bytecode” 。 首先安装Eclipse插件,插件的地址为:“http://andrei.gmxhome.de/eclipse/” 我的 Eclipse 版本为 3.7。 安装完成之后重启 Eclipse ,打开菜单 Window -> Show View -> Other... 在分类中选择 Bytecode 视图 为了测试其功能随便创建一个工程并新建一个 HalloWord 程序,在 Eclipse 中打开 “HalloWord.java” 程序查看 Bytecode 视图,你会得到下面这样的代码。 (注意:由于Bytecode会自动感知 Eclipse 编辑器中光标位置从而确定生成的代码范围因此初学者建议将光标放到 “main” 方法中)

深入字节码 -- 使用 ASM 实现 AOP

断了今生、忘了曾经 提交于 2019-12-02 14:32:09
AOP 的概念已经不是什么新鲜事物,所以我在这里就不在介绍 Aop 的概念。目前市面上要做到 Aop 是一件十分简单的事情。Spring、AspectJ、CGLib等等都可以帮助你达到目的,但是它们也只不过是一些泛生品。 上面提到了一些开源的 Aop 实现技术选型,但是我敢说无论你尝试使用上面哪种技术选型都没有我将要介绍的这种方式的运行效率最高。不过读者不要高兴的太早,读完本文想必你就知道是什么原因了。 介绍一款工具ASM,下面是( http://www.ibm.com/developerworks/cn/java/j-lo-asm30/ )内容的一个节选。 ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 可以负责任的告诉大家,ASM只不过是通过 “Visitor” 模式将 “.class” 类文件的内容从头到尾扫描一遍。因此如果你抱着任何更苛刻的要求最后都将失望而归。上面我们介绍的那些 Aop

JVM之内存区域划分

ε祈祈猫儿з 提交于 2019-12-02 11:41:46
程序计数器: 当前线程执行的字节码的指示器。也就是记录当前执行的字节码指令位置用的。 Java虚拟机栈: 虚拟机栈是用来描述Java方法执行的内存模型,每个线程都有自己的Java虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 堆内存: 主要用来给对象分配内存。 方法区(元数据区): 用来存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 来源: https://blog.csdn.net/m0_37039331/article/details/102756895

Java学习笔记

给你一囗甜甜゛ 提交于 2019-12-02 10:51:59
个人的学习笔记,仅做记录 基础知识 JDK,Java开发工具包,包含所需工具和JRE JRE,Java运行环境,包含运行Java所需的核心类库和JVM JVM,Java虚拟机,保证Java跨平台使用,本身不能跨平台使用 第一个Java程序 public class HelloWorld { public static void main ( String [ ] args ) { System . out . println ( "HelloWorld" ) ; } } 1.Java程序的最小单位是类,一个Java程序至少有一个类。 2.Java程序的入口是main方法,main方法的格式是固定的:System.out.println(“HelloWorld”); 3.在控制台输出内容的语句:System.out.println(“要输出的内容”); 4.IDEA中文件的解释:在IDEA中新建一个项目后有一些文件,.idea目录和.iml文件是IDEA开发工具使用的配置文件,不需要操作,可以隐藏。src文件夹,所编写的源文件存放在这个目录下。out目录,是Java程序的输出目录,Java程序运行的时候,生成后缀名为.class的文件存放在该目录下,点击运行按钮,生成.class文件叫做字节码文件,生成字节码文件的过程叫编译。External Libraries,即扩展类库