问题

问题:ArcGIS Engine Java 应用程序抛出“EXCEPTION_STACK_OVERFLOW”

Last Published: April 26, 2020

描述

从命令行运行 ArcGIS Engine Java 应用程序时,会出现此问题。 以下是控制台的输出示例:

发生了不可恢复的堆栈溢出。 # # HotSpot 虚拟机 检测到异常错误: # # EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x7227f575, pid=5488, tid=4648 # # Java VM: Java HotSpot(TM) Client VM (1.8.0_65-b17 mixed mode, sharing) # 问题框架: # .... # # 将包含更多信息的错误报告文件 另存为 hs_err_pidXXXX.log # # 如果您想向 Oracle 提交错误报告, 请访问: # http://bugreport.java.com/bugreport/crash.jsp #

原因

正在执行的 Java 线程在执行期间耗尽了堆栈空间,从而导致 Java 虚拟内存 (JVM) 终止并且应用程序崩溃。 这是由于默认的堆栈大小仅为每个线程 256KB。

解决方案或解决方法

JVM 支持命令行选项 -Xss<size>[k|K|m|M|g|G],该选项允许更改线程的默认堆栈大小。

在 Windows 操作系统上,此命令行选项仅影响从主线程内部创建的线程(即工作线程)的堆栈大小。 (在 Windows 上,将主线程的堆栈大小配置为可执行文件本身 java.exe/javaw.exe。)

在 Linux 上,-Xss<size>m 选项也会影响主线程。
注意: 有关 Windows 和 UNIX 平台上 Java 中线程堆栈大小的详细讨论,请参考以下文章:Oracle Technology Network Bug Detail
此问题有三种可能的解决方案:
  • 使用 JVM 选项 – Xss<size>m 将线程的堆栈大小增加到足够大的值 (~2M)

    例如,要运行 Java 示例,请从 /bin 文件夹运行以下命令:
    java -jar -Xss4m -client samplename.jar
    注意: 如果在 Linux 上,请不要忘记从安装位置 (%AGSDEVKITJAVA%) 获取 init_java.sh 或 init_java.csh,具体取决于用户外壳程序。
    在 Java 5 中,此 JVM 选项仅增加辅助线程的堆栈大小,而不增加主线程的堆栈大小。 因此,有问题的 ArcObjects 操作必须在辅助线程上执行。 在 Java 6 及更高版本中,此选项甚至可以修改主线程的堆栈大小。 因此,可以在主线程本身上执行 ArcObjects 操作。
    注意: 请记住,ArcObjects 将始终在单线程环境中运行。 因此,如果选择了 JVM 选项,并且将应用程序初始化为以引擎模式运行 (EngineInitialize.initializeEngine()),则所有 ArcObject 的工作(包括但不限于:互操作初始化和有问题的操作)都必须严格在辅助线程上执行。
  • 使用 Microsoft 的 EditBin 实用程序

    EditBin 是一种实用程序,可通过直接修改可执行文件本身来更改从应用程序内部创建的所有线程的默认堆栈大小。 (java.exe/javaw.exe). EditBin 是 Microsoft Visual Studio 的一部分。
  • 使用 Esri 的 EditBin 实用程序

    如果 Microsoft 的 EditBin 实用程序不可用,请使用 Esri 的实用程序
    1. 下载 .zip 文件然后将其解压到文件夹,例如“临时”文件夹。
    2. 打开命令提示符导航至临时文件夹。 要提高 java.exe 的堆栈空间,请执行以下命令:
      EditBin.exe <path_to_java_exe> <stack_size_in_bytes>
      例如,使用以下命令将堆栈大小增加到 2Mb:
      EditBin.exe "c:\jdk1.5.0_06\jre\bin\java.exe" 2097152

文章 ID:000014071

从 ArcGIS 专家处获得帮助

联系技术支持部门

下载 Esri 支持应用程序

转至下载选项

发现关于本主题的更多内容