Java Jenkins无法为作业启动32位JVM
我在运行詹金斯1.557。我有一项工作需要使用32位版本的JDK1.6_45构建。我在作业的JDK设置中正确配置了该版本。但是,当我尝试运行作业时,我得到以下错误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并正常运行
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