Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java进程异常退出

Java进程异常退出

作者头像
用户7886150
修改于 2020-12-15 02:38:03
修改于 2020-12-15 02:38:03
4K0
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Java中的异常

今天,内网测试服务器A总是运行一段时间就服务器进程自行退出了,给出了“Java Result :137”这样的错误码。上网查了一下这个137,感觉没有啥有价值的东西。一开始怀疑项目中的JNI调用崩溃到底层,但是没有看到core.*这样的崩溃日志,同时也没有发现OOM的日志,也没有常见的Java 的堆异常log,关键是同样的环境,另外一台机器B,压力远比这个大,都稳定运行很长时间没有问题。下午又崩溃了两三次,一度怀疑Java是不是有什么bug,不过这个想法立马被我否认了,先从自己找原因。 

      晚上,处理完手里的其他事,到家都十一点了,觉得这个崩溃解决不了,就没法睡觉。拿起手机,随意搜了一下“JAVA进程无端退出”,看到了一篇博客提出一个运维神指令dmesg(ps:有时候这个真是救命的神指令)可以查到一个进程的异常信息,在故障诊断方面非常有用。抱着死马当活马医的想法,在出问题的机器敲了一下“dmesg -T | grep java”,看到了“memory cgroup out of memory ,processor kill ....”,这下舒了一口气,JVM进程退出的原因算是知道了,被系统杀掉了,难怪看不到log。 

     不过为什么被杀呢,查了一下cgroup(详情https://blog.csdn.net/huang987246510/article/details/80765628),了解cgroup是Linux提供一种管理系统资源的机制,尤其是控制虚拟机资源或者docker资源有广泛的应用。由于之前知道这个机器A的内存是足够大,为什么内存足够确使用呢。另外一个机器B在同样的JVM虚拟机配置下却可以。通过查询,我发现Docker可以对系统资源进行设置。这里我注意到Docker,猜想这个机器是不是有什么特殊的,这个机器是不是个docker并且限制了内存,但是Java并不能感知到这种限制。想到之前,在通过TOP 观察java进程使用内存,总是徘徊在某个定值附近,大量的内存不被使用,我查了一下docker相关知识,了解到docker通过cgroup机制,实现进程之间诸如CPU,内存,文件系统,网络等资源的隔离,而一些从执行环境收集信息的应用程序已经在 cgroups 存在之前就被执行了。“top”,“free”,“ps”,甚至 JVM 等工具都没有针对在容器内执行高度受限的 Linux 进程进行优化。详情:https://fabiokung.com/2014/03/13/memory-inside-linux-containers/;所以这些收集程序的信息是不准确,只能反映物理机的状况。至此,我假想这个A是个Docker,并且内存做了一定的限制,并且这个限制低于Xmx的设置,从而在运行时,Java堆内存在分配的时候超过了Docker的限制,就触发了cgroup的资源管理机制,在进程组使用的内存达到限额再申请内存,就会触发OOM(out of memory),从而导致进程退出,后来经过和运维同学确认这个机器配置,符合我的猜想,Docker且内存限制8G(低于设置的Xmx12G)。我修改一下Xmx,问题得以解决。 

    上述只是临时解决了问题,有没有更好的办法让Java自己感知到Docker的资源配置呢,比如内存和CPU等。幸运的是,JDK在1.8u131+及java9以后已经考虑这些问题,并且加入了实验性支持参数。具体来说,可以分为两个方面: 

一、CPU限制,即如果没有显式指定-XX:ParalllelGCThreads 或者 -XX:CICompilerCount, 那么JVM使用docker的cpu限制。如果docker有指定cpu limit,jvm参数也有指定-XX:ParalllelGCThreads 或者 -XX:CICompilerCount,那么以指定的参数为准; 

二、内存限制,通过加上-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap才能使得Xmx感知docker的memory limit;默认情况下,通过java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal可以看到 bool UseCGroupMemoryLimitForHeap = false {experimental} 是关闭的,需要手动打开;打开方式也比较简单,在项目启动参数加上 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap,这样JVM的堆内存将取Xmx和Docker设置的最小值,至此圆满解决问题。 

总结: 

1、在无异常log情况,应用退出,可以先考虑系统中断,dmesg查询相关信息 

2、docker环境会影响应用,使用需要慎重,尤其是开发者和运维人员分离的情况下,开发者应该尽量了解到运维对系统的设置。 

3、JVM的-XX参数需要了解,虽然大部分没有用,但是有些参数对系统优化非常有价值 

下面是官方对Docker支持的文档,不再翻译赘述。 

https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits 

参考文献:https://blog.csdn.net/green1893/article/details/78192017?utm_source=blogxgwz4

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
树莓派进入Bullseye版本!完全兼容Linux,视频驱动全开源
自2019年以来,树莓派的操作系统Raspberry Pi OS一直都是基于Debian10「Buster」开发的。
新智元
2021/11/23
1.6K0
玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
先要有一个制作一个U启动盘。先将SD卡格式化,再用Win32DiskImager或dd命令将raspberry官方下载的镜像烧写进去(这种文档很多的,随便找一个都可以完成操作)。
sunsky
2020/08/20
1.5K0
树莓派:设置与软件安装
拿到树莓派后,你需要进行一些初始化设置,以便于用起来更方便。除此之外,你可能需要安装一些软件,以便树莓派能实现更加强大的功能。 常见初始化设置 1)设置密码: 树莓派的默认用户名是pi,没有密码。这意味着别人可以随意使用你的树莓派。你可以在终端中为pi用户设置密码:  $sudo passwd pi 2)拓展文件系统 一开始的Raspbian镜像只有4G。这意味着你的树莓派也只会使用SD卡上4G的空间。如果SD卡有16G大小,那么就浪费了12G的空间。为此,我们可以让Raspbian的文件系统扩展到整张SD
Vamei
2018/01/18
2.9K0
树莓派:设置与软件安装
用Raspberry Pi Zero打造「即插即用」的Web服务器
*本文原创作者:yfgeek,未经许可禁止转载 虽然Raspberry Pi Zero只有4.5英镑,非常便宜,但确实具有局限性,由于缺少网口、WiFi,功能比较单一,可曾设想,用Raspberry
FB客服
2018/02/09
2.2K0
用Raspberry Pi Zero打造「即插即用」的Web服务器
Hello, Raspberry Pi.
最近在研究自动升级开源项目的时候偶然想到IoT领域的自动升级,突然想起2016年买的树莓派(Raspberry Pi)。那就分享一下如何入门树莓派的教程,我当时一共买了两块一款是Raspberry Pi 3b(2016年价格259元去年以抽奖送给社区小伙伴)另一块Raspberry Pi 3 Model b+(2018年价格221元)。在今年买了一块Raspberry Pico(24元)这些统称为开发板具体的型号如下:
JusterZhu
2022/12/07
3K0
Hello, Raspberry Pi.
树莓派4最小化安装Linux
Raspberry Pi 4 Model B发布了半年了,其强大的性能与低廉的价格使得其非常的热门。
bigmagic
2020/05/18
3.4K0
树莓派4b入手 (下篇)
推荐普通用户使用官方镜像即可. 该系统对树莓派设备适配优化的最为成熟. Download Raspberry Pi OS for Raspberry Pi https://www.raspberrypi.org/downloads/raspberry-pi-os/
acc8226
2022/05/17
1.6K0
树莓派4b入手 (下篇)
树莓派3B+安装Raspbian简易教程
刚买的树莓派3B+没过一周,树莓派4就出来了。不过算了,基本上用起来差不多,所以大家继续看吧。最近有点忙,所以就不BB了,直接上主题。
乐百川
2019/07/02
4.1K0
树莓派3B+安装Raspbian简易教程
树莓派4b基础入门「建议收藏」
树莓派(Raspberry Pi)是一款基于ARM的微型电脑主板,旨为学生计算机编程教育而设计,其系统基于Linux,由注册于英国的慈善组织“Raspberry Pi基金会”开发,Eben·Upton为项目带头人。别看其外表“娇小”,内“心”却很强大,上网、看视频、听音乐等功能都有,可谓是“麻雀虽小,五脏俱全”。自问世以来,受众多计算机发烧友和创客的追捧。 1.树莓派的家族
全栈程序员站长
2022/07/01
7.4K0
树莓派4b基础入门「建议收藏」
基于CodeSys和Raspberry Pi制作简单PLC
目前常见的PLC厂家有:SIEMENS、Rockwell、Schneider、Mitsubishi、Beckhoff、GE、Omron、台达……但常用的PLC编程语言都是相似的,比如LD、ST、FBD、CFC、IL、GRAPH等,CoDeSys支持LD、ST、IL、FBD、CFC等,用CoDeSys可以学习多种PLC编程语言,也可以向其他PLC编程软件切换,比如TwinCAT2和SoMachine就是基于CoDeSys开发的。用Raspberry Pi代替工业现场使用的PLC便于学习和各类研究等。
剑指工控
2021/11/09
2.7K0
基于CodeSys和Raspberry Pi制作简单PLC
Raspberry Pi尝试Raspbmc可以用Yatse遥控
作者:matrix 被围观: 2,057 次 发布时间:2013-07-17 分类:兼容并蓄 零零星星 | 无评论 »
HHTjim 部落格
2022/09/26
5080
Raspberry Pi尝试Raspbmc可以用Yatse遥控
树莓派4B上手 - 从初始设置开始
环境说明: 设备:树莓派4B 操作系统:Raspberry Pi OS 5.4 32位
知识分子没文化
2023/07/01
6270
BeagleBone AI VS Raspberry 4评测
最近一直在研究树莓派4和BeagleBone AI。对于派4的使用和资料查询的比较多,但是对于狗板的探究也没有停下来。说起树莓派,大家都很熟悉,但是狗板却不一定玩过。其实两者都是卡片电脑,如果单从使用的角度来说,两者并无十分大的区别,但是树莓派的社区很强大,开源项目也很多,狗板社区虽然不多,但是由于有了树莓派社区的支持,使得其生态也不断的完善起来。
bigmagic
2020/11/17
2K0
BeagleBone AI VS Raspberry 4评测
树莓派 Raspberry Pi 连接 WiFi
在有显示器和鼠标键盘的情况下,而你安装的系统又是包含桌面图形界面的,那么直接开机,进入系统后,可以看到桌面如下图。
全栈程序员站长
2022/08/30
3.1K0
树莓派 Raspberry Pi 连接 WiFi
Raspberry Pi上的OpenVINO,OpenCV和Movidius NCS
在本教程中,将学习如何将OpenVINO工具包与OpenCV一起使用,以便在Raspberry Pi上进行更快速的深度学习推理。
代码医生工作室
2019/06/21
4.4K0
树莓派安装raspbian并配置开发环境
首先准备好我们要烧录的raspbian系统,可以在树莓派官网中下载https://www.raspberrypi.org/downloads/
墨文
2020/02/28
3.8K0
树莓派安装raspbian并配置开发环境
远程控制树莓派3b上的pi pico
树莓派pi pico和树莓派4相比差别很大,但是pi pico有一些特点是树莓派4上没有的,比如实时性控制上,采用cortex-m系列方案会更加占据优势,所以往往都会使用树莓派+Arduino组成一个具有实时控制的系统。另外树莓派上是没有AD采样的,而pi pico则有12位的ad采样功能。而且在树莓派3b或者树莓派2上,只有一路串口,这样只需要一个低成本的pi pico则可以实现I2C、SPI、UART的扩展,这样是非常方便的,得一提的则是树莓派上没有而pi pico的ADC功能,下面通过一个集成方案来将树莓派和pi pico的ADC结合起来进行使用。
bigmagic
2021/03/10
1.6K0
【树莓派】树莓派4B新手篇:安装官网Raspbian Buster系统及基础配置
对于很多程序员而言,树莓派如今已经如雷贯耳,对于我一个新入行AI领域研究的新人而言,树莓派激发了我极大的兴趣。最开始知道树莓派,是因为我之前做了一个语音对话机器人,然后在查询有关资料的时候发现有人用树莓派做了一个语音对话机器人,于是乎很惊奇,心中一直想自己动手实验一下。刚好那时候听说树莓派4B新上市,各方面的性能至少提升了3倍以上,好奇心害死猫,所以我决定入坑树莓派了。
全栈程序员站长
2022/07/01
9K0
【树莓派】树莓派4B新手篇:安装官网Raspbian Buster系统及基础配置
树莓派python编程指南_树莓派python软件
http://downloads.raspberrypi.org/raspbian_latest
全栈程序员站长
2022/11/04
3.3K0
树莓派python编程指南_树莓派python软件
入门树莓派及NAS软件安装
Raspberry PI是arm架构的OS。官方售卖的是主板,电源、风扇、SD卡、盒子等配件需要自行购买。
码之有理
2024/06/12
5910
推荐阅读
相关推荐
树莓派进入Bullseye版本!完全兼容Linux,视频驱动全开源
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档