From 015ac710adefad3f16e082086ecb4c93690f40f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=9F=E5=BC=8B?= Date: Thu, 7 Nov 2024 19:02:38 +0800 Subject: [PATCH] [core] Call full gc to avoid meta space oom while generating classes --- .../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 d452df5fb65e..e82ec144d9f3 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 @@ private static T generate( try { Pair, Object[]> result = - COMPILED_CLASS_CACHE.get( - classKey, - () -> { - GeneratedClass 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 @@ private static T generate( } } + private static Pair, Object[]> generateClass( + Supplier> supplier) { + long time = System.currentTimeMillis(); + RuntimeException ex; + + do { + try { + GeneratedClass 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;