java介面增加jvm緩存
① java 程序運行, jvm 堆的內存一直增加,為什麼怎麼解決
你這是內存要溢出的節奏,都沒自動釋放垃圾,如果虛擬機沒問題,就是你的程序有問題,創建太多對象沒有釋放一直占內存
② 請問誰知道如何配置來增加eclipse下運行java程序的jvm使用內存
***可以在eclipse中直接設置(對某個具體類vm參數的設置)
1.第一步
③ java內存不足 如何增加jvm內存
在所在目錄下,鍵入
eclipse.exe -vmargs -Xms256m -Xmx512m
256m表示JVM堆內存最小值
512m表示JVM堆內存最大
④ 電腦運行java程序,如何分配過多的jvm內存
Tomcat本身不能直接在計算機上運行,需要依賴於硬體基礎之上的操作系統和一個java虛擬機。JAVA程序啟動時JVM都會分配一個初始內存和最大內存給這個應用程序。這個初始內存和最大內存在一定程度都會影響程序的性能。比如說在應用程序用到最大內存的時候,JVM是要先去做垃圾回收的動作,釋放被佔用的一些內存。所以想調整Tomcat的啟動時初始內存和最大內存就需要向JVM聲明,一般的JAVA程序在運行都可以通過中-Xms -Xmx來調整應用程序的初始內存和最大內存:
這兩個值的大小一般根據需要進行設置。初始化堆的大小執行了虛擬機在啟動時向系統申請的內存的大小。一般而言,這個參數不重要。但是有的應用程序在大負載的情況下會急劇地佔用更多的內存,此時這個參數就是顯得非常重要,如果虛擬機啟動時設置使用的內存比較小而在這種情況下有許多對象進行初始化,虛擬機就必須重復地增加內存來滿足使用。由於這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限於系統使用的物理內存。一般使用數據量較大的應用程序會使用持久對象,內存使用有可能迅速地增長。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰。因此一般建議堆的最大值設置為可用內存的最大值的80%。
Tomcat默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,需要調大。有以下幾種方法可以選用:
第一種方法:
Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下設置:
JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【可以使用的最大內存】'
需要把這個兩個參數值調大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化內存為256MB,可以使用的最大內存為512MB。
第二種方法: 環境變數中設
變數名:JAVA_OPTS
變數值:-Xms512m -Xmx512m
第三種方法:前兩種方法針對的是bin目錄下有catalina.bat的情況(比如直接解壓的Tomcat等),但是有些安裝版的Tomcat下沒有catalina.bat,這個時候可以採用如下方法,當然這個方法也是最通用的方法:
打開tomcatHome//bin//tomcat5w.exe,點擊Java選項卡,然後將會發現其中有這么兩項:Initial memory pool和Maximum memory pool.Initial memory pool這個就是初始化設置的內存的大小。Maximum memory pool這個是最大內存的大小 設置完了就按確定然後再重啟TOMCAT你就會發現tomcat中jvm可用的內存改變了
另外需要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應用有關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那麼完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和內存的需要一致,完全收集就很快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基準測試的時候,為保證最好的性能,要把堆的大小設大,保證垃圾收集不在整個基準測試的過程中出現。
如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。如果垃圾收集成為瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究 垃圾收集參數對性能的影響。一般說來,你應該使用物理內存的 80% 作為堆大小。當增加處理器時,記得增加內存,因為分配可以並行進行,而垃圾收集不是並行的。
一個要注意的地方:建議把內存的最高值跟最低值的差值縮小,不然會浪費很多內存的, 最低值加大 ,最高值可以隨便設,但是要根據實際的物理內存 ,如果內存設置太大了,比如設置了512M最大內存,但如果沒有512M可用內存,Tomcat就不能啟動,還有可能存在內存被系統回收,終止進程的情況。
⑤ 怎樣增加java執行內存
方法如下:
1、打開eclipse配置文件eclipse.ini,更改把-Xmx(其數值代表jvm可以使用的最大內存數)
2、運行java程序時,選擇run->run configuration->arguments,輸入-Xms100M -Xmx800M(-Xms代表jvm啟動時分配的內存大小,-Xmx代表可最大分配多少內存)。
3、如果修改web伺服器的內存可以通過window->preference->myeclipse->servers->伺服器名稱->伺服器名稱+版本->jdk下面修改內存。
例如:-Xms512m -Xmx1024m -XX:PermSize=256m
⑥ java 怎麼改變jvm的配置增大n
典型JVM參數設置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:設置JVM最大可用內存為3550M。
-Xms3550m:設置JVM促使內存為3550m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。
-Xmn2g:設置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所佔比值為1:4,年輕代占整個堆棧的1/5
-XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6
-XX:MaxPermSize=16m:設置持久代大小為16m。
⑦ 怎樣增加java執行內存
方法如下:
1、打開eclipse配置文件eclipse.ini,更改把-Xmx(其數值代表jvm可以使用的最大內存數)
2、運行java程序時,選擇run->run configuration->arguments,輸入-Xms100M -Xmx800M(-Xms代表jvm啟動時分配的內存大小,-Xmx代表可最大分配多少內存)。
3、如果修改web伺服器的內存可以通過window->preference->myeclipse->servers->伺服器名稱->伺服器名稱+版本->jdk下面修改內存。
例如:-Xms512m -Xmx1024m -XX:PermSize=256m
⑧ 如何防止java中的內存泄漏
盡管java虛
擬機和垃圾回收機制治理著大部分的內存事務,但是在java軟體中還是可能存在內存泄漏的情況。的確,在大型工程中,內存泄漏是一個普遍問題。避免內存泄
漏的第一步,就是要了解他們發生的原因。這篇文章就是要介紹一些常見的缺陷,然後提供一些非常好的實踐例子來指導你寫出沒有內存泄漏的代碼。一旦你的程序
存在內存泄漏,要查明代碼中引起泄漏的原因是很困難的。同時這篇文章也要介紹一個新的工具來查找內存泄漏,然後指明發生的根本原因。這個工具輕易上手,可
以讓你找到產品級系統中的內存泄漏。
垃圾回收(GC)的角色
雖然垃圾回收關心著大部分的
問題,包括內存治理,使得程序員的任務顯得更加輕松,但是程序員還是可能犯些錯誤導致內存泄漏問題。GC(垃圾回收)通過遞歸對所有從「根」對象(堆棧中
的對象,靜態數據成員,JNI句柄等等)繼續下來的引用進行工作,然後標記所有可以訪問的活動著的對象。而這些對象變成了程序唯一能夠操縱的對象,其他的
對象都被釋放了。因為GC使得程序不能夠訪問那些被釋放的對象,所以這樣做是安全的。
內存治理可以說是自動的,但是這並沒有讓程
序員脫離內存治理問題。比方說,對於內存的分配(還有釋放)總是存在一定的開銷,盡管這些開銷對程序員來說是隱含的。一個程序假如創建了很多對象,那麼它
就要比完成相同任務而創建了較少對象的程序執行的速度慢(假如其他的條件都相同)。
文章更多想說的,導致內存泄漏主要的原因是,
先前申請了內存空間而忘記了釋放。假如程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,因為無法讓垃圾回收器驗證這些對象是否不再需
要。正如我們前面看到的,假如存在對象的引用,這個對象就被定義為「活動的」,同時不會被釋放。要確定對象所佔內存將被回收,程序員就要務必確認該對象不
再會被使用。典型的做法就是把對象數據成員設為null或者從集合中移除該對象。注重,當局部變數不需要時,不需明顯的設為null,因為一個方法執行完
畢時,這些引用會自動被清理。
從更高一個層次看,這就是所有存在內存管的語言對內存泄漏所考慮的事情,剩餘的對象引用將不再會被使用。
典型的泄漏
既然我們知道了在java中確實會存在內存泄漏,那麼就讓我們看一些典型的泄漏,並找出他們發生的原因。
全局集合
在大型應用程序中存在各種各樣的全局數據倉庫是很普遍的,比如一個JNDI-tree或者一個session table。在這些情況下,注重力就被放在了治理數據倉庫的大小上。當然是有一些適當的機制可以將倉庫中的無用數據移除。
可以有很多不同的解決形式,其中最常用的是一種周期運行的清除作業。這個作業會驗證倉庫中的數據然後清除一切不需要的數據。
另一個辦法是計算引用的數量。集合負責跟蹤集合中每個元素的引用者數量。這要求引用者通知集合什麼時候已經對元素處理完畢。當引用者的數目為零時,就可以移除集合中的相關元素。
高速緩存
高速緩存是一種用來快速查找已經執行過的操作結果的數據結構。因此,假如一個操作執行很慢的話,你可以先把普通輸入的數據放入高速緩存,然後過些時間再調用高速緩存中的數據。
高速緩存多少還有一點動態實現的意思,當數據操作完畢,又被送入高速緩存。一個典型的演算法如下所示:
1. 檢查結果是否在高速緩存中,存在則返回結果;
2. 假如結果不在,那麼計算結果;
3. 將結果放入高速緩存,以備將來的操作調用。
這個演算法的問題(或者說潛在的內存泄漏)在最後一步。假如操作是分別多次輸入,那麼存入高速緩存的內容將會非常大。很明顯這個方法不可取。
為了避免這種潛在的致命錯誤設計,程序就必須確定高速緩存在他所使用的內存中有一個上界。因此,更好的演算法是:
1. 檢查結果是否在高速緩存中,存在則返回結果;
2. 假如結果不在,那麼計算結果;
3. 假如高速緩存所佔空間過大,移除緩存中舊的結果;
4. 將結果放入高速緩存,以備將來的操作調用。
通過不斷的從緩存中移除舊的結果,我們可以假設,將來,最新輸入的數據可能被重用的幾率要遠遠大於舊的結果。這通常是一個不錯的設想。
這個新的演算法會確保高速緩存的容量在預先確定的范圍內。精確的范圍是很難計算的,因為緩存中的對象存在引用時將繼續有效。正確的劃分高速緩存的大小是一個復雜的任務,你必須權衡可使用內存大小和數據快速存取之間的矛盾。
另一個解決這個問題的途徑是使用java.lang.ref.SoftReference類來將對象放入高速緩存。這個方法可以保證當虛擬機用完內存或者需要更多堆的時候,可以釋放這些對象的引用。
類裝載器
Java類裝載器創建就存在很多導致內存泄漏的漏洞。由於類裝載器的復雜結構,使得很難得到內存泄漏的透視圖。這些困難不僅僅是由於類裝載器只與「普通
的」對象引用有關,同時也和對象內部的引用有關,比如數據變數,方法和各種類。這意味著只要存在對數據變數,方法,各種類和對象的類裝載器,那麼類裝載器
將駐留在JVM中。既然類裝載器可以同很多的類關聯,同時也可以和靜態數據變數關聯,那麼相當多的內存就可能發生泄漏。
定位內存泄漏
經常地,程序內存泄漏的最初跡象發生在出錯之後,在你的程序中得到一個OutOfMemoryError。這種典型的情況發生在產品環境中,而在那裡,
你希望內存泄漏盡可能的少,調試的可能性也達到最小。也許你的測試環境和產品的系統環境不盡相同,導致泄露的只會在產品中暴露。這種情況下,你需要一個低
負荷的工具來監聽和尋找內存泄漏。同時,你還需要把這個工具同你的系統聯系起來,而不需要重新啟動他或者機械化你的代碼。也許更重要的是,當你做分析的時
候,你需要能夠同工具分離而使得系統不會受到干擾。
一個OutOfMemoryError經常是內存泄漏的一個標志,有可能應用
程序的確用了太多的內存;這個時候,你既不能增加JVM的堆的數量,也不能改變你的程序而使得他減少內存使用。但是,在大多數情況下,一個
OutOfMemoryError是內存泄漏的標志。一個解決辦法就是繼續監聽GC的活動,看看隨時間的流逝,內存使用量是否會增加,假如有,程序中一定
存在內存泄漏。
具體輸出
有很多辦法來監聽垃圾回收器的活動。也許運用最廣泛的就是以:-Xverbose:gc選項運行JVM,然後觀察輸出結果一段時間。
[memory] 10.109-10.235: GC 65536K->16788K (65536K), 126.000 ms
箭頭後的值(在這個例子中 16788K)是垃圾回收後堆的使用量。
控制台
觀察這些無盡的GC具體統計輸出是一件非常單調乏味的事情。好在有一些工具來代替我們做這些事情。The JRockit Management Console可以用圖形的方式輸出堆的使用量。通過觀察圖像,我們可以很方便的觀察堆的使用量是否伴隨時間增長。
Figure 1. The JRockit Management Console
治理控制台甚至可以配置成在堆使用量出現問題(或者其他的事件發生)時向你發送郵件。這個顯然使得監控內存泄漏更加輕易。
內存泄漏探測工具
有很多專門的內存泄漏探測工具。其中The JRockit Memory Leak
Detector可以供來觀察內存泄漏也可以針對性地找到泄漏的原因。這個強大的工具被緊密地集成在JRockit
JVM中,可以提供最低可能的內存事務也可以輕松的訪問虛擬機的堆。
專門工具的優勢
一旦
你知道程序中存在內存泄漏,你需要更專業的工具來查明為什麼這里會有泄漏。而JVM是不可能告訴你的。現在有很多工具可以利用了。這些工具本質上主要通過
兩種方法來得到JVM的存儲系統信息的:JVMTI和位元組碼儀器。Java虛擬機工具介面(JVMTI)和他的原有形式JVMPI(壓型介面,PRofiling Interface)都是標准介面,作為外部工具同JVM進行通信,搜集JVM的信息。位元組碼儀器則是引用通過探針獲得工具所需的位元組信息的預處理技術。
通過這些技術來偵測內存泄漏存在兩個缺點,而這使得他們在產品級環境中的運用不夠理想。首先,根據兩者對內存的使用量和內存事務性能的降級是不可以忽略
的。從JVM獲得的堆的使用量信息需要在工具中導出,收集和處理。這意味著要分配內存。按照JVM的性能導出信息是需要開銷的,垃圾回收器在搜集信息的時
候是運行的非常緩慢的。另一個缺點就是,這些工具所需要的信息是關繫到JVM的。讓工具在JVM開始運行的時候和它關聯,而在分析的時候,分離工具而保持
JVM運行,這顯然是不可能的。
既然JRockit Memory Leak
Detector是被集成到JVM中的,那麼以上兩種缺點就不再存在。首先,大部分的處理和分析都是在JVM中完成的,所以就不再需要傳送或重建任何數
據。處理也可以建立在垃圾回收器的基礎上,即提高速度。再有,內存泄漏偵測器可以同一個運行的JVM關聯和分離,只要JVM在開始的時候伴隨著
–Xmanagement選項(通過遠程JMX介面答應監聽和治理JVM)。當工具分離以後,工具不會遺留任何東西在JVM中;JVM就可以全速運行代碼
就似乎工具關聯之前一樣。
⑨ 關於JAVA打包和擴大JVM內存的糾結問題
下載個jar2Exe,網路一下就有了。然後用jar2Exe把jar包變成exe雙擊便可運行。發給別人玩確保別人機器上也安裝了jdk。
jar雙擊打不開正常,不是所有jar雙擊都能打開,寫批處理打開,新建記事本輸入內容:java -jar 含有main的類名.jar 保存為.bat文件。jar包和你.bat文件在同一目錄下。雙擊.bat文件即可。發給這種方法發給別人不是很方便。
圖片過多內存溢出,圖片不要一次性加入,動態加入,需要那張圖片再加入,不用時移除。
增大java虛擬機內存最大也才128M修改方法網路一下有許多:下面是網路文庫的:http://wenku..com/view/e5950fdfad51f01dc281f1ff.html