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

何か案は?

4

4 に答える 4

7

JVMを微調整する代わりに、json全体をメモリにロードしてから書き込むのではなく、ストリーミングAPIを使用することをお勧めします。

https://sites.google.com/site/gson/streamingの「MixedWritesExample」をご覧ください

于 2012-10-29T10:13:05.033 に答える
1

問題は、eclipse(を介して制御eclipse.ini)を実行しているJVMのメモリが不足しているのではなく、プログラムの実行に使用されている別のJVMのメモリが不足していることです。

-Xmx1.5クライアントJVMを使用している場合、標準の最大メモリ設定( )は64MBだと思います。

最大メモリを変更するには、次の手順を実行します。

  • [名前を付けて実行...]または[名前を付けてデバッグ...]を右クリックし、
  • 次に、「構成の実行」または「構成のデバッグ」
  • 次に、[引数]タブをクリックします
  • -Xmx512m次に、「VM引数」に追加します
  • 次に、[実行]をクリックします

それでもメモリが不足している場合は、量を増やしてください。

于 2012-10-29T10:02:26.390 に答える
1

eclipse.iniEclipseプログラムのJVM設定に影響するため、微調整しないでください。プログラムが別のJVMを起動し、そのJVMのメモリ設定を設定する必要があると思います。Eclipseでのプログラムの「実行構成」を参照してください。

于 2012-10-29T09:48:25.067 に答える
1

Eclipseで実行されているJVMのメモリが不足していると思われるため、JVMのサイズを増やす必要があります。EclipseのVMを変更するには、[Windows]>[設定]>[Java]> [インストールされているJRE]からMVの量を変更できます。そこからJREを選択し、[編集してから、デフォルトのVM引数を-Xmx1024Mまたはその他のメモリ量に書き込みます。

あなたがアイデアを得たこのリンクを参照してください。

于 2012-10-29T10:09:29.553 に答える