調優案例分析

堆外內存導致的溢出

除了java堆和永生代之外,西面這些區域還會佔用較多的內存,這裏所有內存總和受到操作系統進程最大內存的限制。

  • Direct Memory
  • 線程堆棧
  • Socket緩存區:每個socket連接都receive和send兩個緩存區,分別佔大約37k和25k內存,連接多的話這塊內存也很客觀,如果無法分配則繪拋出IOException:Too many open files異常。
  • JNI代碼:如果代碼中使用JNI調用本地庫,那本地庫使用的內存也不在堆中。
  • 虛擬機和GC:虛擬機、GC的代碼執行也要消耗一定的內存,

外部命令導致系統緩慢

fork系統調用是linux用來產生新進程的,在java虛擬機中,用戶編寫的java代碼最多隻能有線程得概念,不應有進程的產生,bug產生:執行一個外部shell腳本通過java的Runtime.getRuntime().exec()方法來調用的,這種調用方式在虛擬機是非常消耗資源的操作,即是外部命令本身能很快完成,頻繁調用時創建進程的開銷也很可觀。java執行這個命令的過程是,首先克隆一個和當前虛擬機擁有一樣環境變量的進程,再用這個新的進程去執行外部命令,最後退出這個進程,頻繁執行這個操作,cpu消耗會很大,內存負擔也重。

寫代碼,寫plugin.xml代碼,代碼打成jar,放到eclipse的plugin目錄,ok。虛擬機調優

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章