当前位置: 首页 > 知识库问答 >
问题:

如何判断Java程序是否在GraalVM AOT上下文中运行?

薄瑞
2023-03-14

我有一个小Java程序。我使用Graal的原生图像(即GraalVM AOT又名SubstrateVM)构建了一个二进制文件。

我的程序可以在Java运行时执行,也可以从本机映像二进制文件执行。判断我所处环境的最佳方式是什么?

(总的来说,这可能是一种不好的做法,但我相信在某些并不罕见的情况下,这是不可避免的/必要的。)

共有3个答案

齐泰
2023-03-14

我倾向于检查是否存在某些系统属性。当我在Graal AOT下打印系统属性时,我看到:

{os.arch=x86_64, file.encoding=UTF-8, user.home=/Users/thom, path.separator=:, os.name=Mac OS X, user.dir=/Users/thom, line.separator=
, sun.jnu.encoding=UTF-8, file.separator=/, java.io.tmpdir=/var/folders/0x/rms5rjn526x33rm394xwmr8c0000gn/T/, user.name=thom}

正如您可能注意到的,它相当短,缺少了所有常见的java* java这样的。班路径。我将省略列出冗长的Java版本,而是链接到另一个版本,以便列出常见的Java系统属性:

Java系统识别的标准密钥的完整列表是什么。getProperty()方法?

因此,一种方法似乎是检查一个或多个java* 属性不存在。

抱歉,没有计划在SubstrateVM中设置这些。但系统属性是可变的,因此人们可能会选择伪造它们。

但无论如何,这里有一个方法:

def isGraalAOT = System.properties.getProperty("java.class.path") == null

宇文俊明
2023-03-14

编辑:现在有了一个API。请参阅用户7983712的答案。

GraalVM中的方法是捕获com.oracle.graalvm.isaot系统属性:在构建AOT映像时将其设置为true。如果您将此与静态初始化器在映像生成期间运行的事实结合起来,您可以使用

static final boolean IS_AOT = Boolean.getBoolean("com.oracle.graalvm.isaot")

运行本机映像时,此布尔值将保持为真。

这对于切断最终输出中不需要的路径也很有用:例如,如果您有一些代码使用了SVM不支持的功能(例如,动态类加载),您可以使用对其进行断言!是_AOT

公冶和豫
2023-03-14

GraalVM现在提供了一个用于检查AOT上下文的API:

ImageInfo.inImageCode()
ImageInfo.inImageRuntimeCode()
ImageInfo.inImageBuildtimeCode()
ImageInfo.isExecutable()
ImageInfo.isSharedLibrary()
 类似资料:
  • 问题内容: 在Linux中使用屏幕时,如何确定我是否在屏幕中?如果可以,我可以退出屏幕,但是如果没有,那么我将关闭终端。 在执行操作时,我可以查看是否还连接了其他屏幕,但是如何知道我的当前终端是否是这些已连接屏幕之一? 问题答案: 检查。如果为空,则您位于“真实”终端上。如果包含任何内容,则为您所在屏幕的名称。 如果您不在屏幕上: 如果您在屏幕上:

  • 本文向大家介绍使用typeof判断function是否存在于上下文,包括了使用typeof判断function是否存在于上下文的使用技巧和注意事项,需要的朋友参考一下 在窗口加载时,使用typeof判断function是否存在于上下文

  • 问题内容: 如何确定我的应用程序是否在开发服务器上运行?我想,我可以检查的价值,并假设如果是那么它的开发服务器上运行,但我更愿意知道肯定不是依靠惯例。 问题答案: 当然,可能是在META上设置的,并且在另一个服务器环境中有一个模块,该模块通过极端重合命名,但是我希望这可以帮助你。 顺便说一句,我是通过在开发服务器上运行时制作一个语法上无效的模板来发现这一点的,然后在和部分中搜索了有趣的内容,因此我

  • 问题内容: 如何确定运行我的应用程序的JVM是32位还是64位?具体来说,我可以在程序中使用哪些函数或属性来检测到这一点? 问题答案: 你使用以下方法检索标记此JVM的位数的系统属性: 可能的结果是: “” – 32位JVM “” – 64位JVM “” –未知的JVM 如HotSpot常见问题解答所述: 编写Java代码时,如何区分32位和64位操作? 没有公共的API可以区分32位和64位操作

  • 问题内容: 我有这段代码,用于检查从我的应用程序中许多地方调用的Activity的Intent中是否有多余的值: 如果未设置isNewItem,我的代码会崩溃吗?在我调用它之前,有什么方法可以告诉它是否已设置吗? 处理此问题的正确方法是什么? 问题答案: 正如其他人所说,两者和都可能返回null。因此,您不想将调用链接在一起,否则您可能最终会调用,这将引发并导致应用程序崩溃。 这就是我要完成的方法

  • 本文向大家介绍Python脚本判断 Linux 是否运行在虚拟机上,包括了Python脚本判断 Linux 是否运行在虚拟机上的使用技巧和注意事项,需要的朋友参考一下 在 WebHostingTalk 论坛上有些国外奸商会把虚拟机当作独立服务器卖,去年7月份的时候就有一位中国同胞上当受骗,并在 WHT 上发帖声讨,证据确凿,甚至连服务商自己也承认,回帖达355篇。这家独立服务器/VPS 提供商 H