返回顶部
首页 > 资讯 > 服务器 >Java服务器宕机的解决方法论
  • 387
分享到

Java服务器宕机的解决方法论

2024-04-02 19:04:59 387人浏览 独家记忆
摘要

1 宕机概要 1.1 定义 向服务器的请求都没有响应或者响应非常慢。 前端界面的崩溃并非宕机。 1.2 分类 进程闪退 内部崩溃 外部终止 线程锁死或者无限等待

1 宕机概要

1.1 定义

服务器的请求都没有响应或者响应非常慢。

前端界面的崩溃并非宕机。

1.2 分类

进程闪退

  • 内部崩溃
  • 外部终止

线程死或者无限等待

内存溢出

下面分别进行详解

2 进程闪退

2.1 内部崩溃

JVM 发生内部崩溃,必然会生成"hs_err_pid"开头的文件。

下面讲一种常见情况:

无法申请内存,显示commit_memory错误


Current thread (0x00007f3e40013000):  JavaThread "Unknown thread" [_thread_in_vm, id=11408, stack(0x00007f3e49983000,0x00007f3e49a84000)]
 
Stack: [0x00007f3e49983000,0x00007f3e49a84000],  sp=0x00007f3e49a82360,  free space=1020k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x9a32da]  VMError::report_and_die()+0x2ea
V  [libjvm.so+0x497f7b]  report_vm_out_of_memory(char const*, int, unsigned long, char const*)+0x9b
V  [libjvm.so+0x81fcce]  os::linux::commit_memory_impl(char*, unsigned long, bool)+0xfe
V  [libjvm.so+0x820219]  os::pd_commit_memory(char*, unsigned long, unsigned long, bool)+0x29
V  [libjvm.so+0x819faa]  os::commit_memory(char*, unsigned long, unsigned long, bool)+0x2a
V  [libjvm.so+0x99eae9]  VirtualSpace::expand_by(unsigned long, bool)+0x1c9
V  [libjvm.so+0x99ec6d]  VirtualSpace::initialize(ReservedSpace, unsigned long)+0xcd
V  [libjvm.so+0x57962f]  CardGeneration::CardGeneration(ReservedSpace, unsigned long, int, GenRemSet*)+0x11f
V  [libjvm.so+0x46ceed]  ConcurrentMarkSweepGeneration::ConcurrentMarkSweepGeneration(ReservedSpace, unsigned long, int, CardTableRS*, bool, FreeBlockDictionary<FreeChunk>::DictionaryChoice)+0x5d
V  [libjvm.so+0x57a906]  GenerationSpec::init(ReservedSpace, int, GenRemSet*)+0x106
V  [libjvm.so+0x56afe4]  GenCollectedHeap::initialize()+0x344
V  [libjvm.so+0x9751aa]  Universe::initialize_heap()+0xca
V  [libjvm.so+0x976379]  universe_init()+0x79
V  [libjvm.so+0x5b1d25]  init_globals()+0x65
V  [libjvm.so+0x95dc6d]  Threads::create_vm(JavaVMInitArgs*, bool*)+0x1ed
V  [libjvm.so+0x639fe4]  JNI_CreateJavaVM+0x74

这一般是因为 Xmx 设置过大,超过系统可用内存,JVM 申请内存失败。

比如服务器总内存32G ,同时运行多个程序,程序 A 配了20GXmx,其他程序也配了20G Xmx ,Linux的交换空间也没有设置,这时候如果其他程序用满20G内存那么服务的可用内存必然低于12G,这时如果Tomcat需要大于12G的内存就很容易发生该错误,直接宕机!

解决方案

  • 减少Xmx值使得所有的综合不超过服务器物理内存
  • 调整 Xms=Xmx
  • 服务器不要运行其他不必要的东西
  • 配置一部分swap空间(虚拟内存)

2.2 外部终止

如果找不到"hs_err_pid"开头的文件,那么这个进程的闪退必然是被从外部终止的。

2.2.1 OOMKiller

java长期内存占用过高,系统需要内存使用的时候没有内存,Linux的oomkiller机制会干掉最低优先级的内存

检查 /var/logs/message , /var/logs/dmesg或者对应日期文件,看看有没有类似下面的内容,日志有时间可以判断

2.2.2 ssh注销

检查/var/log/auth.log,/var/log/secure或者对应日期的文件,检查宕机的时间点有没有

时间吻合,那么宕机原因即可确认。

解决方案

使用nohup命令在后台运行启动程序,检查ssh注销原因

2.2.3 其他人为因素

不是很好判断,需要给shell加上操作记录

3 线程锁死/无限等待

表现

系统无法访问时,当前cpu占用非常低

使用 jstack命令输出线程堆栈即可


jstack pid >> 1.txt
or
jstack -F pid >> 1.txt

都行,或者用jprofiler工具看堆栈,或者其他任何可以拿到堆栈的工具都可以, java的堆栈就是java方法调用的路径,可以定位一些简单的问题

4 内存溢出

现象

CPU全部占满,内存达到配置Xmx最大值

4.1 CPU占满缘由

并不是 CPU 不够用,而是涉及到JVM的GC 机制,大部分情况来说CPU都是过剩的

JVM 使用GC的方法来回收没有被引用的内存块,在当前的回收机制中,回收器是并发进行的,回收的线程个数有一个公式:

当CPU核心数

小于8

  • 1个核心对应一个gc线程

大于8

  • gc的线程数= 8 + ((N - 8) * 5/8)

N代表核心的数量,这是默认的gc线程创建公式


threads = N <= 8 ? N : (8 + ((N - 8) * 5/8))

当然也可以通过参数 -XX:ParallelCMSThreads=20 来配置 GC 线程数,就不会使用默认的设置,默认情况下不要调整,因为调了也没什么卵用,最多在宕机的时候cpu占用按照你设定的值来。

当发生内存溢出的时候,或者快要内存溢出的时候,不一定是内存溢出,JVM 发现内存不够了,就会 GC,所有线程开始工作,暂停 JVM 运行,开始回收,如果回收到内存了,ok,jvm可以正确继续执行,

这也就是为什么有时候配置内存溢出的参数没有自动生成dump的原因,因为他能运行,但是比较慢,所以没有OOM,就不会生成dump,

如果没有回收到什么内存,gc会循环持续执行,这就导致了cpu全部占满的现象,所以说内存溢出的时候,一定伴随cpu占满(按照设置或者公式计算的线程量)

4.2 JVM内存分配机制

在说说JVM怎么分配内存的,大家都知道给客户配置Xmx参数和xms参数,Xmx代表的是最大堆内存,xms代表的是最小堆内存,至于permsize就和这些都没有关系,不能算在内存溢出,遇到抛错outofmemory permsize什么的调大就行了

permsize是一个被jvm也抛弃的参数只存在1.7之前的jdk中,是用来保存java的class等内容的存储空间,1.8被metaspace替代

这个内存怎么不回收的啊,一问都是在任务管理器看的!这个地方是看不到内存回收的,或者说他也会回收,但是可能要等个好几天才会回收一次,可以忽略这种机制的存在

形而上学

WC 论

如果把内存比喻成茅坑,操作系统64g内存就是一共64个茅坑,那么JVM的内存回收相当于茅坑调度系统,每个gc线程相当于调度系统派出去的茅坑检查员,给jvm设置了 Xms=2g, Xmx=32g,那么程序启动,jvm直接占了两个茅坑,任务管理器看到内存占用2g,即使没人上厕所,JVM也不会把坑还给操作系统。

假设一个人上厕所10秒,一开始的时候 20秒有一个人来上厕所,那么 jvm通过茅坑检查员发现哎两个坑总有一个是空的,维持茅坑数量不变,内存的占用一直是2g,过了些时候,来的人开始增多了,变成5秒有一个人来上厕所,茅坑检查员向JVM汇报有人开始有排队了,两个坑位很紧张,不行要多弄几个坑才行,于是,jvm向系统又申请了两个坑,任务管理器可以看到内存占用变成了4个G,这时候又突然发生压力增大,变成了1秒来一个人,4个坑肯定不够啊,于是jvm又把内存扩容到10-11g,现在够用了,任务管理器会看到内存一直维持在10-11g,终于大家都上完厕所了,没人排队了,茅坑都空出来了。

但是,jvm是个霸道总裁,被他占的东西,除非死不然不会吐出来的,所以任务管理器里面看到内存还是10-11g不会降低,除非jvm死了,实际没有任何内存占用(所以不要再说内存不回收的问题,这个内存的回收不回收和宕机是没有直接关系的)

如果这时候突然一下子来了很多很多人,比如一下子来了64个人要上厕所,这时候会怎样了,JVM把他的所有的茅坑检查员都派出去检查啊,然后发现完蛋了茅坑不够用啊,申请到32个都不够用啊,于是jvm的特派茅坑检查员就一个坑一个坑的拍,一个坑一个坑的催,结果呢,检查员在催,大家就拉不出来了,上厕所的时间无限期延长,外面的人要进去,里面的人出不来,BOOM,厕所就不响应了,后面来的人都拉裤子了。

怎么解决?

  • 换个茅坑管理员,更好的调度茅坑检查员和分配茅坑,这就有了G1回收器 ,茅坑越多效果越好,目前JDK情况内存大于10G的情况G1的效果好于CMS,低于10G的情况下不如CMS
  • 从源头控制人员,不要一下子来这么多人(申请内存),也就是常见的不要让业务查大量数据占内存。

而上面讲的线程锁死的情况要做类比的话,就是32个坑呗32个人占了,还死活不肯出来,导致后面排队的人失去响应了。

没有味道的比喻

解释一下java的面向对象和对象引用:

一栋大楼,10层共1000个工位 (类比物理内存)。

包给一个二房东 中介公司Z (jvm)。

中介公司和大楼物业谈好弹性缴费,租多少出去收多少钱。

Z公司先一下租300个位置 (类比Xms)省钱,

Z公司和物业谈好最多租600个位置(类比Xmx)。

Z公司找到了公司A(200人)来这里 就占用了200个工位 (类比一次数据查询)。

公司A是一个大的对象,每个人类比最小的单元格,每个小团队也是一个对象,个人被小团队引用,小团队又被更上级的比如产品,比如大技术支持大团队引用,大团队又被公司引用,最终公司这个大对象占用了200工位,类比下来200个工位内存不释放的根就是这个公司在这儿上班。

这时候公司A倒闭了,200个工位就空出来了(内存释放)。

  • 内存溢出宕机是什么情况呢?
  • 找Z公司租工位的公司,总工位超过了600,总不能坐大腿上上班啊,于是物业不会给Z工位的,合同写的好好的,Z公司不满足客户需求,运作不起来破产倒闭。
  • 经常遇到的申请内存失败的崩溃是什么情况?
  • 物业是个滑头,不止找了Z公司一家中介,还有Y公司也是做中介的(类比两个JVM)。都承诺Z和Y公司都是最多可以租600个位置。初始都租的300个位置,大家相处融洽,随着公司不停入住,矛盾出现了:
  • Y公司效益比较好,先找了公司,已经占了600位置;
  • 这时候Z公司的效益也上来了,也要增加工位 (类比申请内存),这时候物业根本没有位置能给他。于是Z公司运转不下去,破产倒闭

5 总结

宕机分析的目的就是要找到占用内存的东西,把他找出来,找出他的原因,然后把它改掉。JVM的内存对象分配相当于一颗树,所有的对象都被层层引用,直到GCRoot根节点,如果没有根节点的引用,这个对象是完全可以直接释放掉的,大部分也是因为gcRoot存在的对象过多导致的宕机,当然也不排除可以使用已经回收的对象来分析,由于生成dump的时间不精确,可能他生成的时候 ,对应的大组件已经回收了,但是jvm缓过来还需要一些时间,所以还是处于大量gc的状态,这时候只能通过对于引用的检索找到最多的引用对象来进行分析。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java服务器宕机的解决方法论

本文链接: https://lsjlt.com/news/131865.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java服务器宕机的解决方法论
    1 宕机概要 1.1 定义 向服务器的请求都没有响应或者响应非常慢。 前端界面的崩溃并非宕机。 1.2 分类 进程闪退 内部崩溃 外部终止 线程锁死或者无限等待 ...
    99+
    2024-04-02
  • 阿里云服务器宕机问题解决方法
    1. 确认宕机原因 当阿里云服务器出现宕机时,首先需要确认宕机的原因。可能的原因包括硬件故障、网络问题、操作系统错误等。通过查看服务器的日志和监控信息,可以帮助确定宕机原因。 2. 重启服务器 如果宕机是由于临时的问题引起的,例如内存溢出...
    99+
    2023-10-28
    阿里 解决方法 服务器
  • 阿里云服务器私网ip宕机的解决方法
    阿里云服务器是众多企业和个人选择的重要服务器平台,但由于各种原因,阿里云服务器的私网ip可能会出现宕机的情况。本文将详细介绍如何解决阿里云服务器私网ip宕机的问题。 问题的识别 阿里云服务器私网ip宕机是指阿里云服务器的私网ip无法连接,导...
    99+
    2023-10-29
    阿里 解决方法 服务器
  • 服务器宕机如何解决
    服务器宕机的解决方法:1、及时发现服务器宕机问题,尽早通知服务商进行解决,以免造成不必要的损失;2、准备两个网站空间,存放的内容相同,ip和机房的地理位置不同,能大大降低服务器宕机的可能性。具体内容如下:要及时发现服务器宕机的问题时间就是金...
    99+
    2024-04-02
  • 服务器宕机怎么解决
    当服务器宕机时,可以尝试以下几种方法来解决问题: 重启服务器:尝试通过远程管理工具或者物理操作重新启动服务器,看看是否可以恢复正...
    99+
    2024-04-24
    服务器
  • 云主机服务器宕机如何解决
    当云主机服务器宕机时,您可以采取以下步骤来解决问题:1. 确认宕机原因:首先需要确认宕机的原因,可能是硬件故障、网络故障、操作系统崩...
    99+
    2023-09-13
    云主机 服务器
  • 香港阿里云服务器宕机怎么办解决方法
    1. 确认服务器宕机原因 在处理服务器宕机问题之前,首先需要确认服务器宕机的原因。可能的原因包括硬件故障、网络故障、操作系统故障等。如果是硬件故障,需要联系阿里云客服进行维修或更换硬件。如果是网络故障,可以尝试重启路由器或联系网络服务提供...
    99+
    2023-10-26
    阿里 香港 解决方法
  • 阿里云的服务器是否会宕机?如何解决宕机问?
    本文主要针对阿里云服务器是否会宕机这一问题进行详细介绍,同时提供解决宕机问题的方法和策略。希望对您在使用阿里云服务器时有所帮助。 一、阿里云服务器是否会宕机首先,我们需要明确一点,任何云服务都会发生宕机。阿里云服务器也不例外。云服务器在运行...
    99+
    2023-11-10
    阿里 是否会 如何解决
  • 服务器出现宕机怎么解决
    服务器出现宕机解决的方法:1、及时发现服务器宕机问题,尽早通知服务商解决相关问题;2、准备2个网站空间,存放的内容相同,ip不同,且机房的地理位置不同,发现宕机问题后,能迅速通过修改dnspod.com中的域名记录,指向目前正常的网站空间。...
    99+
    2024-04-02
  • 服务器出现宕机如何解决
    服务器宕机可能有多种原因,以下是一些常见的解决方法: 检查电源和网络连接:确保服务器所连接的电源和网络都没有问题,可以尝试重新插...
    99+
    2024-05-09
    服务器
  • 服务器宕机的原因及解决方案是什么
    今天就跟大家聊聊有关服务器宕机的原因及解决方案是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 相信不少站长都碰到过服务器宕机的现象,服务器宕机是指服务器因为某些原因而...
    99+
    2023-06-07
  • 阿里云服务器宕机的原因及解决方案
    随着云计算技术的发展,越来越多的企业和个人选择使用阿里云服务器。然而,一些用户发现阿里云服务器经常宕机,这不仅影响了他们的业务运营,也给他们带来了不便。那么,阿里云服务器宕机的原因是什么呢?本文将对此进行详细的解答,并提供一些解决方案。 一...
    99+
    2023-11-01
    阿里 解决方案 原因
  • 阿里云服务器宕机影响与解决方案
    本文将详细介绍2021年5月24日阿里云服务器宕机事件,以及其对用户的影响和可能的解决方案。 2021年5月24日,全球最大的云计算服务商之一——阿里云发生了严重的服务器宕机事件,导致许多用户无法访问其提供的服务,如云服务器、数据库、存储等...
    99+
    2024-01-25
    阿里 解决方案 服务器
  • 服务器出现宕机该如何解决
    服务器出现宕机的解决方法:1、及时发现服务器宕机,尽早通知服务商解决相关问题,避免造成不必要的损失;2、准备两个网站空间,通过修改dnspod.com中的域名记录,指向正常的网站空间即可解决。具体内容如下:要即时发现服务器宕机的问题。时间就...
    99+
    2024-04-02
  • 服务器出现宕机该怎么解决
    当服务器出现宕机时,通常可以通过以下方法来尝试解决问题: 重启服务器:尝试通过物理按钮或远程管理工具重新启动服务器,看看是否可以...
    99+
    2024-04-23
    服务器
  • 负载均衡服务器宕机如何解决
    当负载均衡服务器宕机时,可以采取以下措施进行解决:1. 确定故障原因:首先要确定负载均衡服务器宕机的原因是什么,可能是硬件故障、网络...
    99+
    2023-09-02
    负载均衡 服务器
  • 阿里云服务器宕机原因、影响与解决方案
    阿里云是全球领先的云计算服务商,为数以百万计的企业和开发者提供强大的计算、存储、数据库、网络、安全、开发等云计算服务。然而,就像所有的技术服务一样,阿里云也可能会出现服务器宕机的情况。那么,服务器宕机的原因是什么?它会对企业和用户造成什么影...
    99+
    2023-11-01
    阿里 解决方案 原因
  • 阿里云服务器出现宕机怎么解决的
    检查服务器硬件和软件 在服务器宕机之前,我们需要检查服务器硬件和软件是否正常。如果服务器出现硬件问题,需要立即停止服务器的运行,并且联系技术支持人员进行检查。如果服务器出现软件问题,需要立即停止服务器的运行,并且联系技术支持人员进行检...
    99+
    2023-10-27
    阿里 服务器
  • 亚马逊云服务宕机:影响和解决方案
    1. 事件概述 最近,亚马逊云服务(AWS)在全球范围内出现了一次宕机事件,导致许多网站和应用程序无法正常运行。这次宕机事件发生在2021年11月25日,持续时间约为数小时。 2. 影响 这次AWS宕机事件对许多企业和组织造成了严重影响。...
    99+
    2023-10-27
    亚马逊 解决方案
  • 亚马逊云服务器宕机怎么办解决
    1. 确认宕机原因 当亚马逊云服务器宕机时,首先需要确认宕机的原因。可能的原因包括网络故障、硬件故障、操作系统问题等。通过查看系统日志和监控数据,可以帮助你确定宕机的具体原因。 2. 重新启动服务器 如果宕机是由于临时的网络或操作系统问题...
    99+
    2023-10-27
    亚马逊 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作