• 记录一次服务器内存溢出


    事先声明,我是一个快乐的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,即使在多线程爬虫工作的时候(访问地址见我的另一篇文章:一个有意思的网站)。

  • 相关阅读:
    ASP.NET Core 介绍和项目解读
    C#性能优化总结
    C# 线程知识--使用Task执行异步操作
    异步编程 In .NET(转载)
    .NET实现WebSocket服务端即时通信实例
    .net core 学习笔记一 Program与Startup
    .net core 自定义中间件
    c# 通过json.net中的JsonConverter进行自定义序列化与反序列化
    c# 通过HttpListener创建HTTP服务
    c# 反射实现模型深拷贝
  • 原文地址:https://www.cnblogs.com/xuxueli/p/4703101.html
Copyright © 2020-2023  润新知