首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字节码的验证会发生两次吗?

字节码的验证会发生两次吗?
EN

Stack Overflow用户
提问于 2014-08-28 06:04:43
回答 4查看 3.5K关注 0票数 30

因此,对于JVM内部字节码的验证,我有点困惑。根据Deitel和Deitel的书,Java程序经历了五个阶段(编辑、编译、加载、验证和执行)(第一章)。字节码验证器在“验证”阶段验证字节码。书中没有提到字节码验证器是类加载器的一部分。

然而,根据神谕博士,类加载器执行加载、链接和初始化的任务,并且在链接过程中必须验证字节码。

现在,Deitel和Deitel谈到的字节码验证和这份神谕文件谈到的字节码验证是否是同一个过程?

或者字节码验证发生了两次,一次是在链接过程中,另一次是由字节码验证器进行的?

如Dietel和Dietel在书中提到的描述java程序的阶段的图片(我从nobalG :)下面的答案中借用了这张图)

EN

回答 4

Stack Overflow用户

发布于 2014-08-28 06:11:20

不是的。

来自JVM Spec 4.10

尽管Java编程语言的编译器必须只生成满足前几节中所有静态和结构约束的类文件,但Java虚拟机无法保证它被要求加载的任何文件都是由该编译器生成或正确形成的。

然后进行具体的验证过程。

JVM规范5.4.1

验证(§4.10)确保类或接口的二进制表示在结构上是正确的(§4.9)。验证可能会导致加载额外的类和接口(第5.3节),但不需要使它们得到验证或准备。

指定链接引用(§4.10 )的部分--不是作为一个单独的进程,而是加载类的一部分。

当您遇到这样的问题时,JVM和JLS是很好的文档。

票数 9
EN

Stack Overflow用户

发布于 2014-08-28 06:12:06

没有这样的两次验证

NO,就验证而言,仔细看看用java编写的程序是如何在下面的映像中经历不同阶段的,您将看到没有这样的两次验证,但是代码只验证了一次。

  • 编辑-程序员编写程序(最好在记事本上)并将其保存为“.java”文件,然后编译器进一步使用该文件进行编译。
  • 编译-这里的编译器接受‘.java’文件,编译它并查找程序范围中的任何可能错误。如果发现任何错误,就向程序员报告。如果没有错误,程序将转换为字节码并保存为“.class”文件。
  • load --现在称为“类加载器”的组件的主要目的是在中加载字节代码。它还没有执行代码,但只是将其加载到JVM的内存中。
  • 验证-在加载代码后,JVM的子部分“字节码验证器”检查字节码并验证其真实性。它还检查字节码是否有可能导致某些恶意结果的此类代码。JVM的这个组件确保了安全性。
  • 执行-下一个组件是执行引擎。执行引擎使用JIT编译器逐行解释代码。JIT编译器执行的速度相当快,但会消耗额外的缓存内存。
票数 9
EN

Stack Overflow用户

发布于 2014-08-28 06:15:48

规范列出了字节码验证的4个阶段。这些步骤在功能上是不同的,不会被误解为重复相同的事情。就像多通道编译器使用每次传递来设置下一次传递一样,阶段不是重复的,而是为单一的总体目的而编排的,每个阶段都完成某些任务。

除非字节码被更改,否则没有理由对其进行两次验证。

本报告将对核查进行说明。

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25541778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档