Tag: 字节码

有堆栈地图框架的更好的解释吗?

我最近一直在研究Java虚拟机规范 ( Java Virtual Machine Specifications ,JVMS),以便更好地理解我的程序是如何工作的,但是我发现了一个我并没有得到的部分。 第4.7.4节描述了StackMapTable属性,在该节中,文档详细介绍了堆栈映射框架。 问题在于它有点罗嗦,我通过实例学习最好; 不通过阅读。 我明白,第一个堆栈映射框架是从方法描述符派生的,但是我不明白这是怎么解释的。另外,我并不完全理解堆栈映射框架在做什么。 我会假设它们与Java中的块相似,但看起来好像你不能在彼此内部有堆栈映射框架。 无论如何,我有两个具体的问题: 堆栈地图框架是做什么的? 第一个堆栈地图框架是如何创build的? 和一个一般的问题: 有人可以提供一个比JVMS更less罗嗦,更容易理解的解释吗?

未使用的导入和对象是否具有性能影响

我怀疑Java代码中未使用的导入和未使用的对象是否会对性能产生影响? 假设一个对象被初始化并且没有被使用,会发生什么? 什么是未使用的import成本

字节码在本地代码上的优点是什么?

看起来你可以用字节码做任何事情,你可以在本地代码中简单快速地做到这一点。 从理论上说,甚至可以通过在字节码中分发程序和库,然后在安装时编译为本地代码,而不是JITing,来保持平台和语言的独立性。 所以一般来说,你想什么时候执行字节码而不是本地的?

Python的基本优化模式有什么用? (python -O)

Python有一个标志-O ,你可以执行解释器。 该选项将生成“优化”的字节码(写入.pyo文件),并给出两次,它会丢弃文档。 从Python的手册页: -O打开基本的优化。 这将编译(字节码)文件的文件扩展名从.pyc更改为.pyo。 给定两次,导致docstrings被丢弃。 这个选项的两个主要特点,我看到它是: 剥离所有断言语句。 这为防止腐败的程序状态提供了防御速度。 但是,你不需要大量的声明来做出改变吗? 你有任何代码,这是值得的(和理智?) 去除所有文档。 在什么应用程序的内存使用如此重要,这是一个胜利? 为什么不把所有的东西都放到C语言模块中? 这个选项有什么用? 它有真实世界的价值吗?

有没有一个llvm Java前端将Java源代码转换为llvm的中间forms?

从我读过的,有一个llvm程序将java字节码转换为llvm的中间forms,叫做class2llvm。 我的问题是,我如何访问这个。 为了访问这个,我需要安装哪些前端。 VMkit是他们的JVM的实现,但我正在寻找如何编译与llvm Java源代码,而不是如何运行它。

为什么在编译为字节码之前,Python不计算常量数运算?

在下面的代码中,为什么Python不将f2编译为与f1相同的字节码? 有没有理由不? >>> def f1(x): x*100 >>> dis.dis(f1) 2 0 LOAD_FAST 0 (x) 3 LOAD_CONST 1 (100) 6 BINARY_MULTIPLY 7 POP_TOP 8 LOAD_CONST 0 (None) 11 RETURN_VALUE >>> def f2(x): x*10*10 >>> dis.dis(f2) 2 0 LOAD_FAST 0 (x) 3 LOAD_CONST 1 (10) 6 BINARY_MULTIPLY 7 LOAD_CONST 1 (10) 10 BINARY_MULTIPLY 11 POP_TOP 12 LOAD_CONST 0 […]

JVM的LookupSwitch和TableSwitch之间的区别?

我有一些难以理解Java字节码中的LookUpSwitch和TableSwitch。 如果我很好理解,LookUpSwitch和TableSwitch都对应于Java源代码的switch语句? 为什么一个JAVA语句生成2个不同的字节码? 每个Jasmin文档: LookupSwitch tableswitch

为什么使用invokedynamic调用Java 8 lambdas?

invokedynamic指令用于帮助VM在运行时确定方法引用,而不是在编译时硬连线。 这在dynamic语言中非常有用,在运行时,确切的方法和参数types是不知道的。 但是Java lambda不是这种情况。 它们被翻译成具有明确定义的参数的静态方法。 而且这个方法可以使用invokestatic来调用。 那么对lambdaexpression式invokedynamic的需求是什么,特别是当性能受到影响的时候呢?

用Java字节码编程

我想用Java字节码编写一个简短的程序(也许是一个Hello World)。 我只想用我的文本编辑器编写字节码并运行它。 我将如何做到这一点? 有个例子吗? 谢谢!

Gradle sourceCompatibility对子项目没有影响

我的机器上安装了Java 6和7。 Gradle使用1.7(使用gradle -v进行检查)。 但是我需要编译我的代码来与Java 1.6兼容。 据我了解的文件,我可以使用sourceCompatibility属性来做到这一点(和间接的targetCompatibility默认为sourceCompatibility )。 所以我添加了以下行到我的构build文件(在根级别,而不是在任何封闭): sourceCompatibility = 1.6 (可以肯定的是我还在一些试验中join了targetCompatibility = 1.6 ,但这不应该有所作为) 为了检查结果是否与1.6完全兼容,我将结果jar解压缩, cd到WEB-INF/classes文件夹中,并在遇到的第一个.class文件上使用javap -verbose 。 但是不pipe是设置目标兼容性还是我使用1.5而不是1.6或者我是否指定了string( '1.6' ),每次javap的结果是 minor version: 0 major version: 51 这意味着它是Java 1.7的字节码,这是错误的。 任何想法,为什么sourceCompatibility不起作用? 或者是javap不正确的方法来检查兼容性? 更新:是的,这实际上是一个多项目生成,但我只检查其中一个子项目的生成结果。 在这个子项目的构build文件中,我提到了所做的更改,以确保它们实际应用。 另外,我在根项目的构build文件中添加了以下内容(如同@Vidya所build议的那样): allprojects { sourceCompatibility = 1.6 targetCompatibility = 1.6 } 但是这也没有帮助。 更新2:我检查了与相关的build.gradle文件中的这个代码片段的sourceCompatibility的设置: compileJava.doFirst { println "source compatibility " + sourceCompatibility […]