lua5.4 分代垃圾回收

前注

最近我看了 lua 5.4 分代垃圾回收的代码,网上很少讲到这块内容,于是,我写这篇文章分享一下,也当做总结。文章就以我看的 lua 5.4.4 做分析。

在进入今天的主题前,先回顾我之前写的 lua5.3 垃圾回收分析,重复的内容不再赘述。

lua 5.4 支持两种 gc 方式, 增量式 gc 和分代 gc ,默认是增量式,可以通过以下 api 切换。

切换成分代 gc:
collectgarbage "generational"
切换成增量式 gc:
collectgarbage "incremental"

提出问题

1. 增量式 gc 跟分代 gc 的对比?
2. 分代 gc 过程是怎样的?
3. 分代 gc 有哪些状态?
4. 分代 gc 怎么调优?

继续阅读lua5.4 分代垃圾回收

skynet 高内存占用问题

前段时间,在服务器的监控后台发现,在线人数上去后 skynet 进程内存成倍升高,占系统 40% ~ 50 %,但人数回落到 1/3 后,内存使用并没有明显减少,仍有 40 % 左右。

服务器、skynet相关版本信息如下:
linux version 4.18.0
skynet v1.1.0
lua 5.3.4
jemalloc 5.0.1-0

我在本地压测时,却没有发现这个情况。在线人数上去,内存也是一样增加,但人数下来后,内存也逐渐释放了。项目代码是一样的,唯一不同的是,本地压测使用的系统是 CentOS 7 (Linux version 3.10.0), 我换了 CentOS 8 (Linux version 4.18.0) 压测后,发现跟线上的问题一样。
继续阅读skynet 高内存占用问题

找到 lua 死循环代码

最近遇到 lua 死循环的情况,就研究下如何找到死循环所在的代码,方便定位和解决问题。

首先,要找到出问题的协程(lua_State)。lua vm 实现时,每个协程都有自己独立的堆栈(stack),以及函数栈(CallInfo)。

所以,要先找到死循环的协程,再从这个协程函数栈找到代码。

怎么找到这个协程?

有三种办法:
方法1、 在死循环会执行到的 opcode ,加代码取得当前协程;
方法2、 遍历所有 gc 数据对象,找到当前正在执行的协程;
方法3、 重写 coroutine.resume 及 wrap 函数,取得当前协程。
继续阅读找到 lua 死循环代码

erlang list 的使用建议

原文 2014-10-24 19:16:20 发表于 CSDN,这里对以前写的文章做下收录。

erlang有两种复合结构,tuple和list,两者的区别是tuple子元素的个数是固定不变的,声明后就不能改变了;而list是可变的,可以通过[H|T]来取出或插入新元素。上篇文章讲了tuple相关的内容,本篇就讲erlang list方面的知识,主要说一些基本操作和常用的list函数,再讲一些可以优化的点。
list基本操作

1> A = [1, 2, 3, "abc"].
[1,2,3,"abc"]
2> length(A).
4
3> is_list(A).
true
4> list_to_binary(A).
<<1,2,3,97,98,99>>
5> list_to_bitstring(A).
<<1,2,3,97,98,99>>

6> [A1|A2] = A.
[1,2,3,"abc"]
7> A1.
1
8> A2.
[2,3,"abc"]
9> hd(A).
1
10> tl(A).
[2,3,"abc"]
11> B = [0|A].
[0,1,2,3,"abc"]

继续阅读erlang list 的使用建议

C++ regex 正则表达式

原文 2014-02-09 19:32:01 发表于 CSDN,这里对以前写的文章做下收录。

在c++中,有三种正则可以选择使用,C ++regex,C regex,boost regex ,如果在windows下开发c++,默认不支持后面两种正则,如果想快速应用,显然C++ regex 比较方便使用。文章将讨论 C++ regex 正则表达式的使用。

C++ regex函数有3个:regex_match、 regex_search 、regex_replace

regex_match

regex_match是正则表达式匹配的函数,下面以例子说明。如果想系统的了解,参考regex_match
继续阅读C++ regex 正则表达式

erlang catch 异常处理

原文 2015-03-31 01:16:10 发表于 CSDN,这里对以前写的文章做下收录。

在说 erlang 异常捕获处理(catch)前,不得不说 erlang 内部数据(Eterm)。Eterm 是 Erlang Term 的简写,用来表示 erlang 中任意类型的数据,也就是说,erlang 可以用到的任意数据,都能 Eterm 表示。比如常见的 atom、数字、列表、元组,甚至 pid,port,fun,ets 表等等都用Eterm可以表示。 

Eterm

Eterm 在 VM 中主要分为三大类:列表,boxed 对象,立即数。(这么分法主要是复杂的数据无法单靠1个机器字表示,在32位机器上,一个字长4字节,在64位机器上是8字节。)

继续阅读erlang catch 异常处理