java进程老挂掉_JAVA进程突然挂掉 - 1024菜bird的个人空间 - OSCHINA - 中文开源技术交流社区...
JVM内存不足导致进程死掉. Native memory allocation (mmap) failed to map
一台服务器上部署很多JAVA进程已经是微服务的常态,但也有些坑。
背景,测试服务器上的一些JAVA进程突然挂掉,查看call back的日志发现如下:
# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 1786867712 bytes for committing reserved memory. # Possible reasons: # The system is out of physical RAM or swap space # In 32 bit mode, the process size limit was hit # Possible solutions: # Reduce memory load on the system # Increase physical memory or swap space # Check if swap backing store is full # Use 64 bit Java on a 64 bit OS # Decrease Java heap size (-Xmx/-Xms) # Decrease number of Java threads # Decrease Java thread stack sizes (-Xss) # Set larger code cache with -XX:ReservedCodeCacheSize= # This output file may be truncated or incomplete. # # Out of Memory Error (os_linux.cpp:2673), pid=28610, tid=139813184919296 # # JRE version: Java(TM) SE Runtime Environment (8.0_40-b26) (build 1.8.0_40-b26) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.40-b25 mixed mode linux-amd64 compressed oops) #
很明显是由于服务器的内存不足造成
内存不够用分两种情况
推测:内存不够用分两种情况
推测 1, JAVA程序使用的内存申请超出了JVM分配的, 此类只会抛出
java.lang.OutOfMemoryError: Java heap space,JAVA进程是不会有影响,下次也可以继续接受请求提供服务
推测 2, JVM尝试去像操作系统申请一块内存超出系统的可使用(RSS)内存时, 此时linux会结束JAVA进程,并抛出如上错误。
这种场景也常见: 如在一台16G内存的服务器上跑着两个服务,两个服务同时启动各自分配10G内存,因为JVM的垃圾回收机制一般情况下是不会有问题,能正常服务,当两个服务同时需要用到的内存超出16G时,将会被linux干掉一个服务.
(注: JVM启动时,通过-Xmx等参数分配的内存只会影响到VIRT ,详见上一篇博客《JAVA进程和linux内存间的大小关系》
证实:
去证实是最重要的, 上面的都是我的推测
一台内存是1G的linux服务器
total used free shared buffers cached Mem: 984 119 864 0 2 20 -/+ buffers/cache: 97 886 Swap: 2044 45 1999
物理内存+swap内存 在 3G左右 (886+1999)
加入JAVA程序,因为是要观察JAVA的内存超出是否会终止JAVA的进程,故思路如下设计
1,用一个线程去申请分配内存
2,主线程不停报告存活状态
程序如下
/** * 用于演示内存不足导致JAVA进程退出, 注意:输入的size勿导致超出int (1024 * 1024 * size) * * */
public class TestClass {
public static void main(String[] args) throws IOException, InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
//接收测试内存的大小,单位m
byte[] byteSize = new byte[50];
System.out.print("input want to allocation memory:");
int temp = System.in.read(byteSize);
String sizeStr = new String(byteSize, 0, temp);
int size = Integer.parseInt(sizeStr.trim());
System.out.println(1024 * 1024 * size);
byte[] bt = new byte[1024 * 1024 * size];
System.out.println("succ..allocation: " + size + "m");
//阻30分,防止垃圾回收
Thread.sleep(1000 * 60 * 3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
t1.start();
while (true) {
Thread.sleep(1000 * 20);
System.out.println(Thread.currentThread().getId() + ": i'm alive");
}
}
证实推测1:
运行程序,输入1000 (这里只要超过了年龄代内存其实就会抛出异常)
Exception in thread "Thread-0" java.lang.NegativeArraySizeException
at com.pp.TestClass$1.run(TestClass.java:19)
at java.lang.Thread.run(Thread.java:662)
1: i'm alive
1: i'm alive
输出 alive, 证明了推测1,使用内存超出了并不会导致JAVA进程死掉
证实推测2:
打开窗口1 , 运行,输入
root@ubuntu:/home/hejinbin# java -Xmx3048m -Xms3048m org.hejinbin.memory.test.Test
input want to allocation memory:
打开窗口2 , 运行,输入
然后在窗口1输入1500
运行如下:
input want to allocation memory:1500
succ..allocation: 1500m
然后在窗口2,输入1500
此时发现窗口1的JAVA进程被杀掉了,完整如下
succ..allocation: 1500m
Killed
证实了推测2
结论: 如今微服务流行(趁点热度)。很多进程同时在一台服务器上跑, 必须注意,分配给JAVA的内存只和一定在服务器的可用内存之内。不然很有可能突然被linux干掉一个进程
java进程老挂掉_JAVA进程突然挂掉 - 1024菜bird的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐
- java构造函数重载继承_Java基础-继承 - 写代码换盆的个人空间 - OSCHINA - 中文开源技术交流社区...
访问权限 Java 中有三个访问权限修饰符:private.protected 以及 public,如果不加访问修饰符,表示包级可见. 可以对类或类中的成员(字段和方法)加上访问修饰符. 类可见表示其 ...
- java实现gdal栅格矢量化_gdal栅格矢量化 - osc_lfs4vsih的个人空间 - OSCHINA - 中文开源技术交流社区...
#include "gdal_alg.h" 栅格矢量化功能用于将栅格数据生成矢量数据,通常用于分类图像.GDAL库中使用函数GDALPolygonize()或者函数GDALFPol ...
- 每天学习java一小时_java再学感受 - 编程一小时的个人空间 - OSCHINA - 中文开源技术交流社区...
首先的是,我买了一本新的有关于java的书,刚开始看,其实在此之前我已经学了一本java语法的书本,现在我买的这本书是我用来提升自己的java认知水平的,首先是对这本书的第一印象吧,里面的内容比较详细 ...
- java 负载均衡_java负载均衡 - 岁月静好I的个人空间 - OSCHINA - 中文开源技术交流社区...
作用 对系统的高可用,网络压力的缓解,处理能力扩容的重要手段之一. 服务器负载 我们通常所说的负载是指:服务器负载 软硬件负载 服务器负载又分为:软件负载--硬件负载 软件负载:通过在服务器上安装一些 ...
- java实现自举_实现语言的自举 - 沙枣的个人空间 - OSCHINA - 中文开源技术交流社区...
几乎所有的语言项目,其核心都是用更底层的语言写的. 底层语言大部分是 C,C++,而扩展这门语言的核心,就要用另外一种语言 去写.这给语言设计者较大的挑战. 开发语言必须具备底层语言的编写能力,而为了 ...
- java亲密数的解题思路,算法解题思路总结 - jjhgx的个人空间 - OSCHINA - 中文开源技术交流社区...
算法解题思路: 细读算法要求 找到极限情况 找到临界情况,结果依赖 找到最终的结束求解点 编程实现:考虑算法的空间复杂度和时间复杂度 案例说明: 假设: 输入字符串为:s, 长度为:slen, s的第 ...
- java选择排序不稳定_选择排序就这么简单 - Java3y的个人空间 - OSCHINA - 中文开源技术交流社区...
选择排序就这么简单 从上一篇已经讲解了冒泡排序了,本章主要讲解的是选择排序,希望大家看完能够理解并手写出选择排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出. 选择排序介绍和稳 ...
- java sql报错不能catch_java异常(转) - osc_ioa3fr1w的个人空间 - OSCHINA - 中文开源技术交流社区...
Throwable(所有error和exception的父类:超类) Java将错误变成对象交给异常处理机制 Error(仅靠程序本身无法恢复的严重错误) 一般是环境的问题,JVM的问题,并非程序的问 ...
- JAVA刷CSDN访问量_刷csdn访问量 - 鹏城二少的个人空间 - OSCHINA - 中文开源技术交流社区...
通过HttpURLConnection访问.只需改一下博客地址就行了,然后后台通过Jsoup解析博客的博客地址,然后通过多线程刷博客访问量(线程数量可根据自己电脑配置进行适当的修改 1.ListLin ...
最新文章
- Oracle之物化视图
- 敌兵布阵 HDU - 1166 (线段树)
- Linux 把文件内容发送给用户,linux上给其他在线用户发送信息(wall, write, talk, mesg)...
- python执行shell命令
- 各省12.5m的Alos DEM数据的制作与分享
- CF command line learning
- [POJ3683]Priest John's Busiest Day
- 女神节送什么比较好?适合女生用的蓝牙耳机推荐
- 2017最新qq第三方登陆教程
- flash actionscript MovieClip(电影剪辑)控制
- octagam® 10%治疗皮肌炎患者的ProDERM研究达到主要终点的阳性结果将在ACR 2020年会上呈报
- Java基础(一)Java语言概述及入门
- [hitroad杂货铺]KaTeX使用
- 计算机怎么消除用户密码,电脑开机设置了密码要怎么删除
- 打卡第二天 树形DP初步
- 目录:吴恩达机器学习课后作业
- Coles客澳市携高品质明星食品第三年亮相中国国际进口博览会
- Ubuntu搭建交叉编译环境(arm、mips、powerpc)
- 电脑上html文件可以删除吗,详细分析电脑c盘哪些文件可以删除
- iphone同步android短信恢复,android上的短信怎么恢复到iphone
热门文章
- H3CIE-RS+笔试易错题整理
- Python爬虫——4.6使用requests和正则表达式、随机代理爬取淘宝网商品信息
- 床前明月光,熊猫在烧香
- php-imagick漏洞,PHP Imagick内存泄漏
- android-gif-drawable教程
- echarts关系图配置,及超出范围处理 + a、b两个节点互相指向时线上的字重叠问题
- 我真的服了自己了,原来用python调整视频数据速率(码率)如此简单
- 视频编码之软解与硬解区别
- 领导暴怒发言:技术就是古代的叫花子,贱命一条!
- vivo x7 android版本,vivo X7/Xplay5S等机型获Android 7.1升级