Java Jenkins无法为作业启动32位JVM

Java Jenkins无法为作业启动32位JVM,java,jenkins,jvm,Java,Jenkins,Jvm,我在运行詹金斯1.557。我有一项工作需要使用32位版本的JDK1.6_45构建。我在作业的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并正常运行

我在运行詹金斯1.557。我有一项工作需要使用32位版本的JDK1.6_45构建。我在作业的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的可用RAM,我甚至尝试将JAVA_OPTS=-Xms512m-Xmx1024m&ANT_OPTS=-Xms512m-Xmx1024m的字符串参数传递给构建,但没有成功

请注意,这不是的副本。如果我尝试在常规命令行中构建项目(Windows环境变量JAVA_HOME指向与Jenkins尝试相同的32位JDK安装),那么项目将构建。这似乎是詹金斯特有的问题

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

答复 尝试较低的最大堆(-Xmx)值,例如-Xmx900m或-Xmx800m,看看这是否解决了问题。 根据我的经验,Jenkins尊重您的ANT_OPTS环境变量,不会弄乱它。我使用詹金斯自由式的工作,亲自启动Ant,我总是设置Ant_选项,MAVEN_选项。。。与詹金斯分开,它从未改变任何事情。制造

更好的是,从一个低得多的值开始,比如-Xmx512m(我会使用ANT_OPTS,ANT使用它,而不必担心JAVA_OPTS)。如果它仍然无法初始化,好吧,那么也许我会认为詹金斯正在做一些事情。如果不是,那就是你的答案

从根本上说,我认为这与你链接的重复问题是同一个问题,它只是在更有限的情况下重现。更多详情见下文

背景 就在昨天,在一个同事的机器上,我看到-Xmx1024m在一个标准命令窗口中失败,并显示了与32位Java相同的消息。仅仅因为它在一种情况下有效并不意味着它总是有效的

在Windows上,每个32位进程的2GB最大地址空间严重限制了Java中可以设置的最大堆大小,因为Java要求在一个连续块中分配整个对象堆。特别是在使用(地址空间布局随机化)的现代Windows版本中,无法保证32位进程的堆大小很大……甚至1024m有时也可能太大,因为在Java中堆必须是连续的。想象一条从0到2GB的水平线,然后一个[1GB]块占据50%的宽度。现在将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会失败,但在独立窗口中不会。因为您的目标是在Jenkins下运行它,所以除了减少最大堆大小之外,我看不到一个明确的解决方案,因为您的目标是运行32位构建。在WindowsXP时代,使用-Xmx1300m左右是很常见的,但很明显,即使是-Xmx1024m在Windows7和Windows8上也是一种延伸(无论如何,在某些情况下)。看起来最有可能的情况是……您试图将堆设置得太大,无法容纳32位

验证 如果这真的不是问题所在,或者您不相信我,那么您可以验证64位版本的构建实际使用的Java内存设置(也就是说,因为它必须在运行时实际开始查看设置)。由于您的另一个构建甚至无法启动,我不确定您是否可以在那里使用此方法。不管Jenkins是否在做什么,不管你告诉你的工作是使用32位JDK还是64位JDK,如果它正在读取ANT_OPTS,那么它应该是从两个版本(工作的版本(64位)和失败的版本)的环境变量中获得相同的最终结果——Xmx值。您可以使用JDK附带的一个实用工具来完成这个任务,称为jconsole。从JDK安装的bin目录运行“jconsole”。或者,如果路径中有%JAVA\u HOME%\bin,则应该能够直接启动jconsole

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

您将看到一个“VM参数”部分,其中应该包括您的-Xms和-Xmx设置,但也包括“最大堆大小”,它可能以KB为单位显示

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

jcmd
要获得PID,则:

jcmd <PID> VM.arguments
jcmd VM.arguments

要查看具有指定PID的Java进程的VM参数。至少对我来说,这显示了原始字节的值,所以你需要在头脑中进行翻译。(它不会显示-Xmx1024m,它会显示-XX:MaxHeapSize=1073741824)

詹金斯的工作是什么?即兴说唱?正在运行什么?蚂蚁?还有,什么站台?Windows/Linux?自由式作业,Ant build,在Windows上。我尝试过-Xms256m-Xmx512m的Ant_选项(以及其他不同的设置),但没有效果。对于32位和64位JDK,jconsole不显示任何正在运行的Ant进程(它只显示正在运行的sun.tools.jconsole.jconsole)。我假设它不会出现在32位上,因为它从来没有机会运行过,但我不确定为什么64位没有出现,即使它正在运行。嗯……了解如何查看64位ant进程肯定会有助于找出为什么这不起作用……是J