美文网首页
Java问题记录

Java问题记录

作者: SHAN某人 | 来源:发表于2020-07-24 11:28 被阅读0次

    java.lang.OutOfMemoryError: Metaspace

    Metaspace 的空间与java代码无关,与Jar包有关。是jar包的空间超出了限制。

    -XX:MetaspaceSize=256m
    

    查看tomcat 进程发现-XX:MetaspaceSize=256m 确实比较小。

    $ du -sh *
    245M    app.war
    4.0K    succeed
    

    查看war包大小确实已经挺大了

    app.war/WEB-INF$ du -sh *
    16M classes
    229M    lib
    8.0K    web.xml
    

    主要的原因还是加载的jar包太多了,导致加载到Metaspace的class很多导致的
    参考链接 https://blog.csdn.net/renfufei/article/details/78061354

    需要调整的参数

    -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m 
    

    相关的参数以及说明

    -XX:MetaspaceSize(jdk8的参数)
    
      设置Metaspace的大小,默认值是21M,例如:-XX:MetaspaceSize=128M
    
    -XX:MaxMetaspaceSize(jdk8的参数)
    
      这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace
    
      无限的使用本地内存,如果超过设定的值就会触发Full GC,此值默认没有限制,
    
      但应取决于系统内存的大小,JVM会动态地改变此值。例如:-XX:MaxMetaspaceSize=4096M
    
    -XX:MinMetaspaceFreeRatio(jdk8的参数)
    
      当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比
    
      小于这个参数,那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40,
    
      也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致
    
      Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。
    
      而太大的值会导致Metaspace增长的过快,浪费内存。例如:-XX:MinMetaspaceFreeRatio=40
    
    -XX:MaxMetasaceFreeRatio(jdk8的参数)
    
      当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,
    
      那么虚拟机会释放Metaspace的部分空间。在本机该参数的默认值为70,也就是70% 
    
      例如:-XX:MaxMetasaceFreeRatio=70
    
    -XX:MaxMetaspaceExpansion(jdk8的参数)
    
      Metaspace增长时的最大幅度。例如:-XX:MaxMetaspaceExpansion=5M
    
    -XX:MinMetaspaceExpansion(jdk8的参数)
    
      Metaspace增长时的最小幅度。例如:-XX:MinMetaspaceExpansion=1M
    

    jar包冲突导致服务启动失败

    idea启动报错的输出日志

    19-Aug-2020 12:02:52.935 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/Cellar/tomcat/9.0.21/libexec/webapps/manager]
    19-Aug-2020 12:02:53.014 信息 [Catalina-utility-2] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。
    19-Aug-2020 12:02:53.041 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/Cellar/tomcat/9.0.21/libexec/webapps/manager] has finished in [106] ms
    19-Aug-2020 12:02:57.218 信息 [RMI TCP Connection(2)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。
    19-Aug-2020 12:02:57.235 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method [manageApp]
        java.lang.IllegalStateException: Error starting child
            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:720)
            at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
            at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
            at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1728)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
            at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
            at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
            at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)
            at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
            at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
            at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
            at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
            at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
            at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
            at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
            at java.security.AccessController.doPrivileged(Native Method)
            at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
            at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
            at sun.rmi.transport.Transport$1.run(Transport.java:200)
            at sun.rmi.transport.Transport$1.run(Transport.java:197)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
            at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
            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: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
            at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
            ... 43 more
        Caused by: java.lang.NoClassDefFoundError: org/eclipse/jetty/http/pathmap/PathSpec
            at org.eclipse.jetty.websocket.server.NativeWebSocketServletContainerInitializer.getDefaultFrom(NativeWebSocketServletContainerInitializer.java:38)
            at org.eclipse.jetty.websocket.server.NativeWebSocketServletContainerInitializer.onStartup(NativeWebSocketServletContainerInitializer.java:56)
            at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5132)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
            ... 44 more
        Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.http.pathmap.PathSpec
            at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
            at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
            ... 48 more
    19-Aug-2020 12:02:57.237 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method [createStandardContext]
        javax.management.RuntimeOperationsException: Exception invoking method [manageApp]
            at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:298)
            at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
            at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
            at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)
            at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
            at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
            at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
            at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
            at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
            at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
            at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
            at java.security.AccessController.doPrivileged(Native Method)
            at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
            at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
            at sun.rmi.transport.Transport$1.run(Transport.java:200)
            at sun.rmi.transport.Transport$1.run(Transport.java:197)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
            at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
            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.IllegalStateException: Error starting child
            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:720)
            at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
            at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
            at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1728)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
            ... 35 more
        Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
            at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
            ... 43 more
        Caused by: java.lang.NoClassDefFoundError: org/eclipse/jetty/http/pathmap/PathSpec
            at org.eclipse.jetty.websocket.server.NativeWebSocketServletContainerInitializer.getDefaultFrom(NativeWebSocketServletContainerInitializer.java:38)
            at org.eclipse.jetty.websocket.server.NativeWebSocketServletContainerInitializer.onStartup(NativeWebSocketServletContainerInitializer.java:56)
            at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5132)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
            ... 44 more
        Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.http.pathmap.PathSpec
            at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
            at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
            ... 48 more
    

    通过控制变量以及最近变更定位到主要是增加了某个jar


    排除冲突

    然后重新启动,世界清静了,浪费了不少时间。记录下,后续有相同的问题的话就不用费时间了。

    相关文章

      网友评论

          本文标题:Java问题记录

          本文链接:https://www.haomeiwen.com/subject/iakjlktx.html