当前位置:首页 > SEO优化 > 正文

凯越p0342故障解决方案(p0131故障码什么意思)

    内存不足的问题出现在JVM服务,上,解决这个问题是一个Java技术堆栈所必需的实践能力。本文总结了一些比较常见的方案,希望对大家有所帮助。  

  

    OOM出现在爪哇服务,最常见的原因是:  

  

    有可能是内存分配真的太小了,正常业务用了很多内存(正常现象)  

  

    一个对象被频繁地应用,但是它没有被释放,并且内存不断地泄漏,导致内存耗尽(内存泄漏,代码问题)  

  

    某个资源被频繁应用,系统资源被耗尽,例如,线程不断被创建,网络连接不断被启动(线程不断被创建,代码问题)  

  

    方法:jmap-堆pid  

  

      

  

    如上所示,您可以检查新一代和老一代的分配大小和堆内存的使用情况,看看它的分配是否太小。  

  

    方法:jmap-hist : live 10765 |更多  

  

      

  

    如上所示,输入命令后,幸存对象的信息将以表格的形式显示,并根据内存大小:进行排序  

  

    大小类名的实例数占用的内存  

  

    不直观吗?对于具有更多实例和更多内存的实例/类,应查看大小,相关代码。  

  

    上图内存最多的对象是RingBufferLogEvent,总共占用内存18M,属于正常使用范围。  

  

    如果发现一个类对象占用了大量内存(比如几个G),很可能是该类对象被创建过多,一直没有释放。例如:  

  

    申请资源后,不调用close()或dispose()释放资源  

  

    消费在消费速度较慢(或停止运行),而生产不断向队列中发送任务,导致队列中任务过多  

  

    在线执行这个命令将迫使执行进行一次完整的gc。也可以转储内存进行分析。  

  

    查看进程  

  

    显示网络连接  

  

    检查进程创建的线程数和网络连接数。如果资源耗尽,也可能发生OOM。  

  

    这里有另一种方法,通过  

  

    处理细节和线程数可以单独查看。  

  

    比如某在线服务的ssh进程PID是9339。支票  

  

    如上所示,ssh总共占用四个句柄  

  

    0-标准input  

  

    1-标准output  

  

    2-标准错误输出  

  

    三插槽(容易被认为是监听端口)  

  

    ssh只有一个带PID 9339的主线程,没有多线程。  

  

    所以,只要  

  

    您可以知道进程打开的句柄和线程的数量。  

  

    JVM中的两个常见错误  

  

    堆栈溢出错误:堆栈溢出  

  

    内存不足错误: Java堆空间:堆溢出  

  

    此外,还有以下错误  

  

    内存不足错误和堆栈溢出错误属于错误,而不是异常  

  

    栈溢出,我们有最简单的递归调用,会造成栈溢出,就是深度的方法调用栈一般是512K,深度调用一直保持到栈被破坏  

  

    运行结果  

  

    创建了许多对象,导致存储的堆空间不足  

  

    当我们创建一个80M数组时,Java堆空间会直接出现  

  

    当垃圾收集回收时间太长时,它将抛出内存错误。太长的定义是超过98%的时间花费在垃圾收集上,在回收,只有不到2%的堆内存丢失  

  

      

  

    为了更快地到达效果,我们首先需要设置JVM启动参数  

  

    不正常的一步是我们一直在列表中插入字符串对象,直到我们开始GC回收  

  

    运行结果  

  

    我们可以多次看到完全垃圾回收,并且没有清理的空间。在多次执行垃圾回收操作之后,抛出了一个异常的垃圾回收开销限制  

  

    Netty NIO:这是NIO造成的  

  

    NIO程序经常使用ByteBuffer读写数据,这是一种基于通道和缓冲区的I/O模式。它可以通过使用本机函数库直接分配堆外内存  

  

    然后,存储在Java堆中的一个DirectByteBuffer对象被用作该内存的引用。这可以在某些情况下显著提高性能  

,因为避免了在Java堆和Native堆中来回复制数据。

  

    ByteBuffer.allocate(capability):第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢

  

    ByteBuffer.allocteDirect(capability):第二种方式是分配OS本地内存,不属于GC管辖范围,由于不需要内存的拷贝,所以速度相对较快

  

    如果不断分配本地内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象就不会被回收,这时候堆内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那么程序就崩溃了。

  

    一句话说:本地内存不足,但是堆内存充足的时候,就会出现这个问题

  

    我们使用 -XX:MaxDirectMemorySize=5m 配置能使用的堆外物理内存为5M

  

    然后我们申请一个6M的空间

  

    // 只设置了5M的物理内存使用,但是却分配 6M的空间 ByteBuffer bb = ByteBuffer.allocateDirect(6 * 1024 * 1024); 这个时候,运行就会出现问题了

  

    配置的maxDirectMemory:5.0MB

  

    不能够创建更多的新的线程了,也就是说创建线程的上限达到了

  

    在高并发场景的时候,会应用到

  

    高并发请求服务器时,经常会出现如下异常java.lang.OutOfMemoryError:unable to create new native thread,准确说该 native thread 异常与对应的平台有关

  

    导致原因:

  

    应用创建了太多线程,一个应用进程创建多个线程,超过系统承载极限

  

    服务器并不允许你的应用程序创建这么多线程,Linux系统默认运行单个进程可以创建的线程为1024个,如果应用创建超过这个数量,就会报 java.lang.OutOfMemoryError:unable to create new native thread

  

    解决方法

  

    想办法降低你应用程序创建线程的数量,分析应用是否真的需要创建这么多线程,如果不是,改代码将线程数降到最低

  

    对于有的应用,确实需要创建很多线程,远超过linux系统默认1024个线程限制,可以通过修改linux服务器配置,扩大linux默认限制

  

    这个时候,就会出现下列的错误,线程数大概在 900多个

  

    如何查看线程数

  

    元空间内存不足,Matespace元空间应用的是本地内存

  

    -XX:MetaspaceSize 的初始化大小为20M

  

    元空间是什么

  

    元空间就是我们的方法区,存放的是类模板,类信息,常量池等

  

    Metaspace是方法区HotSpot中的实现,它与持久代最大的区别在于:Metaspace并不在虚拟内存中,而是使用本地内存,也即在java8中,class metadata(the virtual machines internal presentation of Java class),被存储在叫做Metaspace的native memory

  

    永久代(java8后背元空间Metaspace取代了)存放了以下信息:

  

    虚拟机加载的类信息常量池静态变量即时编译后的代码

  

    模拟Metaspace空间溢出,我们不断生成类 往元空间里灌输,类占据的空间总会超过Metaspace指定的空间大小

  

    代码 在模拟异常生成时候,因为初始化的元空间为20M,因此我们使用JVM参数调整元空间的大小,为了更好的效果

  

    会出现以下错误:

  

    发生异常的次数: 201

  

    在JDK1.7之前:永久代是方法区的实现,存放了运行时常量池、字符串常量池和静态变量等。

  

    在JDK1.7:永久代是方法区的实现,将字符串常量池和静态变量等移出至堆内存。运行时常量池等剩下的还再永久代(方法区)

  

    在JDK1.8及以后:永久代被元空间替代,相当于元空间实现方法区,此时字符串常量池和静态变量还在堆,运行时常量池还在方法区(元空间),元空间使用的是直接内存。

  

    -XX:MetaspaceSize=N//设置Metaspace的初始(和最小大小)

  

    -XX:MaxMetaspaceSize=N//设置Metaspace的最大大小 与永久代很大的不同就是,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。

  

    作为阅读福利,我也整理了一些Java学习资料+面试真题,现在免费分享给阅读到本篇文章的Java程序员朋友们,需要的点击下方链接领取!!

  

    最全学习笔记大厂真题+微服务+MySQL+分布式+SSM框架+Java+Redis+数据结构与算法+网络+Linux+Spring全家桶+JVM+高并发+各大学习思维脑图+面试集合

  

    

  

    

有话要说...