记录一次服务器内存溢出

事先声明,我是一个快乐的java coder,不是运维,吼吼。

2015-08-03 晚,在阿里云上创建了一个centos(1核1G内存)实例,准备搭建一个简单java环境,环境如下:

  1、jdk1.6-45(64bit-系统服务)

  2、mysql5.5(64bit-系统服务)

  3、memcached1.4.4-14(64bit-系统服务)

  4、nginx1.8.0系统服务

  5、tomcat6.0.44:做了集群,copy了三份:

      5i-admin01:端口8201

      5i-net01:端口8211

      5i-net02:端口8212

  然后顺便书写了tomcat启动脚本,测试下start、stop、restart命令。

  配置nginx,配置mysql等等;

至此,简单的java环境基本搭建OK了。

但是,奇怪的事情发生了,启动5i-admin01和5i-net01成功,但是启动5i-net02居然失败了,内存不足,我可是1G啊况且只启动三个tomcat,没道理啊,各种优化,清理进程,OK,5i-net02启动成功了。然后启动项目中多线程爬虫,爬取数据到我的数据库中(我全站静态化,静态化的数据全部从互联网通过爬虫爬过来)……pia……爬虫项目挂了……重启,启动爬虫线程……pia……爬虫项目又挂了……反反复复,同事要去吃饭,暂时搁置了。

2015-08-03 18:20 ,今晚下班,迅速出门吃饭回来,准备大干一场,解决这么个玩意儿。

第一步,我想既然内存不足,那么这1G内存都被谁给吃了?直接来命令:

  # top    按键大写M

  在进程列表打开的一瞬间,茅塞顿开,列表中存在5个java进程,每个占用约150M内存,OK,记录下进程的PID;

第二步,查看进程的来源

  既然是java进程,而我服务器暂时只安装tomcat这一个会启动进程的容易,没跑的,就是它了,但是为了确定我还是做了下面一部,查看进程来源;

  # netstat -ntlp

  在第一步中记录的PID,在新打开的端口列表中查找,果然找到了对应的端口号,8080,8081等等。

  至此真想大白,这些java进程是运行中的tomcat,是我在测试tomcat启动脚本的时候,启动的一些进程,但是都没有关闭,因此一直占据着大量内存不释放,OK,至此解决方案就很明晰了;

第三步:杀掉无用进程

  # kill 9 PID

整个世界一下子就清爽了,内存占用一下子从950M降到了200M。然后,重启三个项目,开启爬虫,cool,十分钟之内5000条记录轻松记录到数据库,而内存占用一直维持在500M,即使在多线程爬虫工作的时候(访问地址见我的另一篇文章:一个有意思的网站)。

时间: 2024-12-25 19:03:23

记录一次服务器内存溢出的相关文章

Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 代码中存在死循环或循环产生过多重复的对象实体: 使用的

一次偶然的Java内存溢出引发的思考

据说一次SQL查询返回太多数据,会引起服务器内存溢出. 不过,我现在碰到的情况是,调用一个Postgresql 存储过程,很复杂,那么在其中有很多raise notice这样的调试语句,如果碰巧有个死循环,那么,这些个raise notice的message会不停地发送给服务器,最终也会引发服务器内存溢出. (具体的表现是,该操作始终不返回,其他操作越来越慢,最终服务器抛出OutOfMemory Exception) 如果要定位具体的代码,可以通过jdk自带的工具如jps.jmap.jvisua

jmeter内存溢出处理方式记录

空间管理您的位置: 51Testing软件测试网 » ayuyua的个人空间 » 日志 jmeter内存溢出处理方式记录 上一篇 / 下一篇  2014-09-24 11:26:43 / 个人分类:jmeter学习 查看( 6 ) / 评论( 0 ) / 评分( 0 / 0 ) 使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jmeter.bat中增加了JVM_ARGS="-Xmx2048m -Xms2048m -Xmn256m

Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识. 在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识.jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域).Heap space(堆区域).Java Stacks(Java栈).其中永久保存区域主要存放Class

Java常见的几种内存溢出及解决方案

1.JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap space JVM在启动的时候会自动设置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置.Heap的大小是Young Generation 和Tenured Generaion 之和.在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息.解决方法:手动设置JVM Heap(堆)的大小. Java堆用于储存对

内存溢出和内存泄漏的区别、产生原因以及解决方案 转

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产

[转]Java内存溢出详解及解决方案

原文地址:http://blog.csdn.net/xianmiao2009/article/details/49254391 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题.内存溢出与锁表则不然,一般现象是操作一般时间后系统越来越慢,直到死机,但并不能明确是在什么操作上出现的,发生的时间点也没有规律,查看日志或查看数据库也不能定位出问题的代码. 更严重的是内存溢出与数

内存溢出的解决思路

    内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存. 引起内存溢出的原因有很多种,常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小: 内存溢出的解决方案:第一步,修改JVM启动参数,直接增加内存.(-Xms,-Xmx

Java内存区域与内存溢出异常-内存区域

Java内存区域与内存溢出异常 概述 对于 C 和 C++程序开发的开发人员来说,在内存管理领域,程序员对内存拥有绝对的使用权,但是也要主要到正确的使用和清理内存,这就要求程序员有较高的水平. 而对于 Java 程序员来说,在虚拟机的自动内存管理机制的帮助下,不再需要为每一个 new 操作去写配对的 delete/free 代码,而且不容易出现内存泄漏和内存溢出问题,看起来由虚拟机管理内存一切都很美好.不过,也正是因为 Java 程序员把内存控制的权力交给了 Java 虚拟机,一旦出现内存泄漏和