字节码

Java | IDEA中查看字节码

纵饮孤独 提交于 2020-02-28 12:56:49
在JDK工具包的bin目录下,有一个java可执行文件javap即javap.exe,该工具可以查看java编译后的class文件。使用命令如下: javap -c Test.class 因此可以基于该命令在IDEA中设置宏,来快捷使用javap查看字节码,设置过程如下: 1、打开IDEA,点击File->Settings。选择Tools->External Tool。点击左上角绿色的加号,如下: 2、然后按照如下图所示修改即可: 注意: Name为工具名称,随意填写即可; Program表示所使用的程序,选择JDK中bin目录下的javap.exe; Arguments表示参数,如下填写即可:FileNameWithoutExtension可以点击右侧的Insert搜索, -c $FileNameWithoutExtension$.class Working directory表示当前工作目录,值也可以点击右侧的Insert搜索,路径拼接如下: $OutputPath$\$FileDirRelativeToSourcepath$ 3、查看字节码: 在对应的java文件编辑区域内里面点击右键,选择External Tools->Show Byte Code,便可以在IDEA终端显示对应的字节码。 来源: CSDN 作者: m.berg 链接: https://blog.csdn

Java虚拟机内存区域

馋奶兔 提交于 2020-02-28 10:20:34
Java虚拟机知识点总结(一) 文章目录 Java虚拟机知识点总结(一) 1、Java内存区域 1.1 Java内存区域 1.2 虚拟机对象 1、Java内存区域 1.1 Java内存区域 1、程序计数器 ​ 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条字节码指令,分支,循环,跳转,异常处理,线程恢复等功能都依赖这个计数器来完成。 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“ 线程私有 ”的内存。 2、java虚拟机栈 与程序计数器一样,Java虚拟机栈也是 线程私有 的,它的生命周期和线程相同,描述的是Java方法执行的内存模型。 每个方法的执行都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。 每个方法的调用到执行完成的过程,就是对应着一个栈在虚拟机栈中的入栈和出栈的过程 。 局部变量表 :存放编译期可知的各种基本数据类型,引用类型,局部变量表的大小在编译期便已经可以确定,在运行时期不会发生改变 。 栈的大小 :如果栈满了,StackOverFlowError,递归调用很常见。 如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError 异常。 3、本地方法栈

WEB一周总结(1)待补充

风流意气都作罢 提交于 2020-02-28 02:09:35
1.网页设计作业--小组介绍 图片来自https://weibo.com/hxLMo?sudaref=www.baidu.com&display=0&retcode=6102 2.WEB概述 3.WEB JSP环境搭建知识总结 3.1手工搭建+其他知识点 JSP (JSP=JAVA+HTML)页面运行环境的搭建: 安装JDK (含有JAVA 编译工具,将servlet源码compile为字节码;JVM执行字节码文件<.class>,返回客户端) 安装WEB服务器 (JSP=JAVA+HTML) 配置环境变量 (操作系统易找到编译器,解释器所在路径 java程序编译执行过程中易定位到所需要的类库 保证tomcat安装迅速找到jvm) jdk文件夹:bin 启动命令+工具命令 include java+jvm交互的头文件 lib 类库 jre java运行环境(bin:jvm执行文件+动态链接库文件 lib:jre的类库) tomcat文件夹: bin 存放启动+关闭tomcat服务器文件 common conf logs server webapps 存放Web应用文件,若不放这需要进行单独文件的映射 work 存放jsp页面转换为servlet文件和字节码文件 注意:\common目录下的文件可以被TOMCAT服务器程序和所有JSP页面程序访问

Byte-Buddy 初探

戏子无情 提交于 2020-02-27 16:04:20
参考 https://blog.csdn.net/undergrowth/article/details/86493336 核心Code ByteBuddy 流式api方式的入口类 提供Subclassing/Redefining/Rebasing方式改写字节码 所有的操作依赖DynamicType.Builder进行,创建不可变的对象 ElementMatchers(ElementMatcher) 提供一系列的元素匹配的工具类(named/any/nameEndsWith等等) ElementMatcher(提供对类型、方法、字段、注解进行matches的方式,类似于Predicate) Junction对多个ElementMatcher进行了and/or操作 Implementation(用于提供动态方法的实现) FixedValue(方法调用返回固定值) MethodDelegation(方法调用委托,支持以下两种方式) Class的static方法调用 object的instance method方法调用 DynamicType(动态类型,所有字节码操作的开始,非常值得关注) Unloaded(动态创建的字节码还未加载进入到虚拟机,需要类加载器进行加载) Loaded(已加载到jvm中后,解析出Class表示) Default(DynamicType的默认实现

即时(JIT)编译器有什么作用?

ぃ、小莉子 提交于 2020-02-27 12:40:01
与非JIT编译器相比,JIT编译器专门做什么? 有人可以给出简洁明了的描述吗? #1楼 Java编译器生成字节代码(与体系结构无关)后,执行将由JVM(在Java中)处理。 字节码将由加载程序加载到JVM中,然后解释每个字节指令。 当我们需要多次调用一个方法时,我们需要多次解释相同的代码,这可能比需要花费更多的时间。 因此,我们有了JIT(即时)编译器。 将字节加载到JVM(运行时)后,整个代码将被编译而不是解释,从而节省了时间。 JIT编译器仅在运行时起作用,因此我们没有任何二进制输出。 #2楼 JIT-及时,单词本身说出何时需要(按需) 典型场景: 源代码已完全转换为机器代码 JIT场景: 源代码将转换为汇编语言,例如结构[对于C#来说,是用于ex IL(中间语言),对于Java,是ByteCode)。 仅当应用程序需要的中间代码仅转换为机器代码时,才将中间代码转换为机器语言。 JIT与非JIT比较: 在JIT中,并非所有代码都首先转换为机器代码,一部分必需的代码将被转换为机器代码,然后,如果所调用的方法或功能不在机器中,则将其转换为机器代码...它减少了CPU的负担。 由于机器代码将在运行时生成...。JIT编译器将生成针对机器的CPU体系结构进行了优化的机器代码。 JIT示例: 在Java中,JIT在JVM(Java虚拟机)中 在C#中,它在CLR(公共语言运行时)中

JavaScript引擎工作原理

守給你的承諾、 提交于 2020-02-26 12:18:20
web前端教程之JavaScript引擎工作原理,JavaScript是web前端人员必须要掌握的知识点之一,也是一门高级语言。最初JavaScript只是在web浏览器中运行,随着Node的出现,JavaScript也可以在服务端运行。接下来的web前端教程就给大家讲解一下JavaScript引擎工作原理。 JavaScript引擎是什么? JavaScript引擎是一种用于将我们的代码转换为机器可读语言的引擎。如果没有JavaScript引擎,你编写的代码对计算机来说简直是一堆“胡言乱语”。不仅仅是JavaScript,其他所有编程语言都需要一个类似的引擎,来将这些“胡言乱语”转换成对计算机有意义的语言。 JavaScript引擎的组成部分有哪些? 1、编译器。主要工作是将源代码编译成抽象语法树,然后在某些引擎中还包含将抽象语法树转换成字节码。 2、解释器。在某些引擎中,解释器主要是接受字节码,解释执行这个字节码,然后也依赖来及回收机制等。 3、JIT工具。一个能够JIT的工具,将字节码或者抽象语法树转换成本地代码,当然它也需要依赖牢记垃圾回收器和分析工具(profiler)。它们负责垃圾回收和收集引擎中的信息,帮助改善引擎的性能和功效。 JavaScript引擎是如何工作的? JavaScript的工作形式取决于是什么引擎。目前比较常用的JavaScript引擎有两个

类加载器

半腔热情 提交于 2020-02-26 10:35:56
类加载器 类加载的机制的层次结构 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载,这里我们需要了解一下类加载的过程,如下: Jvm执行class文件 步骤一、类加载机制 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。 当系统运行时,类加载器将.class文件的二进制数据从外部存储器(如光盘,硬盘)调入内存中,CPU再从内存中读取指令和数据进行运算,并将运算结果存入内存中。内存在该过程中充当着"二传手"的作用,通俗的讲,如果没有内存,类加载器从外部存储设备调入.class文件二进制数据直接给CPU处理,而由于CPU的处理速度远远大于调入数据的速度,容易造成数据的脱节,所以需要内存起缓冲作用。 类将.class文件加载至运行时的方法区后,会在堆中创建一个Java.lang.Class对象,用来封装类位于方法区内的数据结构

解释器与编译器

落爺英雄遲暮 提交于 2020-02-26 07:26:32
http://blog.chinaunix.net/uid-22363424-id-113275.html 1. 在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类:编译型语言和解释型语言。 2. 由编译型语言编写的源程序需要经过编译、汇编和链接才能输出目标代码,然后机器执行目标代码,得出运行结果,目标代码由机器指令组成,一般不能独立运行,因为源程序中可能使用了某些汇编程序不能解释引用的库函数,而库函数代码又不在源程序中,此时还需要链接程序完成外部引用和目标模块调用的链接任务,最后输出可执行代码。C、C++、Fortran、Pascal、Ada都是编译实现的。 3. 解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码,这种中间代码与机器代码是不同的,中间代码的解释是由软件支持的,不能直接使用硬件,软件解释器通常会导致执行效率较低。用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。与编译程序不同的是,解释程序的任务是逐一将源程序的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码后再执行。对于解释型Basic语言,需要一个专门的解释器解释执行 Basic程序

JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!

五迷三道 提交于 2020-02-25 22:04:29
JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试。无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎。不管是工作还是面试中,JVM都是必考题。如果不懂JVM的话,薪酬会非常吃亏。其实学习JVM并不仅仅可以用于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。 JVM的优势 想要告别增删改查和简单开发,而是去做Java性能分析和调优工作,那么JVM绝对是一把助力的利剑。对于Java开发者而言,只有熟悉底层虚拟机的运行机制,才能通过JVM日志深入到字节码的层次去分析排查问题,发现隐性的系统缺陷,进而提升系统性能。 学习JVM的原因,本质是让你了解Java程序是如何被执行且优化的。这样一来,你才可以从内部入手,达到高效编程的目的。同时,你也可以为学习更深层、更核心的Java技术打好基础,且对于面试JVM时阿里是100%必问常问的高频点之一。 于是,一位有着十余年经验的互联网分布式高并发技术老兵,梳理自己多年 JVM 实战经验,写了这本书【实战Java虚拟机】,以帮助更多工程师更快,更深入的了解 JVM 作者注重理论联系实际,对于理论性较强的知识点安排了大量的实践案例来说明和进行实际操作,具有非常强的实践指导意义 书籍内容共分为十一个章节 第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。 第4

Java 字节码

こ雲淡風輕ζ 提交于 2020-02-25 20:38:32
Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于Java语言的深度理解和运用,毕竟是很少会有人涉及的话题。InfoQ中文站特地邀请IBM高级工程师成富为大家撰写这个《Java深度历险》专栏,旨在就Java的一些深度和高级特性分享他的经验。 在一般的Java应用开发过程中,开发人员使用Java的方式比较简单。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其“ 编写一次,到处运行(Write once, run anywhere) ” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码