JVM如何通过JIT从Java应用程序运行生成的机器代码?

时间:2011-03-15 22:08:57

标签: java jvm

JVM如何可能动态地将字节码编译成本机代码然后执行它?我可以想象有可能将数据值写入内存,但如果我没记错,程序就无法写入包含指令的内存(否则病毒可能会使用此功能并迅速扩散)。

3 个答案:

答案 0 :(得分:4)

很少有架构实现内存保护级别(只有操作系统对包含代码的内存区域具有写访问权限),而Java使用JIT的内存绝对不会。

病毒确实使用此功能,甚至可以更快地扩散。但是当你考虑它时,在修改自己的代码的过程中没有任何本质上的危险。它没有比写入文件然后加载库更危险。

答案 1 :(得分:4)

通常,您无法直接写入包含代码的内存部分,但有一些方法可以覆盖它。对于JIT,通常所做的是在堆上有一些读写数据空间,然后使用mprotect等操作使其可执行。

答案 2 :(得分:3)

操作系统确实提供了分配“可执行”内存的工具。在生成JITed代码时,JVM需要以与标准malloc()不同的方式分配目标内存。

例如,在Windows上,将VirtualAllocPAGE_EXECUTE一起使用。 Linux,AIX等中存在类似的功能......