This is an automated email from the ASF dual-hosted git repository.

lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new b0206db69 [core] Call full gc to avoid meta space oom while generating 
classes (#4477)
b0206db69 is described below

commit b0206db69bdc0e903264d288bae5eda0667e9a7e
Author: YeJunHao <[email protected]>
AuthorDate: Fri Nov 8 15:59:02 2024 +0800

    [core] Call full gc to avoid meta space oom while generating classes (#4477)
---
 .../org/apache/paimon/codegen/CodeGenUtils.java    | 35 +++++++++++++++++-----
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git 
a/paimon-core/src/main/java/org/apache/paimon/codegen/CodeGenUtils.java 
b/paimon-core/src/main/java/org/apache/paimon/codegen/CodeGenUtils.java
index d452df5fb..e82ec144d 100644
--- a/paimon-core/src/main/java/org/apache/paimon/codegen/CodeGenUtils.java
+++ b/paimon-core/src/main/java/org/apache/paimon/codegen/CodeGenUtils.java
@@ -107,14 +107,7 @@ public class CodeGenUtils {
 
         try {
             Pair<Class<?>, Object[]> result =
-                    COMPILED_CLASS_CACHE.get(
-                            classKey,
-                            () -> {
-                                GeneratedClass<T> generatedClass = 
supplier.get();
-                                return Pair.of(
-                                        
generatedClass.compile(CodeGenUtils.class.getClassLoader()),
-                                        generatedClass.getReferences());
-                            });
+                    COMPILED_CLASS_CACHE.get(classKey, () -> 
generateClass(supplier));
 
             //noinspection unchecked
             return (T) GeneratedClass.newInstance(result.getLeft(), 
result.getRight());
@@ -124,6 +117,32 @@ public class CodeGenUtils {
         }
     }
 
+    private static <T> Pair<Class<?>, Object[]> generateClass(
+            Supplier<GeneratedClass<T>> supplier) {
+        long time = System.currentTimeMillis();
+        RuntimeException ex;
+
+        do {
+            try {
+                GeneratedClass<T> generatedClass = supplier.get();
+                return Pair.of(
+                        
generatedClass.compile(CodeGenUtils.class.getClassLoader()),
+                        generatedClass.getReferences());
+            } catch (OutOfMemoryError error) {
+                // try to gc meta space
+                System.gc();
+                try {
+                    Thread.sleep(5_000);
+                } catch (InterruptedException e) {
+                    Thread.interrupted();
+                    throw new RuntimeException("Sleep interrupted", error);
+                }
+                ex = new RuntimeException("Meet meta space oom while 
generating class.", error);
+            }
+        } while ((System.currentTimeMillis() - time) < 60_000);
+        throw ex;
+    }
+
     private static class ClassKey {
 
         private final Class<?> classType;

Reply via email to