Java堆空间与GSON

3

我正在使用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

有什么想法吗?


你是如何解决单个对象的问题的? - Coded9
4个回答

7

1

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


我已经在“运行配置”中的VM参数中完成了这个,放置了:-Xms256M -Xmx512M。 - mram888
尝试添加更多。这是最有可能的方法。 - jabal

1
问题并不是运行 Eclipse 的 JVM(通过 eclipse.ini 控制)内存用尽,而是用于运行您的程序的单独 JVM 内存用尽。
如果您正在使用 1.5 客户端 JVM,则标准的最大内存设置(-Xmx)应为 64 MB。
为了更改最大内存,请执行以下操作:
  • 右键单击“Run As...”或“Debug As...”
  • 然后选择“Run Configurations”或“Debug Configurations”
  • 然后单击“Arguments”选项卡
  • 然后将 -Xmx512m 添加到“VM arguments”中
  • 然后单击运行
如果仍然出现内存不足的情况,请增加内存量。

1

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

参考此链接,你会得到一个想法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接