字节码

通过Java字节码发现有趣的内幕之String篇(一)

北城以北 提交于 2019-11-30 19:19:05
很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西。这里没有对Java字节码知识进行介绍,如果想了解更多的Java字节码或对其感兴趣的朋友可以先阅读 字节码基础:JVM字节码初探 。 String字面量可以通过'=='判断两个字符串是否相同,是因为大家都知道'=='是用来判断两个对象的值引用地址是否一致,两个值一样的字符串字面量定义是否指向同一个值内存地址呢?答案是肯定的。 package com.jaffa.test.string; public class ConstPoolTest { public static void main(String[] args){ String str1 = "strVal_1"; String str2 = "strVal_1"; //print str1==str2 is true System.out.printf("str1==str2 is %b",str1==str2); } } 代码中声明了str1和str2的字面量值都为strVal_1,并且打印出str1==str2为true,说明两个str1和str2变量同时指向同一个字符串常量值的内存地址,下面通过Java字节码来验证这个结果。

ssh三个框架各自所有版本下载地址

杀马特。学长 韩版系。学妹 提交于 2019-11-30 18:24:18
ssh三个框架各自所有版本下载地址如下 Struts framework 下载地址: http://mirror.bjtu.edu.cn/apache/struts/binaries/ hibernate framework 下载地址: http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/h/project/hi/hibernate/ spring framework 下载地址: http://www.springsource.org/download http://www.springsource.com/download/community?sid=882865 struts2 commons-logging-1.0.4.jar 主要用于日志处理 freemarker-2.3.8.jar 模板相关操作需要包 ognl-2.6.11.jar ognl表达示所需包, xwork-2.0.7.jar xwork核心包 struts2-core-2.0.14.jar struts2核心包 struts2-spring-plugin-2.0.14.jar struts2整合spring所需要的包 如果还需要整合其它框架或者插件,再导入其它的包 hibernate Hibernate3

python如何编译py文件生成pyc、pyo、pyd以及如何和C语言结合使用

[亡魂溺海] 提交于 2019-11-30 14:50:46
python执行py文件的流程 当我们执行一个py文件的时候,直接python xx.py即可,那么这个流程是怎么样的呢。先说明一下,python执行代码实际上是先打开文件然后执行里面的代码,所以文件的扩展名不一定是py的形式,txt形式也是依旧可以成功执行,只要文件里面的代码是符合python规范的。下面我们来看看python是怎么执行py文件的。 先将文件里面的内容读取出来,scanner对其进行扫描,切分成一个个的token parser对token进行解析,建立抽象语法树(AST,abstract syntax tree) compiler对ast进行编译,得到python字节码 code evaluator执行字节码 我们注意到第三个过程,是一个编译的过程。说明python即便是解释性语言,也依旧存在着编译的过程,这一点和java是一样的。之所以要存在编译的过程,主要是为了优化执行的速度,比如元组,或者函数里面出现了yield,这一点在编译的时候就已经确定了,编译的时候就已经知道这是一个什么样的数据结构,那么在执行的时候可以很快速的分配相应的内存。我们在打开python文件所在的目录的时候,总会看到一个__pycache__的文件夹,这里面存放的就是python编译之后的字节码。当执行python文件的时候,会检测当前的__pycache__目录中是否有对应的字节码

JDK、JRE、JVM详解

醉酒当歌 提交于 2019-11-30 11:52:35
JDK 、JRE、JVM详解 从包含的关系上讲 JDK>JRE>JVM 。 从概念上讲 JDK是JAVA开发工具 ,用它来开发JAVA程序。 JRE是JAVA运行环境 ,开发出来的JAVA程序只要有JRE就能运行。 JVM是JAVA虚拟机 ,是JRE的一部分,对于JAVA类的操作基本上都是在JVM上完成的。 JDK JDK(Java Development Kit) 是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment,一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JDK是JAVA开发工具包,它用来开发JAVA程序,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。 JDK目录: bin:最主要的是编译器(javac.exe) include:java和JVM交互用的头文件 lib:类库 jre:java运行环境 (注意:这里的bin、lib文件夹和jre里的bin、lib是 不同的) JRE JRE(Java Runtime Environment,Java运行环境),是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java基础的类库。 JAVA运行环境,开发出来的JAVA程序只要有JRE就能运行

JDK,JRE,JVM 的区别与联系

瘦欲@ 提交于 2019-11-30 08:59:31
文章目录 1 JDK 2 JVM 3 JRE 尽管学习了这么多年的 java ,但一直觉得自己学习得比较粗糙,对一些基本概念掌握得也不是很清楚,例如:JDK、JRE、JVM。所以在这里首先记录一下 JDK、JRE、JVM 的区别,来帮助自己巩固基础。 JDK、JRE、JVM 是 Java 语言中较为核心的概念了,它们看上去极为相似,大多数开发人员也很少去计较它们之间的区别。但实际上,它们之间还是有着一定的区别,并且所针对的目标也不一样。 JDK、JVM、JRE 关系图: 1 JDK JDK,全称是 Java Development Kit,用中文来讲就是 Java 开发工具包,是整个 Java 的核心,提供了 编译、调试和执行 Java 程序 所需的所有工具、可执行文件和二进制文件。JDK 拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc)。 此外,JDK 是特定于平台的软件,因此 Windows,Mac 和 Unix 系统有着不同的安装程序。 2 JVM JVM,全称是 Java Virtual Machine,也就是 Java 虚拟机,它是 Java 编程语言的核心。 当我们运行 Java 程序时,JVM 负责将字节码转换为机器特定的代码。JVM 提供诸如内存管理、垃圾回收、安全性等核心 Java 功能,而且是可自定义的,我们可以使用 java

JVM性能优化, Part 2 ―― 编译器

巧了我就是萌 提交于 2019-11-30 07:05:15
ImportNew注:本文是JVM性能优化 – 第2篇 《JVM性能优化, Part 2 ―― 编译器》第一篇 《JVM性能优化, Part 1 ―― JVM简介 》 作为JVM性能优化系列文章的第2篇,本文将着重介绍Java编译器,此外还将对JIT编译器常用的一些优化措施进行讨论(参见“JVM性能优化,Part 1″中对JVM的介绍)。Eva Andreasson将对不同种类的编译器做介绍,并比较客户端、服务器端和层次编译产生的编译结果在性能上的区别,此外将对通用的JVM优化做介绍,包括死代码剔除、内联以及循环优化。 Java编译器存在是Java编程语言能独立于平台的根本原因。软件开发者可以尽全力编写程序,然后由Java编译器将源代码编译为针对于特定平台的高效、可运行的代码。不同类型的编译器适合于不同应用程序的需求,使编译结果可以满足期望的性能要求。对编译器基本原理了解得越多,在优化Java应用程序性能时就越能得心应手。 什么是编译器 简单来说,编译器就是将一种编程语言作为输入,输出另一种可执行语言的工具。大家都熟悉的javac就是一个编译器,所有标准版的JDK中都带有这个工具。javac以Java源代码作为输入,将其翻译为可由JVM执行的字节码。翻译后的字节码存储在.class文件中,在启动Java进程的时候,被载入到Java运行时中。 标准CPU并不能识别字节码

游戏编程模式--字节码

馋奶兔 提交于 2019-11-30 06:35:40
  ”通过将行为编码成虚拟机指令,而使其具备数据的灵活性。” 动机   制作游戏很有趣,但制作游戏却不易,特别是现在的游戏。现代游戏随着硬件技术的发展,游戏内容和玩法变得越来越丰富多样,在以前可能代码就几千行,但现代游戏的代码往往能达到几十万甚至几百万行。这么大的代码量,如果我们选择了c++这样的重量级语言(对于性能的追求,往往会让我们选择c或c++),编译的时间就不得不考虑了。游戏一个独有的苛刻的要求:有趣。玩家需要既新奇又具有平衡性的体验。这就需要持续迭代,但假如我们每一次修改都要工程师改底层的代码,然后等待漫长的重新编译,那么整个游戏的创作流程就被毁了。比如我们当前流行的moba类游戏,对于每个英雄的技能效果,设计都需要反复的修改才能在整体上达到一个平衡,如果不能提供一种修改后快速反馈结果的方式,相信没有那个设计师能坚持下去。   很明显,我们的编程语言不适合解决这个问题,我们需要另一种方式把这些经常需要修改的部分转移到安全沙箱中,同时让它们易于加载且在物理上于游戏的可执行文件分离。其实这些特性就优点像“数据”了,我们在运行的时候把它加载到内存中,然后按某种方式执行。也就是说我们使用“数据”来定义行为,然后执行这些数据。那有什么方法能让我们实现这种功能呢?其中一个是解释器模式,一个就是我们本节要讲的字节码模式。   首先我们简单来了解一下解释器模式

CSAPP 3-1 程序地机器级表示

和自甴很熟 提交于 2019-11-30 06:34:39
1 本章总述 1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器、数据类型和指令集; 2) 学习了程序如何将数据存储在不同的内存区域中 —— 程序开发人员需要知道一个变量是存储在运行时栈中, 亦或是在某个动态分配的数据结构中, 还是全局程序数据的一部分; 3) 程序是以指令序列来表示的, 每条指令都完成一个单独的操作; 部分程序状态, 比如寄存器和运行时栈, 对程序开发人员来说是直接可见的; 4) 编译器必须使用多条指令来产生和操作各种数据结构, 以及实现包括条件、循环和过程等在内的控制结构; 2 扩展内容 (1) C 语言中缺乏边界检查, 这就是的许多程序容易出现缓冲区溢出 —— 容易受到恶意入侵和攻击. (2) 编译 C++ 和 C 的区别: C++ 的早期实现只是简单地执行了从 C++ 源到 C 源的转换, 并对结果运行 C 编译器, 产生目标代码; C++ 的对象用结构来表示, 类似于 C 中的 struct ; C++ 的方法使用指向实现方法的代码的指针来表示的. (3) Java 的编译方式: Java 的目标代码是一种特殊的二进制表示 —— Java 字节码 —— 可以看作是虚拟机的机器级程序; Java 用字节码作为程序的低级表示, 优势是: 相同的代码可以在许多不同的机器上执行, 只需要在不同的机器上安装 Java 虚拟机(JVM

【JVM学习】2.Java虚拟机运行时数据区

拜拜、爱过 提交于 2019-11-30 06:19:44
来源: 公众号: 猿人谷 这里我们先说句题外话,相信大家在面试中经常被问到 介绍Java内存模型 ,我在面试别人时也会经常问这个问题。但是,往往都会令我比较尴尬,我还话音未落,面试者就会“背诵”一段(Java虚拟机是由堆、方法区、虚拟机栈,吧啦吧啦。。。),估计心里还一脸自豪的想幸好哥提前在网上搜过,早有准备。每每这个时候,我都不忍心打断,因为“背诵”的真的太顺畅了! 这也怪不得面试者,首先Java虚拟机方面的知识,对中高级程序猿来说,工作中正面接触Java虚拟机的东西不多。其次,这个其次咱得好好唠唠,网上搜个Java内存模型,度娘推的第一页大都是介绍Java运行时数据区的,起到了一定的误导作用,大写的尴尬。 本篇将给各位小伙伴先详细介绍Java运行时数据区的组成,Java内存模型也是虚拟机里面的重点,后面会单独抽出一篇来进行介绍。 1.运行时数据区介绍 程序运行所需的内存空间,有些是不能在编译期就能确定,得要在运行期根据实际运行状况动态地在系统中创建。Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 如图所示,堆和方法区是所有线程共享的公共区域,堆和方法区所占的内存空间是由JVM负责管理的

【JVM学习】2.Java虚拟机运行时数据区

左心房为你撑大大i 提交于 2019-11-30 06:19:34
来源: 公众号: 猿人谷 这里我们先说句题外话,相信大家在面试中经常被问到 介绍Java内存模型 ,我在面试别人时也会经常问这个问题。但是,往往都会令我比较尴尬,我还话音未落,面试者就会“背诵”一段(Java虚拟机是由堆、方法区、虚拟机栈,吧啦吧啦。。。),估计心里还一脸自豪的想幸好哥提前在网上搜过,早有准备。每每这个时候,我都不忍心打断,因为“背诵”的真的太顺畅了! 这也怪不得面试者,首先Java虚拟机方面的知识,对中高级程序猿来说,工作中正面接触Java虚拟机的东西不多。其次,这个其次咱得好好唠唠,网上搜个Java内存模型,度娘推的第一页大都是介绍Java运行时数据区的,起到了一定的误导作用,大写的尴尬。 本篇将给各位小伙伴先详细介绍Java运行时数据区的组成,Java内存模型也是虚拟机里面的重点,后面会单独抽出一篇来进行介绍。 1.运行时数据区介绍 程序运行所需的内存空间,有些是不能在编译期就能确定,得要在运行期根据实际运行状况动态地在系统中创建。Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 如图所示,堆和方法区是所有线程共享的公共区域,堆和方法区所占的内存空间是由JVM负责管理的