java技术圈 为您找到相关结果 4

Golang GC核心要点和度量方法

一. Go GC 要点先来回顾一下GC的几个重要的阶段: Mark Prepare - STW做标记阶段的准备工作,需要停止所有正在运行的goroutine(即STW),标记根对象,启用内存屏障,内存屏障有点像内存读写钩子,它用于在后续并发标记的过程中,维护三色标记的完备性(三色不变性),这个过程通常很快,大概在10-30微秒。 Marking - Concurrent标记阶段会将大概25%(gcBackgroundUtilization)的P用于标记对象,逐个扫描所有G的堆栈,执行三色标记,在这个过程中,所有新分配的对象都是黑色,被扫描的G会被暂停,扫描完成后恢复,这部分工作叫后台标记(gcBgMarkWorker)。这会降低系统大概25%的吞吐量,比如MAXPROCS=6,那么GC P期...阅读全文

博文 2020-03-09 02:28:08 wudaijun's blog

深入浅出 Go trace

本篇文章简要介绍了go语言执行跟踪程序(Trace),从功能和性能上阐述了它的优势。前言你有没有考虑过,你的goroutines是如何被go的runtime系统调度的?是否尝试理解过为什么在程序中增加了并发,但并没有给它带来更好的性能?go执行跟踪程序可以帮助回答这些疑问,还有其他和其有关性能的问题,例如延迟、竞争和较低的并行效率。该工具是Go 1.5版本加入的,通过度量go语言特定事件的运行时,例如:创建,启动和终止goroutines阻塞/非阻塞goroutines(syscalls, channels, locks)网络 I/OSyscalls垃圾回收以上事件的所有数据会被跟踪器收集,而且不会做任何类型的聚合和抽样。这在一些复杂的应用程序中,通过 go tool trace 命令对其进...阅读全文

博文 2019-08-30 07:29:04 IT程序猿

golang 内存分析/动态追踪 — 源代码

golang pprof 当你的golang程序在运行过程中消耗了超出你理解的内存时,你就需要搞明白,到底是 程序中哪些代码导致了这些内存消耗。此时golang编译好的程序对你来说是个黑盒,该 如何搞清其中的内存使用呢?幸好golang已经内置了一些机制来帮助我们进行分析和追 踪。 此时,通常我们可以采用golang的pprof来帮助我们分析golang进程的内存使用。 pprof 实例 通常我们采用http api来将pprof信息暴露出来以供分析,我们可以采用net/http/pprof 这个package。下面是一个简单的示例: // pprof 的init函数会将pprof里的一些handler注册到http.DefaultServeMux上 // 当不使用http.DefaultS...阅读全文

博文 2019-05-27 04:00:14 lrita.github.io

使用google perf工具来排查堆外内存占用

现象线上机器内存不足,经常被系统oom killer干掉。 如果tomcat运行的好好的,突然被干掉了,没有任何线索,那么就可以使用下面的命令看看是不是oom killer搞的鬼 1234sudo dmesg | grep -i kill | lessOut of memory: Kill process 23195 (java) score 558 or sacrifice childKilled process 23195, UID 40001, (java) total-vm:81176732kB, anon-rss:64507900kB, file-rss:2604kB 其中anon-rss是程序占用的物理内存, 64507900kB = 61.519527435302734 GB系...阅读全文

博文 2020-04-22 10:40:11 KL's blog