V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  flycloud  ›  全部回复第 2 页 / 共 3 页
回复总数  46
1  2  3  
2021-09-14 16:39:49 +08:00
回复了 flycloud 创建的主题 程序员 oauth2 流程疑问
@Saxton #13 嗯嗯,那就是如果不需要从微信获取用户信息的话,只用维护自己的 token 就行了。自己的 token 过期了,就再走一遍授权流程重新登录嘛?
2021-09-14 16:33:44 +08:00
回复了 flycloud 创建的主题 程序员 oauth2 流程疑问
@Saxton #10 哦哦哦,后端通过 code 交换出 openid 和 access_token 后,再自己生成一个 token 给前端用,同时存储 token 、openid 、access_token,后续如果需要 refresh token,也是由后端来完成的。这样对吧?
2021-09-14 16:25:17 +08:00
回复了 flycloud 创建的主题 程序员 oauth2 流程疑问
@Saxton #8 这下清晰了,谢谢。之前在微信平台看到这段话,感觉有点懵逼:

“access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取 access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为”
2021-09-14 16:09:24 +08:00
回复了 flycloud 创建的主题 程序员 oauth2 流程疑问
@Saxton 还有个疑问是 token 和 openid 是不是要告诉前端才行,后续请求都会带上 token,token 也存储在自己的后端进行验证,是这样做的吗?
2021-09-14 16:05:45 +08:00
回复了 flycloud 创建的主题 程序员 oauth2 流程疑问
@Saxton #4 明白啦,感谢
2021-09-14 16:04:29 +08:00
回复了 flycloud 创建的主题 程序员 oauth2 流程疑问
@Saxton 意思就是在开放平台填的 redirect_uri 可以不是后端的地址,直接把 code 给前端,然后前端主动从自己的后端获取 token,而不是通过重定向?
2021-09-14 16:01:38 +08:00
回复了 flycloud 创建的主题 程序员 oauth2 流程疑问
@keller 没太明白,如果是 app 应用呢?在开放平台确认授权后,code 返回到 app,然后由 app 向自己的后端发请求获取 token ?
2021-09-08 10:21:22 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
破案了,开了 pprof,可以看到各项内存占用情况。剩下的那 70MB 是垃圾回收标记元信息使用的内存:GCSys 。

/doge

data gc 前:
```
heap profile: 286: 599785472 [286: 599785472] @ heap/1048576
286: 599785472 [286: 599785472] @ 0x696898 0x43bdf6 0x4726e1
# 0x696897 main.main+0xf7 /data/gowork/src/test/test.go:21
# 0x43bdf5 runtime.main+0x255 /usr/local/go/src/runtime/proc.go:225


# runtime.MemStats
# Alloc = 2147822008
# TotalAlloc = 2148011064
# Sys = 2291062280
# Lookups = 0
# Mallocs = 2741
# Frees = 671
# HeapAlloc = 2147822008
# HeapSys = 2214199296
# HeapIdle = 65634304
# HeapInuse = 2148564992
# HeapReleased = 65150976
# HeapObjects = 2070
# Stack = 393216 / 393216
# MSpan = 176528 / 180224
# MCache = 4800 / 16384
# BuckHashSys = 1444089
# GCSys = 73675560
# OtherSys = 1153511
# NextGC = 2403760736
# LastGC = 1631066553972785432
```

data gc 后:
```
heap profile: 0: 0 [1007: 2111832064] @ heap/1048576
0: 0 [1007: 2111832064] @ 0x696898 0x43bdf6 0x4726e1
# 0x696897 main.main+0xf7 /data/gowork/src/test/test.go:21
# 0x43bdf5 runtime.main+0x255 /usr/local/go/src/runtime/proc.go:225


# runtime.MemStats
# Alloc = 211840
# TotalAlloc = 2148063184
# Sys = 2291062280
# Lookups = 0
# Mallocs = 2895
# Frees = 2059
# HeapAlloc = 211840
# HeapSys = 2214133760
# HeapIdle = 2213347328
# HeapInuse = 786432
# HeapReleased = 2213289984
# HeapObjects = 836
# Stack = 458752 / 458752
# MSpan = 45288 / 180224
# MCache = 4800 / 16384
# BuckHashSys = 1444089
# GCSys = 73694016
# OtherSys = 1135055
# NextGC = 4194304
# LastGC = 1631066839647887815
```

各项指标含义:
```
Alloc uint64 //golang 语言框架堆空间分配的字节数
TotalAlloc uint64 //从服务开始运行至今分配器为分配的堆空间总 和,只有增加,释放的时候不减少
Sys uint64 //总共从 OS 申请的字节数,它是虚拟内存空间,不一定全部映射成了物理内存
Lookups uint64 //被 runtime 监视的指针数
Mallocs uint64 //服务 malloc heap objects 的次数
Frees uint64 //服务回收的 heap objects 的次数
HeapAlloc uint64 //服务分配的堆内存字节数
HeapSys uint64 //系统分配的作为运行栈的内存
HeapIdle uint64 //申请但是未分配的堆内存或者回收了的堆内存(空闲)字节数
HeapInuse uint64 //正在使用的堆内存字节数
HeapReleased uint64 //返回给 OS 的堆内存,类似 C/C++中的 free 。
HeapObjects uint64 //堆内存块申请的量
GCSys uint64 //垃圾回收标记元信息使用的内存
OtherSys uint64 //golang 系统架构占用的额外空间
NextGC uint64 //垃圾回收器检视的内存大小
LastGC uint64 // 垃圾回收器最后一次执行时间。
````
2021-09-07 18:40:19 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@darrh00 感谢指正
2021-09-07 18:13:14 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@ksco

centos 下表现一样,过几分钟后 GC,瞬间降低到 70MB 。
mac 下过几分钟后开始内存慢慢下降。
2021-09-07 17:54:15 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@ksco 看你的 go 版本,不同版本内存回收策略不一样。编译时强制使用 madvdontneed 。

GODEBUG=madvdontneed=1 go build
2021-09-07 17:51:42 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@gamexg 真大佬,确实啊,调用 2 次 runtime.GC() 内存就马上降低了,一次还不行。

func main() {
data := make(map[int32][]int32)
for i := 0; i < 1024; i++ {
msg := make([]int32, 1024 * 512, 1024 * 512)
msg[0] = 0 //访问一下内存, 触发从内核真正分配内存
data[int32(i)] = msg
}
fmt.Println(len(data))
runtime.GC()
runtime.GC()

if true {
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
<-sig
}
}
2021-09-07 17:27:16 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
应该是 gc 机制如此。

GODEBUG=madvdontneed=1 go build -gcflags="-N -l"
关闭了编译器优化,内存还是降低了。
2021-09-07 17:15:09 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@ksco 不是这样哈,分配出来的 slice,全部遍历了,也是一样的结果。
2021-09-07 17:14:29 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
2021-09-07 17:03:59 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@PureWhiteWu 嗯,可以明确的是 data 被 gc 了,但是剩下的 70MB 是哪儿去了呢
2021-09-07 17:02:55 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@jtgogogo 是的,我在 mac 下运行一直是 70MB 。

但是在 centos 下,编译运行,刚开始是 2GB,几分钟后降低为 70MB 。
2021-09-07 16:51:36 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@MoYi123 我的是:
go version go1.17 darwin/amd64
运行环境是:centos,Linux 172-20-245-36 4.18.0-193.28.1.el8_2.x86_64

你的运行结果更神奇了啊,阻塞后还会使用 data 的被 gc 了导致内存降低了?
2021-09-07 16:41:44 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@MoYi123 代码确定是这样的么:
```
func main() {
data := make(map[int32][]int32)
for i := 0; i < 1024; i++ {
msg := make([]int32, 1024 * 512, 1024 * 512)
msg[0] = 0 //访问一下内存, 触发从内核真正分配内存
data[int32(i)] = msg
}
fmt.Println(len(data))

if true {
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
<-sig
}
fmt.Println(len(data))
}
```
一直阻塞着,我等了 10 分钟,还是 2GB 的内存。
2021-09-07 16:31:10 +08:00
回复了 flycloud 创建的主题 Go 编程语言 golang 内存回收的疑问
@MoYi123 效果是一样的,msg[0] = 0 只访问这一个数据,RES 内存就是 2GB,说明访问了之后就分配了全部的内存,而不是只分配了一页。
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1214 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 14ms · UTC 18:34 · PVG 02:34 · LAX 10:34 · JFK 13:34
Developed with CodeLauncher
♥ Do have faith in what you're doing.