国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

jmap執(zhí)行失敗了,怎么獲取heapdump?

這篇具有很好參考價值的文章主要介紹了jmap執(zhí)行失敗了,怎么獲取heapdump?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

原創(chuàng):扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此聲明。

在之前的OOM問題復盤中,我們添加了jmap腳本來自動dump內存現場,方便排查OOM問題。

但當我反復模擬OOM場景測試時,發(fā)現jmap有時可以dump成功,有時會報錯,如下:
jmap執(zhí)行失敗了,怎么獲取heapdump?
經過網上一頓搜索,發(fā)現兩種原因可能導致這個問題,一是執(zhí)行jmap用戶與jvm進程用戶不一致,二是/tmp/.java_pidXXX文件被刪除,但經過檢查,這都不是我們jmap失敗的原因。

經過了解,jmap導出內存的原理,大致如下:
jmap執(zhí)行失敗了,怎么獲取heapdump?

  1. 如果jvm進程id是8255,jmap會先創(chuàng)建一個/tmp/.java_pid8255文件,然后發(fā)送SIGQUIT信號給jvm。
  2. jvm收到信號后啟動AttachListener線程,以UNIX domain socket的形式監(jiān)聽/tmp/.java_pid8255文件,以接收命令。
  3. jmap也以UNIX domain socket的形式連接上/tmp/.java_pid8255文件,并發(fā)送dumpheap命令給jvm,這個過程中jvm會檢查命令發(fā)送方用戶的euid/egid是否與自己一致。
  4. AttachListener線程收到dumpheap命令后,等到JVM進入Safepoint后,執(zhí)行HeapDumper操作以導出heap.hprof文件。

可以看出,當jvm已經卡死,或有長時間的GC正在Safepoint中執(zhí)行,都會導致jmap長時間讀不到命令的響應而超時失??!

使用jmap -F

當給jmap添加-F參數時,jmap會使用Linux的ptrace機制來導出堆內存,ptrace是Linux平臺的一種調試機制,像strace、gdb都是基于它開發(fā)的,它使得調試進程(jmap)可以直接讀取被調試進程(jvm)的原生內存,然后jmap再根據jvm的內存布局規(guī)范,將原生內存轉換為hprof格式。

但在實際執(zhí)行時,會發(fā)現jmap -F執(zhí)行得非常慢,可能要幾個小時,這是因為ptrace每次只能讀一個字的內存,而我們的堆有10G,因此jmap -F對于我們幾乎無法使用。

注:這里說的原生程序,指的是類似于C/C++這種直接編譯出來、不需要依賴語言虛擬機的程序,而原生內存,指的是通過malloc或mmap等直接申請出來的內存。

使用gcore

有過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文件,很慢,建議摘流量后執(zhí)行
$ jmap -dump:format=b,file=heap.hprof `which java` core.8787

但是當我使用jmap轉換core文件時,我發(fā)現我本機測試時可以成功,但在測試服務器上卻一直報錯,如下:
jmap執(zhí)行失敗了,怎么獲取heapdump?
我網上找了好久,都沒找到報此錯誤的原因...

但我發(fā)現gcore執(zhí)行時,是有一些警告信息的,如下:
jmap執(zhí)行失敗了,怎么獲取heapdump?
看起來可能是gcore導出的core文件不全,聯(lián)想到jvm部署在容器中,懷疑是有某些權限限制,導致部分程序內存導出失敗了。

使用Linux內核的coredump機制

除了gcore可以導原生內存,其實Linux內核也有自動的coredump機制,即進程在收到某些信號后,會自動觸發(fā)內核的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發(fā)送信號來觸發(fā)內核coredump,可觸發(fā)coredump的常見信號如下:

  • SIGQUIT 數值2 從鍵盤輸入Ctrl+'\'可以產生此信號
  • SIGILL 數值4 非法指令
  • SIGABRT 數值6 abort調用
  • SIGSEGV 數值11 非法內存訪問
  • SIGTRAP 數值5 調試程序時使用的斷點

我選擇了SIGABRT信號,即kill -6,經過驗證,可生成core文件,而且core文件也能被jmap轉換為hprof文件。

有了hprof文件,就可以愉快地使用MAT、JVisualVM、JMC等工具進行內存分析啦??文章來源地址http://www.zghlxwxcb.cn/news/detail-415334.html

到了這里,關于jmap執(zhí)行失敗了,怎么獲取heapdump?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • heapdump 攻擊面利用

    heapdump 攻擊面利用

    點擊上方藍字關注我們 一、heapdump案例 1.1 項目中的分析 這個是項目中遇到的一個例子,發(fā)現了heapdump泄露,但沒有找到可用session,當時就想著內存中應該是有賬號密碼的,于是就開始找了起來。 用OQL進行搜索,先找數據庫密碼,很好找,但由于是內網數據庫沒啥用。 然后

    2024年02月02日
    瀏覽(13)
  • shell:腳本執(zhí)行失敗就退出的3種方案

    shell:腳本執(zhí)行失敗就退出的3種方案

    簡介: ?在日常的自動化測試中,尤其shell腳本,在針對需要多個程序運行,shell腳本順序執(zhí)行過程可能會有中間環(huán)節(jié)會運行失敗,拋出異常停止運行并報錯,然而shell的其他下方語句仍然會繼續(xù)往下執(zhí)行,有時需要規(guī)避這類問題,使得出錯后就退出后面的執(zhí)行。 案例目錄結構

    2024年02月11日
    瀏覽(23)
  • linux執(zhí)行程序運行命令失敗,提示找不到命令

    sudo: ./VMware-Workstation-Full-17.0.0-20800274.x86_64.bundle:找不到命令。 經檢查,sudo命令正常,該腳本文件的確存在于該目錄下。 1.文件是否有執(zhí)行權限 使用 ls -l 命令查看下該文件的權限: 表示當前文件無執(zhí)行權限。 ps: - 代表沒有權限,r為可讀權限,w為可寫權限,x為可執(zhí)行權限

    2024年02月08日
    瀏覽(18)
  • oracle作業(yè)執(zhí)行失敗提示ORA-12011的解決思路

    先說結論:請好好的閱讀oracle的alert日志文件,里面的錯誤提示是很清楚的,精確到行;在plsql里運行作業(yè)出錯的提示是簡略的,容易給人浮躁的心態(tài);如果在ssh工具顯示中文為亂碼,請設置好工具的字符集問題。 數據庫: ? 12c 發(fā)布 1 錯誤代碼: ?ORA-12011 描述: ?無法執(zhí)行 %s 作

    2024年02月15日
    瀏覽(28)
  • 滲透測試-Spring Heapdump利用技巧

    滲透測試-Spring Heapdump利用技巧

    在某次項目當中發(fā)現了一個spring boot的heapdump泄露,無法使用常見的mat分析工具打開。在逛github的時候發(fā)現了一個比較好的工具,可對該heapdump提取密碼,并且該工具的其他功能比較新穎,打開了heapdump的新玩法。 heapdump_tool:https://github.com/wyzxxz/heapdump_tool 運行環(huán)境:java 8 基礎

    2024年02月02日
    瀏覽(17)
  • Linux系統(tǒng)root下執(zhí)行su登錄其他用戶失敗

    Linux系統(tǒng)root下執(zhí)行su登錄其他用戶失敗

    在Linux系統(tǒng)上,從root用戶切換到oracle用戶時報錯 su: cannot open session: Permission denied 如下: 定位原因1 分析登錄日志,可以看到時登錄的時候limit中的 memlock 設置失敗,導致用戶登錄失?。?limit配置表示限制該用戶最大可以打開的文件數量、會話數量、內存等,使用 ulimit -a 命令

    2024年02月05日
    瀏覽(25)
  • 記一次heapdump泄露到拿下云主機

    記一次heapdump泄露到拿下云主機

    通過前期信息收集發(fā)現某站存在springboot env 泄露。 通過對其進行web掃描發(fā)現heapdump文件進行下載,下載完成后使用解密工具對heapdump文件進行解密。 工具下載鏈接:https://github.com/wyzxxz/heapdump_tool 發(fā)現accessKey后使用cf工具進行利用拿下oss存儲桶以及云主機。 工具下載鏈接:ht

    2024年02月09日
    瀏覽(29)
  • Springboot信息泄露以及heapdump的利用

    Springboot信息泄露以及heapdump的利用

    14天閱讀挑戰(zhàn)賽 努力是為了不平庸~ 安全有些時候是枯燥的,這一次,讓我們先人一步,趣學滲透! 滲透測試的時候老遇到spring的heapdump能下載但是不知道怎么利用,今天發(fā)幾個工具讓漏洞危害最大化。通過heapdump獲取明文密碼在深入利用。 路由列表 /trace :顯示最近的http包

    2024年02月05日
    瀏覽(16)
  • 解決fastboot模式下執(zhí)行fastboot flashing unlock命令失敗的問題

    解決fastboot模式下執(zhí)行fastboot flashing unlock命令失敗的問題

    Android設備在有些場景下需要解鎖,解鎖方法如下: 執(zhí)行第二步的時候,有可能會收到失敗提示 FAILED (remote: Unrecognized command flashing lock) 此時,需要更新下設備驅動。 首先執(zhí)行 adb reboot fastboot ,使得設備進入fastboot模式; 打開計算機管理; 找到設備 右鍵選擇“更新設備驅動”

    2023年04月11日
    瀏覽(38)
  • JVM——》jmap詳解

    推薦鏈接: ????總結——》【Java】 ????總結——》【Mysql】 ????總結——》【Redis】 ????總結——》【Kafka】 ????總結——》【Spring】 ????總結——》【SpringBoot】 ????總結——》【MyBatis、MyBatis-Plus】 ????總結——》【Linux】 ????總結——》【MongoDB】 ???

    2024年02月09日
    瀏覽(12)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包