1

我正在使用带有 jdk 8 的 tomcat 8。元空间设置为 1GB,我觉得这已经足够了,我得到了 OutOfMemoryError 异常。我已尝试检查类(SSLEngineImpl.java:1796)以了解导致此问题的原因,但似乎错误行并未引用任何类负载。有人可以帮忙吗?

[http-nio-8202-exec-2] org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun 
 java.lang.OutOfMemoryError: Metaspace
    at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1796)
    at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083)
    at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
    at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
    at org.apache.tomcat.util.net.SecureNioChannel.handshakeUnwrap(SecureNioChannel.java:350)
    at org.apache.tomcat.util.net.SecureNioChannel.handshake(SecureNioChannel.java:208)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1496)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
4

1 回答 1

1

从文档

线程 thread_name 中的异常:java.lang.OutOfMemoryError: Metaspace 原因:Java 类元数据(Java 类的虚拟机内部表示)分配在本机内存(此处称为元空间)中。当类元数据元空间用尽时,将抛出 MetaSpace 异常,详细信息为“” java.lang.OutOfMemoryError。可用于类元数据的元空间量是 MaxMetaSpaceSize,受命令行上指定的参数限制。如果超出类元数据所需的本机内存量,则会引发异常,详细信息为 MaxMetaSpaceSize。MetaSpacejava.lang.OutOfMemoryError 操作:如果在命令行上设置了 MaxMetaSpaceSize,则增加其值。MetaSpace 是从与 Java 堆相同的地址空间分配的。减小 Java 堆 MetaSpace 的大小会增加它的可用空间。这种权衡仅在 Java 堆中有额外的可用空间时才成立。以下“Out of swap space”请参考详细信息的“处理”。

在 Java 8 及更高版本中,我们可以使用以下命令设置元空间的初始大小和最大大小:

-XX:MetaspaceSize=N  - sets the initial (and minimum size) of the Metaspace.

-XX:MaxMetaspaceSize=N  - sets the maximum size of the Metaspace.
于 2019-05-11T15:19:43.593 回答