詹金斯未能开始32岁

我正在运行詹金斯1.557。 我有一份工作需要使用32位版本的JDK 1.6_u45构建。 我在作业的JDK设置中正确配置了该版本。 但是,当我尝试运行该作业时,出现以下错误。

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

如果我将作业的JDK设置切换为64位版本,则可以创建JVM并且它可以正常运行。 服务器有8GB可用内存,我甚至试图传入JAVA_OPTS = -Xms512m -Xmx1024m&ANT_OPTS = -Xms512m -Xmx1024m的字符串参数给构建,但无济于事。

请注意这不是重复的无法为对象堆预留足够的空间。 如果我尝试在常规命令行(Windows环境变量JAVA_HOME指向与Jenkins尝试相同的32位JDK安装)中构建项目,则会生成项目。 这似乎是詹金斯的一个具体问题。

我的猜测是在Jenkins的某个地方(或者在一些隐藏的Jenkins配置文件中),JVM堆大小对于32位JVM而言设置得太大,但我似乎无法确定设置的位置。 我检查了JENKINS_HOME中的jenkins.xml,但堆大小没有在参数标记中设置。


回答

尝试使用较低的最大堆(-Xmx)值,如-Xmx900m或-Xmx800m,并查看是否可以解决问题。 根据我的经验,Jenkins会尊重你的ANT_OPTS环境变量,不会混淆它。 我使用Jenkins Freestyle Jobs,它个人启动Ant,并且我一直将ANT_OPTS,MAVEN_OPTS,...与Jenkins分开,它从未改变过任何东西。 使

更好的是,从像Xmx512m这样的低得多的值开始(我将使用ANT_OPTS,Ant使用这个而不用麻烦JAVA_OPTS)。 如果它仍然没有初始化,那么也许我会认为詹金斯正在做一些事情。 如果没有,那就有你的答案。

从根本上来说,我认为这与你所链接的重复问题是一样的问题,它只是在更有限的情况下重现。 以下更多细节。

背景

就在昨天,在同事的机器上,我看到-Xmx1024m在标准的命令窗口中出现故障,并带有与32位Java相同的消息。 仅仅因为它在一种情况下起作用并不意味着它会一直工作。

在Windows上,每个32位进程的最大地址空间为2GB,严重限制了您可以在Java中设置的最大堆大小,因为Java要求将整个对象堆分配到一个连续块中。 特别是在使用ASLR(地址空间布局随机化)的现代Windows版本中,您无法保证32位进程的大堆大小......即使1024m有时可能会过大,因为在Java中堆必须是连续的。 画一条从0到2GB的水平线,然后画一个宽度为50%的[1GB]块。 现在将50个随机DLL插入随机位置的2GB水平线中......现在尝试适合您的[1GB]块而不打点。

不确切,这是我可怜的人的地址空间图:

0 [________________________________________] 2GB
    _ is unallocated, available, | is occupied
Now with DLLs:
0 [__|_______|___________________|___|_____] 2GB
You need to fit this (including edges) into that address space:
[__________________]
Maybe it barely squeeks in...now let's add one more blip
0 [__|_______|_____________|_____|___|_____] 2GB
              [__________________]
Suddenly it won't fit. 

Jenkins可能会加载一个额外的DLL,它将您的地址空间分割得稍微多一些,以便在Jenkins下1024m失败,但不在独立窗口中。 既然你的目标是在詹金斯下运行它,我没有看到明确的解决方案,除了减少你的最大堆大小,因为你的目标是运行一个32位版本。 在Windows XP的日子里,通常得到-Xmx1300m左右的工作,但显然即使-Xmx1024m在Windows 7和Windows 8上(在某些情况下)也是如此。 看起来最有可能的情况是...你试图设置堆大到32位。

验证

如果这确实不是问题,或者如果您不相信我,那么您可以验证您的64位版本的构建实际正在使用哪些Java内存设置(即因为它必须实际开始看到设置运行)。 由于你的其他版本甚至无法启动,我不确定你可以在那里使用这种方法。 无论您是否告诉自己的工作使用32位JDK或64位JDK,如果它正在读取ANT_OPTS,它应该从该环境变量的两个构建中获得相同的最终结果-Xmx值(工作的那个(64位)和失败的那个)。 您可以使用包含在JDK中的实用程序来执行这个称为jconsole的工具。 从JDK安装的bin目录运行'jconsole'。 或者,如果您的PATH中有%JAVA_HOME% bin,则应该可以直接启动jconsole。

这将启动一个图形客户端,允许您从其中运行JVM的任何进程ID(PID)中进行选择,在大多数情况下,该列表应该非常短。 选择您的Ant进程并连接到它。 切换到VM Information选项卡,您将看到JVM正在使用的堆设置和其他VM参数。

您将看到一个“虚拟机参数”部分,其中应该包含-Xms和-Xmx设置,还会显示“最大堆大小”,可能以千字节显示。

额外的知识,但不是直接相关,因为你已经声明Java 6.如果这是Java 7或更高版本,你可以使用:

jcmd

为了获得PID,则:

jcmd <PID> VM.arguments

使用您指定的PID查看Java进程的VM参数。 jcmd是JDK附带的另一个实用程序。 这对我来说至少会显示原始字节值,因此您需要在头脑中进行翻译。 (它不会显示-Xmx1024m它会显示-XX:MaxHeapSize = 1073741824)

链接地址: http://www.djcxy.com/p/82921.html

上一篇: Jenkins is failing to start a 32

下一篇: Could not reserve enough space for object heap