- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们有一个基于 go-socket.io(socket.io golang 实现)和 gorilla websocket 的 websocket 服务,但似乎存在内存泄漏问题。即使我使用 debug.FreeOSMemroy 强制释放内存,HeapAlloc 总是增加。
服务很简单。它将使用 jwt token 对传入请求进行身份验证,如果身份验证成功,则将基于 gorilla websocket conn 创建一个 go-socket.io conn。但现在看来 net/textproto.(*Reader).ReadMIMEHeader(包含在 net/http.readRequest 中,位于 net/http.(*conn).serve 中)占用了太多内存,这让我很困惑,因为当请求劫持到websocket conn时,net/http.(*conn).serve goroutine会立即返回。
gc 440 @51045.897s 0%: 0.034+4182+0.96 ms clock, 0.13+0/4182/12246+3.8 ms cpu, 4304->4309->4143 MB, 8266 MB goal, 4 P
scvg340: inuse: 4404, idle: 15, sys: 4419, released: 0, consumed: 4419 (MB)
GC forced
gc 441 @51170.096s 0%: 3.7+4355+1.4 ms clock, 14+2.9/4357/12795+5.8 ms cpu, 4317->4323->4158 MB, 8287 MB goal, 4 P
GC forced
gc 442 @51294.460s 0%: 0.034+3987+1.2 ms clock, 0.13+1.5/3987/11701+4.9 ms cpu, 4336->4341->4169 MB, 8316 MB goal, 4 P
scvg341: inuse: 4318, idle: 133, sys: 4451, released: 0, consumed: 4451 (MB)
GC forced
gc 443 @51418.451s 0%: 0.36+3925+0.99 ms clock, 1.4+4.0/3925/11554+3.9 ms cpu, 4350->4356->4182 MB, 8338 MB goal, 4 P
scvg342: inuse: 4363, idle: 103, sys: 4466, released: 0, consumed: 4466 (MB)
GC forced
gc 444 @51542.394s 0%: 0.042+3986+1.6 ms clock, 0.16+0/3981/11757+6.5 ms cpu, 4361->4367->4194 MB, 8365 MB goal, 4 P
scvg343: inuse: 4404, idle: 74, sys: 4478, released: 0, consumed: 4478 (MB)
GC forced
gc 445 @51666.384s 0%: 3.4+3987+1.4 ms clock, 13+2.5/3986/11747+5.7 ms cpu, 4375->4382->4208 MB, 8388 MB goal, 4 P
scvg344: inuse: 4454, idle: 39, sys: 4493, released: 0, consumed: 4493 (MB)
GC forced
gc 446 @51790.379s 0%: 0.055+4147+1.5 ms clock, 0.22+0/4139/12125+6.2 ms cpu, 4396->4402->4220 MB, 8416 MB goal, 4 P
scvg345: inuse: 4509, idle: 5, sys: 4514, released: 0, consumed: 4514 (MB)
GC forced
gc 447 @51914.542s 0%: 0.052+4205+2.1 ms clock, 0.21+1.5/4199/12348+8.5 ms cpu, 4413->4420->4234 MB, 8441 MB goal, 4 P
GC forced
gc 448 @52038.752s 0%: 2.7+4517+1.8 ms clock, 11+2.3/4517/13245+7.2 ms cpu, 4428->4436->4247 MB, 8469 MB goal, 4 P
scvg346: inuse: 4406, idle: 142, sys: 4548, released: 0, consumed: 4548 (MB)
GC forced
gc 449 @52163.276s 0%: 0.033+4206+1.3 ms clock, 0.13+0/4206/12306+5.3 ms cpu, 4442->4449->4259 MB, 8495 MB goal, 4 P
scvg347: inuse: 4452, idle: 109, sys: 4561, released: 0, consumed: 4561 (MB)
GC forced
gc 450 @52287.491s 0%: 0.044+4262+2.0 ms clock, 0.17+0/4261/12565+8.2 ms cpu, 4452->4459->4272 MB, 8519 MB goal, 4 P
scvg348: inuse: 4498, idle: 74, sys: 4572, released: 0, consumed: 4572 (MB)
GC forced
gc 451 @52411.769s 0%: 0.028+4012+2.0 ms clock, 0.11+0.066/3992/11762+8.0 ms cpu, 4471->4477->4285 MB, 8544 MB goal, 4 P
scvg349: inuse: 4550, idle: 40, sys: 4590, released: 0, consumed: 4590 (MB)
代码示例
func (c *CometServer) initHTTPServer() {
jwtMiddleware := jwtmiddleware.New(jwtmiddleware.Options{
SigningMethod: jwt.SigningMethodHS256,
ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
return []byte(setting.JwtSecret), nil
},
// get token from header, querystring, and cookie
Extractor: jwtmiddleware.FromFirst(
jwtmiddleware.FromParameter(setting.JwtTokenQueryStringField),
TokenFromCookie(setting.JwtTokenCookieField),
jwtmiddleware.FromAuthHeader,
),
ErrorHandler: jwtErrorHandler,
})
r := mux.NewRouter()
// Must call cotext.Clear after every request follow
r.KeepContext = true
socketHandler := jwtMiddleware.Handler(c.socketio)
r.Handle("/socket.io/", socketHandler)
if setting.DEBUG {
r.PathPrefix("/debug/").Handler(http.DefaultServeMux)
r.PathPrefix("/").Handler(http.FileServer(http.Dir("./asset/")))
}
// n.UseHandler(r)
c.httpServer = &http.Server{
Addr: setting.HTTPListenAddr,
Handler: r,
}
//....//go-socket.io 代码//....func (c *CometServer) initSocketIO() 错误 { 服务器,错误:= socketio.NewServer(传输) 如果错误!=无{ 返回错误
// ....
server.On("error", func(so socketio.Socket, err error) {
logger := SocketLogger(so)
logger.Error("socket connect error")
})
server.On("connection", func(so socketio.Socket) {
var (
uid string
exist bool
)
logger := SocketLogger(so)
claim := (context.Get(so.Request(), "user")).(*jwt.Token).Claims
// after get the claims, should clear the request context
context.Clear(so.Request())
var rawUID interface{}
if user, ok := claim.(jwt.MapClaims); ok {
if rawUID, ok = user[setting.JwtUserClaimField]; !ok {
logger.Error("invalid user claim")
so.Emit("disconnect", "invalid user claim")
}
} else {
logger.Errorf("invalid jwt claim %s", claim)
so.Emit("disconnect", "invalid user claim")
}
if uid, exist = rawUID.(string); exist {
// Multi connection for same user will be join to the same room
so.Join(uid)
// root for broadcast all user
so.Join(Hourse)
c.users.Add(uid, 1)
logger.Debug("socket connected")
if setting.DEBUG {
so.Emit("debug", fmt.Sprintf("Your uid is %s, sid is %s", uid, so.Id()))
}
} else {
so.Emit("disconnect", "invalid user claim")
}
so.On("debug", func(data string) {
log.Debugf("debug data from client %s", data)
})
so.On("disconnection", func(data string) {
logger.Debugf("socket disconnected")
c.users.Add(uid, -1)
})
})
c.socketio = server
return nil
最佳答案
终于解决了这个问题。
我使用 https://github.com/auth0/go-jwt-middleware使用 JWT 进行授权。我还将 gorilla 多路复用器路由器的 KeepContext 打开为 true,因为它可以从 gorilla 上下文中获取请求的 jwt token 。当我获得 jwt token 时,将立即清除请求上下文(通过 context.Clear(r))。到目前为止,一切正常。 但是当 go-jwt-middleware auth 失败时,没有机会清除请求上下文,因为 mux 的 KeepContext 已经为真。 这是根本原因。
关于golang websocket内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39404625/
IntentReceiver 正在泄漏 由于 onDetachedFromWindow 在某些情况下未被调用。 @Override protected void onDetachedFromWind
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage >
我编写了一个测试代码来检查如何使用 Instrument(Leaks)。我创建了一个单一 View 应用程序,单击按钮后我加载了一个像这样的新 View ... - (IBAction)btn_clk
我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗? 当我这样做时: >>> from u
我有以下泄漏的代码。 Instruments 表示,泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了该 block 并且发生了泄漏...... 文件.h @interface
我在我编写的以下代码片段中发现了内存泄漏 NSFileManager *fileManager=[[NSFileManager alloc] init]; fileList=[[fileManager
因此,我正在开发HTML5 / javascript rts游戏。观察一直有几种声音在播放。因此,对我来说,是一段时间后声音听起来像是“崩溃”,并且此浏览器选项卡上的所有声音都停止了工作。我只能通过重
下面是我正在使用的一段代码及其输出。 my $handle; my $enterCount = Devel::Leak::NoteSV($handle); print "$date entry $en
在这篇关于 go-routines 泄漏的帖子之后,https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sende
我想知道为什么在执行 ./a.out 后随机得到以下结果。有什么想法我做错了吗?谢谢 http://img710.imageshack.us/img710/8708/trasht.png 最佳答案 正
我正在 Swift 中开发一个应用程序,在呈现捕获我放在一起的二维码的自定义 ViewController 后,我注意到出现了巨大的内存跳跃。 该代码本质上基于以下示例:http://www.appc
下面是我的 javascript 代码片段。它没有按预期运行,请帮我解决这个问题。 function getCurrentLocation() { console.log("insi
我们在生产环境中部署了 3 个代理 Kafka 0.10.1.0。有些应用程序嵌入了 Kafka Producer,它们将应用程序日志发送到某个主题。该主题有 10 个分区,复制因子为 3。 我们观察
我正在使用仪器来检测一些泄漏,但有一些泄漏我无法解决; NSMutableString *textedetails = [[NSMutableString alloc] init];
如果我使用性能工具测试我的代码 - 泄漏,它没有检测到任何泄漏。这是否意味着代码没有泄漏任何内存? 我有一个越狱的 iPhone,我可以监控可用内存。如果有人知道,那就是 SBSettings。我测试
我在从 AddressBook 中获取图像时遇到了很大的问题,下面我粘贴了我的代码。此 imageData 从未被释放,在我的 Allocations Instruments 上它看起来总是在内存中它
- (NSMutableArray *)getArrayValue:(NSArray *)array{ NSMutableArray *valueArray = [NSMutableArra
Instruments 工具说这是一个泄漏,有什么想法吗? 我在 for 循环结束时释放变量对象 在上述方法的开头,这就是我设置变量对象的方式,即自动释放; NSMutableArray *varia
我正在跟踪我的 iOS 应用程序的内存泄漏,我有一个奇怪的泄漏导致我的应用程序崩溃......负责的框架是:CGImageMergeXMPPropsWhithLegacyProps。在某些时候,我的应
我正在尝试使用 NSOperationQueue 在后台线程中执行一个方法,如下所示: NSOperationQueue *queue = [NSOperationQueue new]; NS
我是一名优秀的程序员,十分优秀!