有沒有辦法獲得 java lambda 的 java 堆轉儲?我在第二次運行 lambda 時出現記憶體不足,但不幸的是,我找不到任何可以與 aws lambda 一起使用的類似于 jprofiler 的工具(我嘗試過 codeGuru 和 x-ray,但沒有多大幫助)。
關于如何“除錯”在 aws 上運行的 lambda 記憶體分配的任何建議?
** 編輯 - 我知道如何在本地運行并使用 JProfiler 和其他此類工具檢查記憶體,但我需要一個很難在本地重現的特定場景,因此我需要針對 aws lambda 環境的特定解決方案。**
uj5u.com熱心網友回復:
谷歌搜索“從 JVM 內部觸發堆轉儲”將我帶到Baeldung 的此頁面,其中包含以下代碼:
public static void dumpHeap(String filePath, boolean live) throws IOException {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy(
server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
mxBean.dumpHeap(filePath, live);
}
我還沒有嘗試過,但已經驗證HotSpotDiagnosticMXBean了 Corretto 17 發行版中存在它,因此它可能對 Lambda 可用。當然,您應該撰寫一個測驗 Lambda 來驗證。
我將在 Lambda 呼叫處理程式中執行此代碼作為第一件事,只查找活動物件,然后將檔案上傳到 S3。這將告訴您是否有任何您在上一次通話中意外持有的東西。如果沒有,您只需要更多記憶體。
您可能會遇到的問題是 Lambda 僅提供 512 MB 的檔案存盤空間,而堆轉儲很容易大于此。如果您是這種情況,那么您需要使用 EFS 卷來保存檔案(并且無需上傳到 S3)。
我建議使用 Lambda 的請求 ID(可從背景關系中獲得)來唯一命名檔案。這將使從執行日志中追溯變得容易。
最后,這只是用于開發的東西。這將為 Lambda 呼叫增加大量時間。
uj5u.com熱心網友回復:
設定 AWS CLI
aws iam list-mfa-devices --user-name <ur_user>
使用 list-mfa-devices 中的 SerialNumber 來獲取會話令牌
aws sts get-session-token --duration-seconds 3600 --serial-number
<SerialNumber> --token-code <<Say from Google authenticator>>
AWS_ACCESS_KEY=AccessKeyId
AWS_SECRET_KEY=SecretAccessKey
AWS_SESSION_TOKEN=SessionToken
當您使用 Parsifal 建議的相同記憶體設定在本地啟動處理程式方法(從 Junit 說)時,將上述作為環境變數傳遞。與你的 Lambda 記憶體設定值相同 另外在 Vm 引數下面傳遞 -XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\ur_path
這將生成 HeapDump 檔案,您可以使用 Eclipse MAT 來分析記憶體泄漏這是我通常遵循的。這將適用于任何復雜的設定。謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/436183.html
標籤:爪哇 亚马逊网络服务 aws-lambda
