当前位置: 首页 > 知识库问答 >
问题:

java.lang.OutOfMemoryError:压缩类空间

朱炳
2023-03-14

我们正在Java-8-Oracle上运行。

我们在六个月前转移到java8。

在过去的几天里,我们得到了一个OOME不时,我们没有能够识别或再现的问题。

当我们执行对服务器(tomcat)的调用时,我们会在StackTrace上得到以下错误:

java.lang.OutOfMemoryError: Compressed class space

重新启动服务器解决了问题。对其他服务器的相同调用可以工作,对同一服务器的另一种类型的调用也可以工作。

查看GC日志时,我们会看到:

2015-05-27T16:05:42.991+0000: 98774.440: [Full GC (Last ditch collection) 98774.440: [CMS: 575745K->575330K(3495936K), 0.8687777 secs] 575745K->575330K(4107008K), [Metaspace: 97940K->97940K(1396736K)], 0.8696093 secs] [Times: user=0.95 sys=0.00, real=0.88 secs]
2015-05-27T16:05:55.486+0000: 98786.935: [Full GC (Metadata GC Threshold) 98786.935: [CMS: 573414K->578735K(3495936K), 0.9372859 secs] 925046K->578735K(4107008K), [Metaspace: 99428K->99428K(1396736K)], 0.9386626 secs] [Times: user=1.01 sys=0.00, real=0.94 secs]

jstat-gc返回:

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
87296.0 87296.0  0.0   3151.4 523776.0 148284.4 3495936.0   574868.5  1395640.0 98066.3 1048576.0 11339.1  12165  636.851  223   116.957  

753.808

我在jstat日志或gc日志中都没有看到任何内存问题。

尝试运行jmap-clstats挂起:

Attaching to process ID 5110, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.25-b02
finding class loader instances ..

共有2个答案

燕寒
2023-03-14

使用压缩的OOP和压缩的类指针,类的可用空间会受到限制,这是因为必须进行指针折损。在您的情况下为1GB。

这是大量的类,因此这可能表明应用程序中的某些内容正在创建大量的类,并且从未释放它们。可能重新加载应用程序?

如果您确定应用程序只需要那么多内存来进行类,您可以尝试通过-xx:CompressedClassSpacesize=...来突破限制,或者通过-xx:-UseCompressedClassPointers禁用压缩类指针。

注意,默认情况下,压缩类空间+压缩堆(+一些开销)不能超过32GB。但是,AIUI,更改对象对齐可能会进一步突破这个限制。

否则,您应该进行一次堆转储,分析装载的类上有什么东西。

欧阳洲
2023-03-14

我们也面临类似的问题。不幸的是,堆转储对您没有帮助,因为类不在堆中,而是在本机内存中。在您的JVM设置中启用这些功能以排除加载的类故障:

-XX:+PrintGCDetails -XX:+TraceClassUnloading -XX:+TraceClassLoading

在我们的例子中,问题是jaxbcontext.newInstance不是单例。

祝你好运,艾伯特

 类似资料:
  • 我正在调查OutOfMemoryError:压缩类空间问题。我想,我找到了它的根本原因和解决方案(JAXBContext.new由HiberNate Validator方法调用的实例:用户提交的每个操作后的构建验证工厂),但在我的研究中,我注意到一件令人困惑的事情。 我尝试运行jcmd VM.native_memory和jstat -gc来跟踪类提交的大小和CCSU(压缩的类空间使用): 和 我预

  • RAR 与 ZIP 对比 支持其它压缩文件格式 固实压缩文件 自解压文件 (SFX) 分割压缩文件 (多卷) 恢复卷 加密 压缩文件注释 保护压缩文件防止损坏 锁定压缩文件 怎样选择优化的压缩设置

  • 本文向大家介绍C#实现的文件压缩和解压缩类,包括了C#实现的文件压缩和解压缩类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现的文件压缩和解压缩类。分享给大家供大家参考。具体分析如下: 这个C#代码包含了几个类,封装了文件压缩和解压缩常用的方法,包括直接通过代码进行压缩,也有调用winrar对文件进行压缩的 希望本文所述对大家的C#程序设计有所帮助。

  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使

  • Tango拥有一个默认的压缩中间件,可以按照扩展名来进行文件的压缩。同时,你也可以要求某个Action自动或强制使用某种压缩。比如: type CompressExample struct { tango.Compress // 添加这个匿名结构体,要求这个结构体的方法进行自动检测压缩 } func (CompressExample) Get() string { return f

  • 所有基于http协议的服务器组件均支持压缩,请求头Accept-Encoding的值需要包含deflate或者gzip。 即便请求头Accept-Encoding的值包含deflate或者gzip,服务器还会参考静态变量http_server::zip_min_size(默认1024,即1KB)和http_server::zip_max_size(默认307200,即300KB)来决定是否压缩:仅