【问题标题】:Java heap space with GSON带有 GSON 的 Java 堆空间
【发布时间】:2012-10-18 14:48:46
【问题描述】:

我正在使用 GSON 创建一些大型 JSON 文件,以便从 GTFS(Google Transit)创建自定义 JSON。问题是当我从我的对象类转换为 JSON 时:

  Gson gson = new Gson();
  String rutasJSON = gson.toJson(my_object);

它给出了这个例外:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuffer.append(Unknown Source)
    at java.io.StringWriter.write(Unknown Source)
    at com.google.gson.stream.JsonWriter.string(JsonWriter.java:544)
    at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:387)
    at com.google.gson.stream.JsonWriter.value(JsonWriter.java:402)
    at com.google.gson.internal.bind.TypeAdapters$13.write(TypeAdapters.java:353)
    at com.google.gson.internal.bind.TypeAdapters$13.write(TypeAdapters.java:337)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:105)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60)
    at com.google.gson.Gson.toJson(Gson.java:586)
    at com.google.gson.Gson.toJson(Gson.java:565)
    at com.google.gson.Gson.toJson(Gson.java:520)
    at com.google.gson.Gson.toJson(Gson.java:500)
    at transporte.main(transporte.java:152)

我试图从这里更改 eclipse.ini:

-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m

到这里:

-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
1024M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx512m

有什么想法吗?

【问题讨论】:

  • 您是如何解决单个对象的问题的?

标签: java eclipse gson heap-memory


【解决方案1】:

与其调整 JVM,不如使用流式 API 而不是在写入之前将整个 json 加载到内存中。

查看https://sites.google.com/site/gson/streaming 上的“混合写入示例”

【讨论】:

    【解决方案2】:

    我认为你不应该调整eclipse.ini,因为这会影响 Eclipse 程序的 JVM 设置。我想你的程序启动了一个不同的 JVM,你应该设置那个 JVM 的内存设置。在 Eclipse 中查看程序的“运行配置”。

    【讨论】:

    • 我已经在 Run configuration 内的 VM 参数中完成了该操作,输入:-Xms256M -Xmx512M
    • 尝试添加更多。这是最有可能的方法
    【解决方案3】:

    问题不在于运行 eclipse(通过eclipse.ini 控制)的 JVM 内存不足,而是用于运行程序的单独 JVM 内存不足。

    如果您使用的是 1.5 客户端 JVM,我认为标准的最大内存设置 (-Xmx) 是 64 MB。

    要更改最大内存,请执行以下操作:

    • 右键单击“运行方式...”或“调试方式...”并
    • 然后是“运行配置”或“调试配置”
    • 然后点击参数选项卡
    • 然后将-Xmx512m 添加到“VM 参数”中
    • 然后点击运行

    如果内存仍然不足,请增加内存量。

    【讨论】:

      【解决方案4】:

      我认为您在 Eclipse 中运行的 JVM 内存不足。因此您必须增加 JVM 的大小。要更改 Eclipse 的 VM,您可以从 Windows> Preferences> Java>更改 MV 的数量> 从那里安装的 JRE 选择 JRE 并单击编辑,然后写入 Default VM Arguments: to -Xmx1024M 或任何其他内存量。

      请参阅此链接,您将获得 idea

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 2016-06-19
        • 2021-09-09
        • 2013-11-26
        相关资源
        最近更新 更多