<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在之前的OOM問題覆盤中,我們新增了jmap指令碼來自動dump記憶體現場,方便排查OOM問題。
但當我反覆模擬OOM場景測試時,發現jmap有時可以dump成功,有時會報錯,如下:
經過網上一頓搜尋,發現兩種原因可能導致這個問題,一是執行jmap使用者與jvm程序使用者不一致,二是/tmp/.java_pidXXX
檔案被刪除,但經過檢查,這都不是我們jmap失敗的原因。
經過了解,jmap匯出記憶體的原理,大致如下:
/tmp/.java_pid8255
檔案,然後傳送SIGQUIT訊號給jvm。/tmp/.java_pid8255
檔案,以接收命令。/tmp/.java_pid8255
檔案,並行送dumpheap命令給jvm,這個過程中jvm會檢查命令傳送方使用者的euid/egid是否與自己一致。可以看出,當jvm已經卡死,或有長時間的GC正在Safepoint中執行,都會導致jmap長時間讀不到命令的響應而超時失敗!
當給jmap新增-F
引數時,jmap會使用Linux的ptrace
機制來匯出堆記憶體,ptrace
是Linux平臺的一種偵錯機制,像strace、gdb都是基於它開發的,它使得偵錯程序(jmap)可以直接讀取被偵錯程序(jvm)的原生記憶體,然後jmap再根據jvm的記憶體佈局規範,將原生記憶體轉換為hprof格式。
但在實際執行時,會發現jmap -F
執行得非常慢,可能要幾個小時,這是因為ptrace
每次只能讀一個字的記憶體,而我們的堆有10G,因此jmap -F
對於我們幾乎無法使用。
注:這裡說的原生程式,指的是類似於C/C++這種直接編譯出來、不需要依賴語言虛擬機器器的程式,而原生記憶體,指的是通過malloc或mmap等直接申請出來的記憶體。
有過Linux下原生程式偵錯經驗的,應該會知道gcore這個實用工具,它可用來生成程式原生記憶體的core檔案,然後jstack、jmap等都可以讀取此類檔案,如下:
# 生成core檔案,8787是程序號 $ gcore -o core 8787 Saved corefile core.8787 [Inferior 1 (process 8787) detached] $ ll -lh core.8787 -rw-r--r-- 1 work work 5.8G 2023-04-16 11:40:00 core.8787 # 從core檔案中讀取執行緒棧 $ jstack `which java` core.8787 # 將core檔案轉換為hprof檔案,很慢,建議摘流量後執行 $ jmap -dump:format=b,file=heap.hprof `which java` core.8787
但是當我使用jmap轉換core檔案時,我發現我本機測試時可以成功,但在測試伺服器上卻一直報錯,如下:
我網上找了好久,都沒找到報此錯誤的原因...
但我發現gcore執行時,是有一些警告資訊的,如下:
看起來可能是gcore匯出的core檔案不全,聯想到jvm部署在容器中,懷疑是有某些許可權限制,導致部分程式記憶體匯出失敗了。
除了gcore可以導原生記憶體,其實Linux核心也有自動的coredump機制,即程序在收到某些訊號後,會自動觸發核心的coredump機制,核心會負責將程序的原生記憶體儲存為core檔案,而核心一般是最高許可權執行的,所以它生成的core檔案應該是完整的。
先開啟coredump機制,如下:
# 檢查是否開啟,輸出unlimited表示core檔案不受限制,即完全開啟 $ ulimit -c # 臨時開啟coredump $ ulimit -c unlimited # 永久開啟 $ echo "ulimit -c unlimited" >> /etc/profile
然後,設定一下coredump檔案儲存位置,如下:
# 檢視當前設定 $ cat /proc/sys/kernel/core_pattern /home/core/core.%e.%p.%t # 設定coredump檔案儲存位置,並使其生效 $ vi /etc/sysctl.conf kernel.core_pattern=/home/core/core.%e.%p.%t $ sysctl –p /etc/sysctl.conf
core_pattern預留位置解釋
預留位置 | 解釋 |
---|---|
%p | pid |
%u | uid |
%g | gid |
%s | signal number |
%t | UNIX time of dump |
%h | hostname |
%e | executable filename |
注:如果沒有許可權修改core_pattern路徑,可考慮使用軟連結ln -s
做路徑跳轉,當然,還需要保證coredump路徑有寫入許可權。
設定ok後,可通過kill傳送訊號來觸發核心coredump,可觸發coredump的常見訊號如下:
Ctrl+''
可以產生此訊號我選擇了SIGABRT訊號,即kill -6
,經過驗證,可生成core檔案,而且core檔案也能被jmap轉換為hprof檔案。
有了hprof檔案,就可以愉快地使用MAT、JVisualVM、JMC等工具進行記憶體分析啦
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45