74. 4、JIT 编译器优化后的 class 信息。 PermGen 的使用量与加载到内存的 class 的数量/大小正相关。 解决方案 根据 Permgen space 报错的时机,可以采用不同的解决方案,如下所示: 1、程序启动报错,修改 -XX:MaxPermSize 启动参数,调大永久代空间。 2、应用重新部署时报错,很可能是没有应用没有重启,导致加载了多份 class 信息,只需重启 JVM 即可解决。 3、运行时报错,应用程序可能会动态创建大量 class,而这些 class 的生命周期很短暂,但是 JVM 默认不会卸载 class,可以设置 -XX:+CMSClassUnloadingEnabled 和 -XX:+UseConcMarkSweepGC 这两个参数允许 JVM 卸载 class。 如果上述方法无法解决,可以通过 jmap 命令 dump 内存对象 jmap-dump:format=b,file=dump.hprof<process-id> ,然后利用 Eclipse MAT 功能逐一分析开销最大的 classloader 和重复 class。 4、Metaspace JDK 1.8 使用 Metaspace 替换了永久代(Permanent Generation),该错误表示 Metaspace 已被用满,通常是因为加载的 class 数目太多或体积太大。 此类问题的原因与解决方法跟 Permgenspace 非常类似,可以参考上文。需要特别注意的是调整 Metaspace 空间大小的启动参数为 -XX:MaxMetaspaceSize。 5、Unable to create new native thread 每个 Java 线程都需要占用一定的内存空间,当 JVM 向底层操作系统请求创建一个新的 native 线程时,如果没有足够的资源分配就会报此类错误。 原因分析 JVM 向 OS 请求创建 native 线程失败,就会抛出 Unableto createnewnativethread,常见的原因包括以下几类: 1、线程数超过操作系统最大线程数 ulimit 限制; 2、线程数超过 kernel.pid_max(只能重启); 3、native 内存不足; 该问题发生的常见过程主要包括以下几步:
点赞 评论

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务