OOM error caused by large array allocation in G1

Lijie Xu csxulijie at gmail.com
Sat Nov 18 12:53:55 UTC 2017


Hi All,

I recently encountered an OOM error in a Spark application using G1
collector. This application launches multiple JVM instances to process the
large data. Each JVM has 6.5GB heap size and uses G1 collector. A JVM
instance throws an OOM error during allocating a large (570MB) array.
However, this JVM has about 3GB free heap space at that time. After
analyzing the application logic, heap usage, and GC log, I guess the root
cause may be the lack of consecutive space for holding this large array in
G1. I want to know whether my guess is right and why G1 has this defect.

In the following sections, I will detail the JVM info, application, OOM
phase, and heap usage. Any suggestions will be appreciated.



*[JVM info]*

java version "1.8.0_121"

Oracle Java(TM) SE Runtime Environment (build 1.8.0_121-b13)

Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)



*[Application]*

This is a SVM machine learning Spark application available at
https://github.com/JerryLead/SparkGC/blob/master/src/main/sc
ala/applications/ml/SVMWithSGDExample.scala.

*[OOM phase]*

This application generates large task results (including a 400MB
*nio.ByteBuffe*r) and uses *JavaSerializer* to serialize the task results.
During serializing, the JavaSerializer tries to allocate (expand) a large
* SerializeBuffer* (570MB) to hold this task result. The following GC log
snippet shows the expansion details.

318.800: [G1Ergonomics (Heap Sizing) attempt heap expansion, reason:
allocation request failed, allocation request: 573046800 bytes]

318.800: [G1Ergonomics (Heap Sizing) expand the heap, requested
expansion amount: 573046800 bytes, attempted expansion amount:
573571072 bytes]

2017-11-17T09:58:17.362+0800: 318.802: [Full GC (Allocation Failure)
3895M->3855M(6656M), 1.7516132 secs]


Although this JVM has about 3GB free space, it throws an OOM error during
the expansion as follows.



17/11/17 09:59:07 ERROR Executor: Exception in task 1.0 in stage 10.0 (TID
1048) java.lang.OutOfMemoryError: Java heap space

    at java.util.Arrays.copyOf(Arrays.java:3236)

    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)


    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)


    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)

    at org.apache.spark.util.ByteBufferOutputStream.write(ByteBufferOutputStream.scala:41)


    at java.io.ObjectOutputStream$BlockDataOutputStream.write(ObjectOutputStream.java:1853)


    at java.io.ObjectOutputStream.write(ObjectOutputStream.java:709)

    at org.apache.spark.util.Utils$.writeByteBuffer(Utils.scala:238)

    at org.apache.spark.scheduler.DirectTaskResult$$anonfun$writeEx
ternal$1.apply$mcV$sp(TaskResult.scala:66)

    at org.apache.spark.scheduler.DirectTaskResult$$anonfun$writeEx
ternal$1.apply(TaskResult.scala:62)

    at org.apache.spark.scheduler.DirectTaskResult$$anonfun$writeEx
ternal$1.apply(TaskResult.scala:62)

    at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1269)

    at org.apache.spark.scheduler.DirectTaskResult.writeExternal(TaskResult.scala:62)


    at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStr
eam.java:1459)

    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1430)


    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)


    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)


    at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:43)


    at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:100)


    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:384)


    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)


    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)


    at java.lang.Thread.run(Thread.java:745)

17/11/17 09:59:07 DEBUG BlockManagerSlaveEndpoint: removing broadcast 14



*[G1 configuration]*

-Xmx6.5G -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails
-XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCCause
-XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy
-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1
-XX:+HeapDumpOnOutOfMemoryError



*[Heap size and usage]*

https://github.com/JerryLead/Misc/blob/master/OOM-SVM-G1-E1/OOM-SVM-G1-E1.pdf

*[GC log]*

https://github.com/JerryLead/Misc/blob/master/OOM-SVM-G1-E1/GClog
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-gc-use/attachments/20171118/fea531f1/attachment.html>


More information about the hotspot-gc-use mailing list