1. 程式人生 > >使用cgroup限制java使用的記憶體量-思路

使用cgroup限制java使用的記憶體量-思路

1.       對一個正在執行著的程序來說,在不到達其記憶體使用量邊界的情況下,擴大/縮小其cgroup分配的記憶體不會對它產生任何影響。

2.       在程序已經使用了一定量的記憶體的情況下,縮小其cgroup記憶體至小於已使用的記憶體量,有兩種結果(可通過cgroup配置,oom_kill_disable=0時殺死程序,=1時掛起程序):

A.程序被殺死

B.程序被掛起,系統向cgroup中註冊的oom處理函式傳送一個oom訊息;當cgroup內記憶體資源足夠多時,程序恢復執行;當cgroup的oom_kill_disable重新被設定為0時,程序被殺死。

3. 在給定了cgroup記憶體限制使用量的情況下,當cgroup內有程序申請的記憶體超過此限制時,結果與2相同。

4. cgroup對記憶體使用的限制分為實體記憶體限制和swap區限制,swap區的限制不能小於實體記憶體的限制,當程序要使用的記憶體超過了cgroup實體記憶體限制時,程序開始使用swap區(記憶體頁交換到磁碟),直至使用量超過swap區限制,結果與2相同。

對Java程式來說情況更復雜一些,因為JVM對程序使用的記憶體也有一定的控制能力

幾個相關的JVM引數:

-Xms         jvm初始記憶體

-Xmx          jvm最大記憶體(超出程序將丟擲OOM異常)

-XX:PermSize              初始非堆記憶體

-XX:MaxPermSize     最大非堆記憶體

1.       Jvm引數與cgroup對java程序的記憶體限制是獨立的,實際的限制是取它們的較小值。

2.       記憶體超出的結果不同:

Java程序使用記憶體超過jvm最大堆引數設定時程序終止,丟擲OOM異常

Java程序使用記憶體超過cgroup設定時有兩種結果(同前2)

設計思路:

1.  利用jvm引數限制記憶體使用,容易使用的記憶體越界時丟擲OOM異常。每個geronimo啟動時指定好Xms和Xmx,需要改變容器記憶體時建立新的容器同時增大/減小Xms和Xmx,然後重新啟動容器中的應用,刪除原容器。

2.  完全使用cgroup控制記憶體,容器使用記憶體越界時掛起geronimo,增大cgroup記憶體引數;容器一定時間內只使用少量記憶體時(需要額外的監控),直接減小cgroup記憶體引數到一個合適的值。

相關推薦

使用cgroup限制java使用的記憶體量-思路

1.       對一個正在執行著的程序來說,在不到達其記憶體使用量邊界的情況下,擴大/縮小其cgroup分配的記憶體不會對它產生任何影響。 2.       在程序已經使用了一定量的記憶體的情況下,縮小其cgroup記憶體至小於已使用的記憶體量,有兩種結果(可通過cgro

使用cgroup限制某個程序對內存的使用

cgroup的使用線上的mongodb是復制集模式的。為了便於監控mongodb的慢查詢等狀態,在3臺機器上都部署了packetbeat,通過抓取27017端口的流量發送到ES集群。但是第二天發現zabbix告警,顯示某一臺機器A(從節點)上的mongod進程宕了。日誌顯示是OOM導致的。再一想到,我們每天的

Java鎖優化思路及JVM實現

應用 num nal 高性能 thread collect 傳統 有一個 test 1. 鎖優化的思路和方法 這裏提到的鎖優化,是指在阻塞式的情況下,如何讓性能不要變得太差。但是再怎麽優化,一般來說性能都會比無鎖的情況差一點。 這裏要註意的是,在ReentrantLock中

利用cgroup限制instance磁盤io資源使用

loaded load 安裝 product 開啟 .com read net nag 1、安裝libcgroup軟件包;[root@pre-pool1-r6-06-08-18-01 ~]# yum install libcgroup Loaded plugins: pro

Java架構技術——思路導圖(全)

      做技術的就是話不多,技術人看圖就明白。  思路導圖如下: 歡迎工作一到五年的Java工程師朋友們加入Java架構群:897889510群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Sprin

JDK6u25裡新增的按執行緒統計分配記憶體量: JMX

轉載自 http://rednaxelafx.iteye.com/blog/1021619 Oracle幾天前釋出的JDK 6 update 25裡新增的一個新功能非常有趣,可以按照執行緒來跟蹤(GC堆)記憶體的分配量。這個功能在VM核心、直譯器、C1編譯器、C2編譯器以及GC中都有程

從一次線上故障思考 Java 問題定位思路

問題出現:現網CPU飆高,Full GC告警 CGI 服務釋出到現網後,現網機器出現了Full GC告警,同時CPU飆高99%。在優先恢復現網服務正常後,開始著手定位Full GC的問題。在現場只能夠抓到四個GC執行緒佔用了很高的CPU,無法抓到引發Full GC的執行緒。查看了服務故障期間的錯

從一次線上故障思考Java問題定位思路

問題出現:現網CPU飆高,Full GC告警 CGI 服務釋出到現網後,現網機器出現了Full GC告警,同時CPU飆高99%。在優先恢復現網服務正常後,開始著手定位Full GC的問題。在現場只能夠抓到四個GC執行緒佔用了很高的CPU,無法抓到引發Full GC的執行緒。查看了服務故障期間的錯誤日誌,發現更

限制Java執行緒池執行執行緒以及等待執行緒數量的策略

對於 java.util.concurrent.Executors 所提供的 FixedThreadPool ,可以保證可以在記憶體中有固定數量的執行緒數執行。但是由於 FixedThreadPool 繫結的是 LinkedBlockingQueue 。佇列的上限沒有限制(預設上限為 Int

對於Java類的思路總結1

Java是面向物件的程式設計語言。類用於描述客觀客觀世界某一類物件的共同特徵,而物件則是具體存在。可以把類當作一種自定義型別,可以使用類來定義變數,這種變數統稱為引用變數(引用變數儲存的是堆記憶體中的一塊地址,相當於C語言中的指標),也就是說,所有類都是引用型別。 1定義一個普通類(不包括內

Java記憶(必背)【純屬個人總結】(一)

  Java記憶(必背)【純屬個人總結】 說明:此內容適合Java初學者(非0點起步) 作用:幫助記憶與回想基礎知識 1.         編譯 javac 檔名.java 執行 java 檔名 2.         Public class 和 class 宣告類的區

爬蟲的常見陷阱以及Java的爬蟲思路

前言 筆者做的爬蟲側重於對於網頁內容的提取,url 遵守一定概率(比如末尾數字遞增)。 爬蟲的基本思路如下 1. 根據 Url 獲取相應頁面的 Html 程式碼 2. 利用正則匹配或者 Jsoup 等庫解析 Html 程式碼,提取需要的內容 3

redis key佔用記憶體量分析

Redis的指令看不出哪一型別的key,佔用了多少記憶體,不好分析redis記憶體開銷大的情況下,各應用程式使用快取的佔比。藉助第3方工具進行分析 1、採用2個工具結合 redis-rdb-tools+sqlite 2、sqlite linux伺服器都會自帶,安裝redis-rdb-to

使用cgroup限制普通使用者資源

#安裝cgroup yum install -y libcgroup-tools.x86_64 libcgroup #配置cgconfig vim /etc/cgconfig.conf #增加 group JstormGroup { memory { memory.limit_in_bytes = "8

JAVA記憶翻牌遊戲製作

1 遊戲功能需求說明   該遊戲主要模擬常見的翻牌遊戲,即找到所有兩兩相同的牌認為遊戲成功,主要需求包含: 初始化面板後顯示所有圖片網格,圖片預設顯示為背景色; 點選圖片後顯示圖片,再次點選後顯示背景; 點選另一張圖片,如果與前一張圖片相同,則

cgroup限制程序記憶體大小

宣告: 本部落格歡迎轉發,但請保留原作者資訊! 內容系本人學習、研究和總結,如有雷同,實屬榮幸! 以限制mongodb的記憶體大小為例。 Cgroup限制方法:   mkdir /cgroup/memory/test/ echo 50M > /cgrou

CGroup 限制CPU/記憶體等資源的使用

CGroup 介紹 CGroup 是 Control Groups 的縮寫,是 Linux 核心提供的一種可以限制、記錄、隔離程序組 (process groups) 所使用的物力資源 (如 cpu memory i/o 等等) 的機制。2007 年進入 Linux

使用cgroup限制記憶體使用

調研目標: 1、檢查memory cgroup管理的程序都設定為不可oom kill時,當出現oom,是否會造成程序或程序組阻塞。 2、若出現阻塞,是否可自恢復。 一、準備過程 0、執行lssubsys --all,檢查是否安裝了cgroup的元件;沒有安裝則 apt-

整理 java 分頁思路

今天剛學分頁還有些不是很清楚 想整理一下..     1.要先建立資料庫 把要顯示的資料存入表裡     2.就要開始寫程式碼了 寫一個JavaBean 建立資料庫屬性 用於存取     3.建立一個

漢諾塔演算法問題的解法(Java)、思路以及舉一反三

首先,先放程式碼,講解以及註釋將會在後文裡單獨寫出來public class hnt { public static void main(String[] args) { hnts("a","b","c",3); } public static void hnt