vscode-xml: OutOfMemoryError after editing a file with custom XML schema for a while
For me, this extension regularly runs into OOM errors.
I’m editing a moderately-sized XML file (1 500 lines, 130 KB) that uses a custom XML schema (of about 300 lines). This works well, and I receive proper IntelliSense suggestions and schema violation errors, until, after some amount of editing, the extension seems to run inte an OutOfMemory error:
[Info - 11:02:51] May 28, 2021 11:02:51 org.eclipse.lemminx.XMLLanguageServer initialize()
Message: Initializing XML Language server
LemMinX Server info:
- Version : 0.16.2
- Java : C:\Program Files\OpenJDK\jdk-16.0.1
- VM Version : 16.0.1
- Git 544a8d4 - [maven-release-plugin] prepare release 0.16.2
[Info - 11:02:51] May 28, 2021 11:02:51 org.eclipse.lemminx.extensions.contentmodel.uriresolver.XMLCatalogResolverExtension setCatalogs()
Message: Adding XML catalog './some-folder/catalog.xml' with expand system id 'file:///c%3A/Users/fefrei/git/my-project/some-folder/catalog.xml' and root URI 'file:///c%3A/Users/fefrei/git/my-project/'.
[Info - 11:31:05] May 28, 2021 11:31:05 org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint notify()
Message: Unsupported notification method: $/setTraceNotification
[Info - 11:39:52] May 28, 2021 11:39:52 org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint notify()
Message: Unsupported notification method: $/setTraceNotification
[Info - 11:39:52] May 28, 2021 11:39:52 org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint notify()
Message: Unsupported notification method: $/setTraceNotification
[Info - 11:39:52] May 28, 2021 11:39:52 org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint notify()
Message: Unsupported notification method: $/setTraceNotification
[Info - 11:39:52] May 28, 2021 11:39:52 org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint notify()
Message: Unsupported notification method: $/setTraceNotification
[Warn - 12:23:36] May 28, 2021 12:23:36 org.eclipse.lsp4j.jsonrpc.RemoteEndpoint handleCancellation()
Message: Unmatched cancel notification for request id 326
[Warn - 13:34:08] May 28, 2021 01:34:08 org.eclipse.lsp4j.jsonrpc.RemoteEndpoint handleCancellation()
Message: Unmatched cancel notification for request id 500
[Warn - 13:38:47] May 28, 2021 01:38:47 org.eclipse.lsp4j.jsonrpc.RemoteEndpoint handleCancellation()
Message: Unmatched cancel notification for request id 1518
[Warn - 13:38:51] May 28, 2021 01:38:51 org.eclipse.lsp4j.jsonrpc.RemoteEndpoint handleCancellation()
Message: Unmatched cancel notification for request id 1548
[Warn - 13:39:31] May 28, 2021 01:39:31 org.eclipse.lsp4j.jsonrpc.RemoteEndpoint handleCancellation()
Message: Unmatched cancel notification for request id 1793
[Error - 13:39:34] May 28, 2021 01:39:34 org.eclipse.lsp4j.jsonrpc.RemoteEndpoint fallbackResponseError()
Message: Internal error: java.lang.OutOfMemoryError: Java heap space
java.util.concurrent.CompletionException: java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319)
at java.base/java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:718)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:610)
at java.base/java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:1257)
at java.base/java.util.concurrent.CompletableFuture$BiApply.tryFire(CompletableFuture.java:1279)
at java.base/java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:479)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:295)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1016)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1598)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.base/java.lang.Integer.toString(Integer.java:448)
at java.base/java.lang.Integer.toString(Integer.java:1188)
at com.google.gson.stream.JsonWriter.value(JsonWriter.java:528)
at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:232)
at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:217)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:977)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:141)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:40)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:977)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:141)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:40)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:977)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:141)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:40)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
[Error - 13:39:34] Request textDocument/documentSymbol failed.
Message: Internal error.
Code: -32603
java.util.concurrent.CompletionException: java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319)
at java.base/java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:718)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:610)
at java.base/java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:1257)
at java.base/java.util.concurrent.CompletableFuture$BiApply.tryFire(CompletableFuture.java:1279)
at java.base/java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:479)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:295)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1016)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1598)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.base/java.lang.Integer.toString(Integer.java:448)
at java.base/java.lang.Integer.toString(Integer.java:1188)
at com.google.gson.stream.JsonWriter.value(JsonWriter.java:528)
at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:232)
at com.google.gson.internal.bind.TypeAdapters$7.write(TypeAdapters.java:217)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:977)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:141)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:40)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:977)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:141)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:40)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:977)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:141)
at org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter.write(CollectionTypeAdapter.java:40)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
From that point on, suggestions and problems stop working until I restart VS code, which fixes the issue until it re-occurs after a few minutes to about an hour. I haven’t found a targeted way to trigger the behavior, it just seems to occur after some time of editing.
After the problem has occurred, the java.exe
process seems to only take about 200 MB of RAM, the same it does after starting up.
Watching the memory usage during normal operation doesn’t show any egregious memory problem (and any activity in this graph coincided with some typing activity):
Here’s some details about my setup:
- I’ve set the
xml.catalogs
setting to contain a single entry, an XML catalog mapping a single name to my XML schema definition. - I’ve tried setting
xml.server.binary.args
to-Xmx1g
to no avail. - All other settings of this extension are set to the default value.
- I’m running Windows and have installed this Java version:
openjdk 16.0.1 2021-04-20 OpenJDK Runtime Environment (build 16.0.1+9-24) OpenJDK 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)
- I’m running VS code 1.56.2 and version 0.16.1 of this extension (but I’ve had this problem for quite some time, so it’s not related to any recent updates).
I’m not sure what else I can do to help debug this – if needed, I can share my XML schema and the document I’m editing, but I’d prefer not to post this publicly (sorry).
About this issue
- Original URL
- State: closed
- Created 3 years ago
- Comments: 17 (8 by maintainers)
vscode-xml should now have the capability to detect OOM errors and handle them more gracefully when using the Java version of the XML language server. With that said it does seem like this isn’t so much of an issue for the binary version.
We can work on further improvements like automatically incrementing the amount of memory allocated to the JVM.
We might do well to look at what ends up happening in https://github.com/redhat-developer/vscode-java/issues/1959 . In addition to more elegantly reporting OOM events to users, there was discussion about simply restarting the language server by upping Xmx by say, 200MB if the previous crash was an OOM. We already have code to restart on a crash so it seems possible.
For now I’ll mark this as an enhancement for better handling of OOM events.
Thanks so much! Your feedback is really important because if it works for you, we could define this setting as default. Thanks again for your patience!