命令行使用ant脚本编译时出现OutOfMemoryError: GC overhead limit exceeded

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命令行使用ant脚本编译时出现OutOfMemoryError: GC overhead limit exceeded相关的知识,希望对你有一定的参考价值。

我在环境变量设置了ANT_OPTS=-Xms512m -Xmx768m -XX:PermSize=256m -XX:MaxPermSize=512m
命令行是新开的,echo %ANT_OPTS%也是以上的值,但就不知道为什么还会内存溢出了
网上查了关于“GC overhead limit exceeded”的异常处理说是使用“-XX:-UseGCOverheadLimit”参数,还是无效...

请高手帮忙解决 真心感谢

参考技术A 根据sun的说法: "if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown."
gc超过98%以上的时间去释放小于2%的堆空间时会报这个错误
1、增加你那个XX参数
2、增加堆大小,-Xmx可以再增加,譬如2G内存增加到1300m
3、使用jstat监控gc,其vmid参数可用jps -lv查找追问

增大也是没用的.
另外我系统是win7 64,JDK也是64位的不知道使用ant会不会有问题

追答

用jstat监控一下试试
ant我没用过,好象是开源的,找最新版的也测试下,或者自己编译ant

参考技术B 我觉得一般默认情况什么 ANT_OPTS 也不加应该就可以工作的吧。你的机器内存少于2G?按 zaoyaxu 的提示,是 GC 花了太多时间也没腾出空间来,JVM 就不打算再尝试GC了。

使用 MsBuild 使用命令行进行发布时出现问题单击一次

【中文标题】使用 MsBuild 使用命令行进行发布时出现问题单击一次【英文标题】:Problems using MsBuild using command line for Publish Click Once 【发布时间】:2010-01-25 08:18:21 【问题描述】:

我的解决方案中有 csproj 中的 Windows 应用程序,我想使用命令行(bat、cmd)生成发布。

我的脚本是(我输入\r\n 以便更好地阅读):

 SET MSBUILD="%SystemRoot%\Microsoft.NET\Framework\v3.5\MSBuild.exe"
    SET CARWIN="..\..\Security.CarWin.csproj"

    rem msbuild para publish

    %MSBUILD% /target:rebuild;publish %CARWIN% 
/p:ApplicationVersion="1.0.0.0" 
/p:Configuration=release 
/p:PublishUrl="C:\ClickOnce\CarWin.WebInstall\Publicacion\" 
/p:InstallUrl="http://desserver/carwinclickonce/Publicacion/" 
/p:PublishDir="C:\ClickOnce\CarWin.WebInstall\Publicacion\" 

注意:我也会尝试使用/target:publish

但在路径 PublishDir 或 PublishUrl (C:\ClickOnce\CarWin.WebInstall\Publicacion) 中不会生成任何文件。

我在这个网站和谷歌上看到了很多帖子,但我没有找到任何解决方案。

【问题讨论】:

MSBuild doesn't respect PublishUrl property for my ClickOnce app的可能重复 【参考方案1】:

从命令行运行时使用 PublishDir 而不是 PublishUrl。

msbuild /target:publish /p:Configuration=Release;PublishDir=c:\playground\

您还可以更改版本,例如 ApplicationRevision=666;MinimumRequiredVersion=1.1

【讨论】:

对于 PublishDir,有结尾“\”很重要 如何在 msbuild 命令中指定 minimumRequiredVerison?我尝试了上述建议,但没有奏效。【参考方案2】:

看看this Stack Overflow question。从命令行运行 ClickOnce 时,基本上会忽略 PublishUrl 属性。但您可以通过额外的 MSBuild 任务轻松添加行为。

我创建了一个额外的 MSBuild 文件,例如 build.csproj。这包含一个publish-task。此任务首先调用目标项目的常规 MS-Build。然后它将结果复制到发布目录。现在我从命令行调用“build.csproj”而不是 reguar 项目文件:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="3.5" DefaultTargets="Publish" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <!-- project name-->
        <ProjectName>MyExampleProject</ProjectName> 
        <!--properties for the project-build-->
        <DefaultBuildProperties>Configuration=Release</DefaultBuildProperties> 
        <!-- location of the click-once stuff, relative to the project -->
        <ProjectPublishLocation>.\bin\Release\app.publish</ProjectPublishLocation> 
        <!-- Location you want to copy the click-once-deployment. Here an windows-share-->
        <ProjectClickOnceFolder>\\TargetServer\deployments</ProjectClickOnceFolder> 
      </PropertyGroup>
      <Target Name="Publish" DependsOnTargets="Clean">
        <Message Text="Publish-Build started for build no $(ApplicationRevision)" />
        <!-- run the original build of the project -->
        <MSBuild Projects="./$(ProjectName).csproj"
        Properties="$(DefaultBuildProperties)"
        Targets="Publish"/>
        <!-- define the files required for click-once-->
        <ItemGroup>
          <SetupFiles Include="$(ProjectPublishLocation)\*.*"/>
          <UpdateFiles Include="$(ProjectPublishLocation)\Application Files\**\*.*"/>
        </ItemGroup>
        <!-- and copy them -->
        <Copy
        SourceFiles="@(SetupFiles)"
        DestinationFolder="$(ProjectClickOnceFolder)\"/>
        <Copy
        SourceFiles="@(UpdateFiles)"
        DestinationFolder="$(ProjectClickOnceFolder)\Application Files\%(RecursiveDir)"/>
      </Target>
      <Target Name="Clean">
        <Message Text="Clean project" />
        <MSBuild Projects="./$(ProjectName).csproj"
        Properties="$(DefaultBuildProperties)"
        Targets="Clean"/>
      </Target>
    </Project>

【讨论】:

太好了,我想知道只使用目标项目的发布位置而不是在此处指定它是否可行...?【参考方案3】:

不知道是不是这个问题,但是我注意到你把/target参数传递了两次?

您可以使用分号分隔的示例:

/target:rebuild;publish

MSDN Documentation on command line parameters and MSBuild

如果这也不起作用,您也许可以尝试通过传递来调试它

/verbosity:diag

【讨论】:

我尝试 /target:rebuild;publish 并且仅 /target:publish 但不生成文件发布。有什么想法吗?谢谢!!! 使用 /verbosity:diag 运行它并发布输出 输出的日志文件大小超过 1 MB !!!不可能在这里发布...问题..我没有将其发布在我放入 cmd 文件的文件夹中...谢谢。

以上是关于命令行使用ant脚本编译时出现OutOfMemoryError: GC overhead limit exceeded的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 cmd 中运行 ant sonar 命令时出现错误?

用命令行编译Java时遇到如下错误提示(该错误是在Class文件生成后,执行java命令时出现的)

使用 ant-cli 部署生产 mobilefirst 7.1 环境时出现 404 错误

java web 编译时出现错误

编译 mex 文件时出现链接错误

使用 MsBuild 使用命令行进行发布时出现问题单击一次