专栏首页码农编程进阶笔记常驻内存以及如何避免内存泄漏

常驻内存以及如何避免内存泄漏

swoole常驻内存

server一开始就把我们的代码加载到内存中了,无论后期我们怎么修改本地磁盘上的代码,客户端再次发起请求的时候,永远都是内存中的代码在生效,所以我们只能终止server,释放内存然后再重启server,重新把新的代码加载到内存中

swoole内存泄漏

因为swoole常驻内存的特性,尤其是server中定义的全局变量(global声明的变量,static静态变量或对象和超全局变量),在使用完之后是不会被释放,久而久之就可能会发生内存溢出。

如何避免内存泄漏

使用max_request 和 task_max_request 来避免内存泄漏 max_request:worker进程的最大任务数,当worker进程处理的任务数超过这个参数时,worker进程会自动退出,以此达到释放内存和资源的目的。

max_request参数使用限制

  1. max_request只能用于同步阻塞、无状态的请求响应式服务器程序
  2. 纯异步的Server不应当设置max_request
  3. 使用Base模式时max_request是无效的

其中Base模式是swoole运行模式的一种,我们主要介绍多进程模式。

总结:

  1. 常驻内存减少了不小开销,swoole不错
  2. 应尽量避免使用全局变量,不用最好,没啥用
  3. max_request可以解决php的内存溢出问题,但是主要还是要养成释放内存的习惯,因为max_request也有限制场景

使用max_request和 task_max_request 可有效避免内存泄漏

server的代码简写

为了方便测试,我们只设置1个Worker进程,1个Task进程,Worker进程的最大任务设置为3次,Task进程的最大任务设置为4次。

$serv = new swoole_server('127.0.0.1', 9501);

$serv->set([
    'worker_num' => 1,
    'task_worker_num' => 1,
    'max_request' => 3,
    'task_max_request' => 4,
]);
$serv->on('Connect', function ($serv, $fd) {
});
$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
    $serv->task($data);
});
$serv->on('Task', function ($serv, $taskId, $fromId, $data) {
});
$serv->on('Finish', function ($serv, $taskId, $data) {
});
$serv->on('Close', function ($serv, $fd) {
});
$serv->start();

client代码

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
$client->connect('127.0.0.1', 9501) || exit("connect failed. Error: {$client->errCode}\n");

// 向服务端发送数据
$client -> send("Just a test.");
$client->close();

客户端第1次请求后,server进程结构

注意进程id为15644和15645,这两个一个是Worker进程,一个是Task进程。

客户端请求第3次后,server进程结构

进程id 15645变成了15680 请求3次后Worker进程自动退出了(并释放内存),然后Manager进程拉起了新的Worker进程(15680)。

客户端请求第4次后,server进程结构

进程id 15644变成了15704 请求第4次后Task进程自动退出了(并释放内存),然后Manager进程拉起了新的Task进程(15704)。

本文分享自微信公众号 - 码农编程进阶笔记(lxw1844912514),作者:竹子

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【tensorflow】tensorflow如何避免内存泄漏

    一定要用 sess.graph.finalize(),相当于把整个图冻住,使图变为只读的形式,不再允许增加节点。

    JNingWei
  • 使用 ThreadLocal 如何避免内存泄漏?

    每个线程需要一个独享对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)

    Java识堂
  • Kotlin中的handler如何避免内存泄漏详解

    摘自百度的一段话:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。

    砸漏
  • 如何避免内存泄漏、溢出的几种常用方法

    好的办法是使用临时变量的时候,让引用变量在退出活动域后自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。

    良月柒
  • ThreadLocal以及内存泄漏

    ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果...

    猿芯
  • Android内存优化(三)避免可控的内存泄漏

    前言 内存泄漏向来都是内存优化的重点,它如同幽灵一般存于我们的应用当中,有时它不会现身,但一旦现身就会让你头疼不已。因此,如何避免、发现和解决内存泄漏就变得尤为...

    用户1269200
  • JavaScript 内存泄露的4种方式及如何避免

    本文将探索常见的客户端 JavaScript 内存泄露,以及如何使用 Chrome 开发工具发现问题。

    哲洛不闹
  • JavaScript中的内存泄漏以及如何处理

    葡萄城控件
  • node内存泄漏以及定位

    ? 之前一次偶然机会发现,react 在server渲染时,当NODE_ENV != production时,会导致内存泄漏。具体issues: https...

    IMWeb前端团队
  • node内存泄漏以及定位

    之前一次偶然机会发现,react 在server渲染时,当NODE_ENV != production时,会导致内存泄漏。具体issues: https://...

    IMWeb前端团队
  • React Hooks中这样写HTTP请求可以避免内存泄漏

    今天,让我们看一下在 React Hooks 中使用 fetch 和Abort Controller取消Web请求从而来避免内存泄露!?

    秋风的笔记
  • ThreadLocal内存泄漏问题及如何解决

    神秘的寇先森
  • Linux如何调试内存泄漏

    内存泄漏是指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前...

    C语言与CPP编程
  • JavaScript内存管理机制以及四种常见的内存泄漏解析

    几个星期前,我们开始编写深入研究JavaScript工作原理的系列文章。通过阅读这些文章,你可以了解到JavaScript的构建块及其交互原理,从而能够编写出更...

    CSDN技术头条
  • [译]JS的内存管理及4种常见的内存泄漏

    原文:https://blog.sessionstack.com/how-javascript-works-memory-management-how-to-h...

    江米小枣
  • JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏

    本中,我们将讨论另一个重要主题——内存管理,这是由于日常使用的编程语言越来越成熟和复杂,开发人员容易忽视这一问题。我们还将提供一些有关如何处理JavaScrip...

    Javanx
  • java的内存泄露是如何发生的,如何避免和发现?

    马克-to-win:上一节讲了,(i)对象被置成null.(ii)局部对象(无需置成null)当程序运行到右大括号.(iii)匿名对象刚用完,垃圾回收线程就早早...

    马克java社区
  • 直播教育系统开发中,如何避免内存泄露

    直播教育系统开发的过程中,在Activity等组件中使用网络服务的异步人物的时候,一般需要在组件销毁的生命周期中进行手动取消任务判断,不然的话可能会造成内存泄漏...

    万岳教育系统
  • 如何优雅地检测内存泄漏?

    作者:jerrychu  腾讯PCG客户端开发工程师 |导语  内存优化一直是客户端性能优化的重要组成部分,内存泄漏又是内存问题的一大罪魁祸首。如何高效快速地...

    腾讯大讲堂

扫码关注云+社区

领取腾讯云代金券