首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何判断您的Java程序是否在GraalVM AOT上下文中运行?

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

Stack Overflow用户
提问于 2018-05-09 18:28:12
回答 3查看 840关注 0票数 5

我有一个Java程序。我使用Graal的native-image (即GraalVM AOT,又名SubstrateVM)构建一个二进制文件。

我的程序可以使用Java运行时执行,也可以从本机映像二进制文件执行。知道我在哪个上下文中运行的最佳方法是什么?

(一般来说,这可能是一种糟糕的做法,但我认为,在某些并非罕见的情况下,这是不可避免的/必要的。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-18 17:56:46

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

代码语言:javascript
运行
AI代码解释
复制
ImageInfo.inImageCode()
ImageInfo.inImageRuntimeCode()
ImageInfo.inImageBuildtimeCode()
ImageInfo.isExecutable()
ImageInfo.isSharedLibrary()
票数 4
EN

Stack Overflow用户

发布于 2018-05-11 03:53:21

编辑:现在有了一个API。见answer 7983712的答案。

它在GraalVM中的实现方式是捕获com.oracle.graalvm.isaot系统属性:在构建com.oracle.graalvm.isaot映像时将其设置为true。如果将此与静态初始化器在图像生成过程中运行的事实相结合,则可以使用

代码语言:javascript
运行
AI代码解释
复制
static final boolean IS_AOT = Boolean.getBoolean("com.oracle.graalvm.isaot")

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

这对于切断最终输出中不想要的路径也很有用:例如,如果您有一些代码使用支持向量机不支持的特性(例如,动态类加载),则可以使用!IS_AOT对其进行谓词。

票数 5
EN

Stack Overflow用户

发布于 2018-05-09 18:28:12

我倾向于检查某些系统属性的存在/缺失。当我在Graal AOT下打印系统属性时,我会看到:

代码语言:javascript
运行
AI代码解释
复制
{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.class.path。我将省略列出冗长的Java版本,而是链接到另一个版本,从而列出通常的Java系统属性:

Java System.getProperty()方法所识别的标准键的完整列表是什么?

因此,一种方法似乎是检查是否缺少一个或多个java.*属性。

AFAIK没有在SubstrateVM中设置这些的计划。但是系统属性是可变的,所以人们可以选择伪造它们。

但不管怎样,有个方法可以做到:

代码语言:javascript
运行
AI代码解释
复制
def isGraalAOT = System.properties.getProperty("java.class.path") == null
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50264604

复制
相关文章

相似问题

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