Exception in thread "Spark Context Cleaner" java.lang.OutOfMemoryError: PermGen space

在idea中本地访问hive中的数据:

val df = spark.sql("select * from badou.order_products_prior")
df.show(10)

出错:Exception in thread "Spark Context Cleaner" java.lang.OutOfMemoryError: PermGen space。order_products_prior表的数据不到600M,估计是idea默认的内存太小了,达不到600M,所以修改一下VM options的配置:-Xmx1.5g -XX:MaxPermSize=800M,但是又出现错误说Xmx1.5g非法,我就改小了一点,能容纳600就行,-Xmx800M -XX:MaxPermSize=800M,结果正常。

### Java中Handler dispatch failed导致的NoClassDefFoundError: sun/misc/Cleaner 错误解决方案 当遇到 `NoClassDefFoundError` 特别是指向 `sun.misc.Cleaner` 的情况时,这通常意味着程序试图加载该类但是未能找到其定义。此类问题经常发生在使用不同版本的 JDK 或者某些依赖项不兼容的情况下。 #### 可能的原因分析 1. **JDK版本差异** 如果应用程序是在较新的JDK上开发但在旧版JDK环境中运行,则可能会发生此错误。因为自Java 9起模块化系统引入后,一些内部API被移除或隐藏,其中包括`sun.misc.Cleaner`这类工具类[^1]。 2. **第三方库冲突** 当项目中有多个版本相同的库共存时,可能导致类路径污染,进而引发找不到特定类的情况。特别是如果这些库尝试访问已废弃或更改位置的核心Java API。 3. **反射调用失败** 对于通过反射机制动态加载并执行的方法来说,任何关于目标对象结构的变化都可能引起异常。比如,在处理本地方法(Native Method)时,由于它们并非完全由Java编写而成,因此更容易受到环境变化的影响[^3]。 #### 解决方案建议 为了有效解决问题,可以从以下几个方面入手: - **确认使用的JDK版本** 确认当前项目的构建和部署所基于的确切JDK版本,并确保两者一致。对于现代应用而言,推荐采用最新的LTS长期支持版本来获得更好的稳定性和安全性保障。 - **调整模块配置文件(module-info.java)** 若确实需要保留对`sun.misc.Cleaner`或其他受保护接口的引用,可以在模块描述符(`module-info.java`)里声明显式的读取权限。不过需要注意的是这种做法并不鼓励用于生产环境当中,因为它违反了封装原则并且容易造成维护困难。 ```java module your.module.name { requires java.base; exports com.example.yourpackage to java.base; // 假设Cleaner在此包下 } ``` - **寻找替代方案** 考虑迁移到官方提供的公共API上来代替那些私有化的组件。例如,针对资源清理的需求,可以考虑利用try-with-resources语句自动管理可关闭资源的生命期,或是借助其他成熟的开源框架完成相似功能而不必直接触及底层细节。 - **更新IDEA设置** 鉴于提到Idea IDE的相关背景信息,检查IDE本身的插件安装状态及其与具体工程之间的适配程度也十分必要。有时仅仅是简单地刷新Maven/Gradle索引、重启服务端进程就能让一切恢复正常工作秩序[^2]。 ```bash mvn clean install -U # 强制更新所有快照依赖 ./gradlew build --refresh-dependencies # Gradle对应命令 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值