一个接口报NoClassDefFoundError,接口逻辑会通过class.forname()加载初始化类,类的静态代码中含有递归逻辑。往类的初始化错误方向进行问题排查
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.yd.addr_core_server.utils.new_seg.SegPool
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.addr_core_server.utils.cache.InitialBaseData.initial(InitialBaseData.java:32)
问题原因
java栈空间配置太小,接口第一次调用时通过class.forName()进行类加载、类静态代码块的初始化。初始化代码含有递归逻辑,递归次数太深,报StackOverflowError,类初始化失败。
当接口被第二次调用时,就会报NoClassDefFoundError。
处理
调整栈空间大小
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.StackOverflowError