導航:首頁 > 編程語言 > java溢出判斷

java溢出判斷

發布時間:2022-05-08 03:39:17

⑴ 怎麼判斷int類型溢出 java

(1)無符號整數相加,如果結果小於其中任何一個,則溢出;
bool
IsOverFlow(unsigned
x,
unsigned
y)
{
unsigned
z
=
x
+
y;
if(z
<
x)
return
true;
return
false;
}
(2)
有符號整數相加,比無符號的相對復雜一點兒:
如果兩個整數相加<0,或者兩個負數相加>0,(負數在計算機中用補碼表示)則溢出。
bool
IsOverFlow(int
x,
int
y)
{
int
z
=
x
+
y;
if(x
>
0
&&
y
>
0
&&
z
<
0)
return
true;
if(x
<
0
&&
y
<
0
&&
z
>
0)
return
true;
return
false;
}
(3)如何判斷一個輸入或者轉化轉化的單個數字是否溢出;if(
num>0x7fffffff
||
num<(signed
int)0x80000000)
int類型的最大正數:0x7fffffff;
int類型的最小負數:0x80000000;

⑵ 請詳細的講解一下java中的泄露和溢出

java中的泄露和溢出,跟這兩個次的意思是一樣的
比作一個盛水的容器
泄露,是不經意的,是由於容器有漏洞,裂縫之類的,導致水溜出去
溢出,是因為容器太小了,你把10升的水全部倒入9升的容器,容器雖然自身沒有問題,但是因為你倒的太多,滿出來了

說回java,
泄露是代碼間不經意的將一些本應該被回收而由於錯寫一些代碼或漏寫一些操作導致內存沒有回收掉
溢出是你本來就算要加1G的對象到內存中,但是由於內存只有900M可以用。
但是這兩個問題對於java來說,都是人為的錯誤,需要改善。
泄露的改善就是找出溢出的地方,找出錯誤代碼,修復。
溢出的解決就是需要找解決方案,盡可能的減少一次性的內存載入。比如對一個10G的數組對象排序,這時候可以考慮外排序(不了解可)。

⑶ java 數據溢出處理

int 類型在 Java 中是「有符號」的。所謂「有符號」就是有正負。在計算機中用二進製表示所有的信息,這個符號的區別就看首位。

首位如果是 0,就是正的,1 就是負的。正與負的區別也因此就在於取反加一。這不僅在 Java,在任何語言中都是這樣的。

所謂數值溢出就會出現這個現象。Java 中的 int 總共就 32 位,正數上限的情況首位也只能是 0,其他位都可以是 1(就是 2^31-1 的情況)。但是如果正數過大了,例如 2^31,計算機不得不把首位變成 1,並且很快就忘了這是溢出情況,把它按照正常的方式輸出了,於是就成了負的。其實也不能怪它,它沒有辦法自動處理超過溢出的情況,因為 32 位是固定的,它不能因為溢出而臨時擴展到 33 位之類的。

以上是負數的情況。溢出變成 0 的話道理也一樣。你想如果一個數大到最後 32 位都是 0 了,那計算機只能把它認作 0。這種情況有很多,例如 2^32 就是一共 33 位,首位 1,後面 32 位都是 0。

⑷ java 數字溢出 檢查

有一種是提前做四捨五入的處理,這樣就不會超出表達的范圍。

⑸ java程序內存溢出一般什麼原因

JVM內存設置小了 或者一次性讀的數據過大 例如list vertor

一、內存溢出類型

1、java.lang.OutOfMemoryError: PermGen space

JVM管理兩種類型的內存,堆和非堆。堆是給開發人員用的上面說的就是,是在JVM啟動時創建;非堆是留給JVM自己用的,用來存放類的信息的。它和堆不同,運行期內GC不會釋放空間。如果web
app用了大量的第三方jar或者應用有太多的class文件而恰好MaxPermSize設置較小,超出了也會導致這塊內存的佔用過多造成溢出,或者tomcat熱部署時侯不會清理前面載入的環境,只會將context更改為新部署的,非堆存的內容就會越來越多。

PermGen space的全稱是Permanent Generation
space,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen
space中,它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen
space進行清理,所以如果你的應用中有很CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web伺服器對JSP進行pre
compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。

一個最佳的配置例子:(經過本人驗證,自從用此配置之後,再未出現過tomcat死掉的情況)

set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m
-XX:MaxPermSize=256m

2、java.lang.OutOfMemoryError: Java heap space

第一種情況是個補充,主要存在問題就是出現在這個情況中。其默認空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。如果內存剩餘不到40%,JVM就會增大堆到Xmx設置的值,內存剩餘超過70%,JVM就會減小堆到Xms設置的值。所以伺服器的Xmx和Xms設置一般應該設置相同避免每次GC後都要調整虛擬機堆的大小。假設物理內存無限大,那麼JVM內存的最大值跟操作系統有關,一般32位機是1.5g到3g之間,而64位的就不會有限制了。

注意:如果Xms超過了Xmx值,或者堆最大值和非堆最大值的總和超過了物理內存或者操作系統的最大限制都會引起伺服器啟動不起來。

垃圾回收GC的角色

JVM調用GC的頻度還是很高的,主要兩種情況下進行垃圾回收:

當應用程序線程空閑;另一個是java內存堆不足時,會不斷調用GC,若連續回收都解決不了內存堆不足的問題時,就會報out of
memory錯誤。因為這個異常根據系統運行環境決定,所以無法預期它何時出現。

根據GC的機制,程序的運行會引起系統運行環境的變化,增加GC的觸發機會。

為了避免這些問題,程序的設計和編寫就應避免垃圾對象的內存佔用和GC的開銷。顯示調用System.GC()只能建議JVM需要在內存中對垃圾對象進行回收,但不是必須馬上回收,

一個是並不能解決內存資源耗空的局面,另外也會增加GC的消耗。

二、JVM內存區域組成

簡單的說java中的堆和棧

java把內存分兩種:一種是棧內存,另一種是堆內存

1。在函數中定義的基本類型變數和對象的引用變數都在函數的棧內存中分配;

2。堆內存用來存放由new創建的對象和數組

在函數(代碼塊)中定義一個變數時,java就在棧中為這個變數分配內存空間,當超過變數的作用域後,java會自動釋放掉為該變數所分配的內存空間;在堆中分配的內存由java虛擬機的自動垃圾回收器來管理

堆的優勢是可以動態分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的。缺點就是要在運行時動態分配內存,存取速度較慢;

棧的優勢是存取速度比堆要快,缺點是存在棧中的數據大小與生存期必須是確定的無靈活性。

java堆分為三個區:New、Old和Permanent

GC有兩個線程:

新創建的對象被分配到New區,當該區被填滿時會被GC輔助線程移到Old區,當Old區也填滿了會觸發GC主線程遍歷堆內存里的所有對象。Old區的大小等於Xmx減去-Xmn

java棧存放

棧調整:參數有+UseDefaultStackSize -Xss256K,表示每個線程可申請256k的棧空間

每個線程都有他自己的Stack

三、JVM如何設置虛擬內存

提示:在JVM中如果98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出此異常信息。

提示:Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置為相同,而-Xmn為1/4的-Xmx值。

提示:JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。

默認空餘堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空餘堆內存大於70%時,JVM會減少堆直到-Xms的最小限制。因此伺服器一般設置-Xms、-Xmx相等以避免在每次GC
後調整堆的大小。

提示:假設物理內存無限大的話,JVM內存的最大值跟操作系統有很大的關系。

簡單的說就32位處理器雖然可控內存空間有4GB,但是具體的操作系統會給一個限制,

這個限制一般是2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統下為2G-3G),而64bit以上的處理器就不會有限制了

提示:注意:如果Xms超過了Xmx值,或者堆最大值和非堆最大值的總和超過了物理內存或者操作系統的最大限制都會引起伺服器啟動不起來。

提示:設置NewSize、MaxNewSize相等,"new"的大小最好不要大於"old"的一半,原因是old區如果不夠大會頻繁的觸發"主" GC
,大大降低了性能

JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;

由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。

解決方法:手動設置Heap size

修改TOMCAT_HOME/bin/catalina.bat

在「echo "Using CATALINA_BASE: $CATALINA_BASE"」上面加入以下行:

JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

四、性能檢查工具使用

定位內存泄漏:

JProfiler工具主要用於檢查和跟蹤系統(限於Java開發的)的性能。JProfiler可以通過時時的監控系統的內存使用情況,隨時監視垃圾回收,線程運行狀況等手段,從而很好的監視JVM運行情況及其性能。

1. 應用伺服器內存長期不合理佔用,內存經常處於高位佔用,很難回收到低位;

2. 應用伺服器極為不穩定,幾乎每兩天重新啟動一次,有時甚至每天重新啟動一次;

3. 應用伺服器經常做Full GC(Garbage Collection),而且時間很長,大約需要30-40秒,應用伺服器在做Full
GC的時候是不響應客戶的交易請求的,非常影響系統性能。

因為開發環境和產品環境會有不同,導致該問題發生有時會在產品環境中發生,通常可以使用工具跟蹤系統的內存使用情況,在有些個別情況下或許某個時刻確實是使用了大量內存導致out
of memory,這時應繼續跟蹤看接下來是否會有下降,

如果一直居高不下這肯定就因為程序的原因導致內存泄漏。

五、不健壯代碼的特徵及解決辦法

1、盡早釋放無用對象的引用。好的辦法是使用臨時變數的時候,讓引用變數在退出活動域後,自動設置為null,暗示垃圾收集器來收集該對象,防止發生內存泄露。

對於仍然有指針指向的實例,jvm就不會回收該資源,因為垃圾回收會將值為null的對象作為垃圾,提高GC回收機制效率;

2、我們的程序里不可避免大量使用字元串處理,避免使用String,應大量使用StringBuffer,每一個String對象都得獨立佔用內存一塊區域;

String str = "aaa";

String str2 = "bbb";

String str3 = str + str2;//假如執行此次之後str
,str2以後再不被調用,那它就會被放在內存中等待Java的gc去回收,程序內過多的出現這樣的情況就會報上面的那個錯誤,建議在使用字元串時能使用StringBuffer就不要用String,這樣可以省不少開銷;

3、盡量少用靜態變數,因為靜態變數是全局的,GC不會回收的;

4、避免集中創建對象尤其是大對象,JVM會突然需要大量內存,這時必然會觸發GC優化系統內存環境;顯示的聲明數組空間,而且申請數量還極大。

這是一個案例想定供大家警戒

使用jspsmartUpload作文件上傳,運行過程中經常出現java.outofMemoryError的錯誤,

檢查之後發現問題:組件里的代碼

m_totalBytes = m_request.getContentLength();

m_binArray = new byte[m_totalBytes];

問題原因是totalBytes這個變數得到的數極大,導致該數組分配了很多內存空間,而且該數組不能及時釋放。解決辦法只能換一種更合適的辦法,至少是不會引發outofMemoryError的方式解決。參考:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747

5、盡量運用對象池技術以提高系統性能;生命周期長的對象擁有生命周期短的對象時容易引發內存泄漏,例如大集合對象擁有大數據量的業務對象的時候,可以考慮分塊進行處理,然後解決一塊釋放一塊的策略。

6、不要在經常調用的方法中創建對象,尤其是忌諱在循環中創建對象。可以適當的使用hashtable,vector
創建一組對象容器,然後從容器中去取那些對象,而不用每次new之後又丟棄

7、一般都是發生在開啟大型文件或跟資料庫一次拿了太多的數據,造成 Out Of Memory Error
的狀況,這時就大概要計算一下數據量的最大值是多少,並且設定所需最小及最大的內存空間值。

⑹ java問題內存溢出

我猜測雖然內存又跌回了64M,但是你應該沒有OutOfMemoryError的問題了吧.-Xmx的意思只是告訴JRE最大向操作系統申請多少堆內存,並不是一直要佔有那麼多.如果異常已經沒有再出現,那麼這個問題並不嚴重.

⑺ Java在什麼情況下會內存溢出

1 被生命周期極長的集合類不當持有,號稱是Java內存泄漏的首因。
這些集合類的生命周期通常極長,而且是一個輔助管理性質的對象,在一個業務事務運行完後,如果沒有將某個業務對象主
動的從中清除的話,這個集合就會吃越來越多內存.
2 Scope定義不對,這個很簡單了,方法的局部變數定義成類的變數,類的靜態變數等。
3 異常時沒有加finally{}來釋放某些資源,JDBC時代也是很普遍的事情。
4 另外一些我了解不深的原因,如:Swing里的Listener沒有顯式remove;內部類持有外部對象的隱式引用;Finalizers造成關聯對象沒有被及時清空等。

⑻ java內存溢出是什麼情況

首先先說一下JVM內存結構問題,JVM為兩塊:PermanentSapce和HeapSpace,其中
Heap = }。PermantSpace負責保存反射對象,一般不用配置。JVM的Heap區可以通過-X參數來設定。
當一個URL被訪問時,內存申請過程如下:
A. JVM會試圖為相關Java對象在Eden中初始化一塊內存區域
B. 當Eden空間足夠時,內存申請結束。否則到下一步
C. JVM試圖釋放在Eden中所有不活躍的對象(這屬於1或更高級的垃圾回收), 釋放後若Eden空間仍然不足以放入新對象,則試圖將部分Eden中活躍對象放入Survivor區
D. Survivor區被用來作為Eden及OLD的中間交換區域,當OLD區空間足夠時,Survivor區的對象會被移到Old區,否則會被保留在Survivor區
E. 當OLD區空間不夠時,JVM會在OLD區進行完全的垃圾收集(0級)
F. 完全垃圾收集後,若Survivor及OLD區仍然無法存放從Eden復制過來的部分對象,導致JVM無法在Eden區為新對象創建內存區域,則出現」out of memory錯誤」

JVM調優建議:

ms/mx:定義YOUNG+OLD段的總尺寸,ms為JVM啟動時YOUNG+OLD的內存大小;mx為最大可佔用的YOUNG+OLD內存大小。在用戶生產環境上一般將這兩個值設為相同,以減少運行期間系統在內存申請上所花的開銷。
NewSize/MaxNewSize:定義YOUNG段的尺寸,NewSize為JVM啟動時YOUNG的內存大小;MaxNewSize為最大可佔用的YOUNG內存大小。在用戶生產環境上一般將這兩個值設為相同,以減少運行期間系統在內存申請上所花的開銷。
PermSize/MaxPermSize:定義Perm段的尺寸,PermSize為JVM啟動時Perm的內存大小;MaxPermSize為最大可佔用的Perm內存大小。在用戶生產環境上一般將這兩個值設為相同,以減少運行期間系統在內存申請上所花的開銷。
SurvivorRatio:設置Survivor空間和Eden空間的比例

內存溢出的可能性

1. OLD段溢出
這種內存溢出是最常見的情況之一,產生的原因可能是:
1) 設置的內存參數過小(ms/mx, NewSize/MaxNewSize)
2) 程序問題
單個程序持續進行消耗內存的處理,如循環幾千次的字元串處理,對字元串處理應建議使用StringBuffer。此時不會報內存溢出錯,卻會使系統持續垃圾收集,無法處理其它請求,相關問題程序可通過Thread Dump獲取(見系統問題診斷一章)單個程序所申請內存過大,有的程序會申請幾十乃至幾百兆內存,此時JVM也會因無法申請到資源而出現內存溢出,對此首先要找到相關功能,然後交予程序員修改,要找到相關程序,必須在Apache日誌中尋找。
當Java對象使用完畢後,其所引用的對象卻沒有銷毀,使得JVM認為他還是活躍的對象而不進行回收,這樣累計佔用了大量內存而無法釋放。由於目前市面上還沒有對系統影響小的內存分析工具,故此時只能和程序員一起定位。

2. Perm段溢出
通常由於Perm段裝載了大量的Servlet類而導致溢出,目前的解決辦法:
1) 將PermSize擴大,一般256M能夠滿足要求
2) 若別無選擇,則只能將servlet的路徑加到CLASSPATH中,但一般不建議這么處理

3. C Heap溢出
系統對C Heap沒有限制,故C Heap發生問題時,Java進程所佔內存會持續增長,直到佔用所有可用系統內存

參數說明:

JVM 堆內存(heap)設置選項
參數格式
說 明

設置新對象生產堆內存(Setting the Newgeneration heap size)
-XX:NewSize
通過這個選項可以設置Java新對象生產堆內存。在通常情況下這個選項的數值為1 024的整數倍並且大於1MB。這個值的取值規則為,一般情況下這個值-XX:NewSize是最大堆內存(maximum heap size)的四分之一。增加這個選項值的大小是為了增大較大數量的短生命周期對象

增加Java新對象生產堆內存相當於增加了處理器的數目。並且可以並行地分配內存,但是請注意內存的垃圾回收卻是不可以並行處理的

設置最大新對象生產堆內存(Setting the maximum New generation heap size)
-XX:MaxNewSize
通過這個選項可以設置最大Java新對象生產堆內存。通常情況下這個選項的數值為1 024的整數倍並且大於1MB

其功用與上面的設置新對象生產堆內存-XX:NewSize相同

設置新對象生產堆內存的比例(Setting New heap size ratios)
-XX:SurvivorRatio
新對象生產區域通常情況下被分為3個子區域:伊甸園,與兩個殘存對象空間,這兩個空間的大小是相同的。通過用-XX:SurvivorRatio=X選項配置伊甸園與殘存對象空間(Eden/survivor)的大小的比例。你可以試著將這個值設置為8,然後監控、觀察垃圾回收的工作情況

設置堆內存池的最大值(Setting maximum heap size)
-Xmx
通過這個選項可以要求系統為堆內存池分配內存空間的最大值。通常情況下這個選項的數值為1 024的整數倍並且大於1 MB

一般情況下這個值(-Xmx)與最小堆內存(minimum heap size –Xms)相同,以降低垃圾回收的頻度

取消垃圾回收
-Xnoclassgc
這個選項用來取消系統對特定類的垃圾回收。它可以防止當這個類的所有引用丟失之後,這個類仍被引用時不會再一次被重新裝載,因此這個選項將增大系統堆內存的空間

設置棧內存的大小
-Xss
這個選項用來控制本地線程棧的大小,當這個選項被設置的較大(>2MB)時將會在很大程度上降低系統的性能。因此在設置這個值時應該格外小心,調整後要注意觀察系統的性能,不斷調整以期達到最優

最後說一句,你的機器的連接數設置也至關重要,連接的關閉最好把時間設置的少些,那些連接非常耗費資源。也是引起內存泄露的主要原因。

⑼ 如何檢查和解決java虛擬機內存溢出的問題

一,jvm內存區域

1, 程序計數器

一塊很小的內存空間,作用是當前線程所執行的位元組碼的行號指示器。

2, java棧

與程序計數器一樣,java棧(虛擬機棧)也是線程私有的,其生命周期與線程相同。通常存放基本數據類型,對象引用(一個指向對象起始地址的引用指針或一個代表對象的句柄),reeturnAddress類型(指向一條位元組碼指令的地址)

棧區域有兩種異常類型:如果線程請求的棧深度大於虛擬機所允許的深度,將拋StrackOverflowError異常;如果虛擬機棧可以動態擴展(大部分虛擬機都可動態擴展),當擴展時無法申請到足夠的內存時會拋出OutOfMemoryError異常。

3, 本地方法棧

與虛擬機棧作用很相似,區別是虛擬機棧為虛擬機執行java方法服務,而本地方法棧則是為虛擬機用到的Native方法服務。和虛擬機棧一樣可能拋出StackOverflowError和OutOfMemoryError異常。

4, java堆

java
Heap是jvm所管理的內存中最大的區域。JavaHeap是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。主要存放對象實例。JavaHeap
是垃圾收集器管理的主要區域,其可細分為新生代和老年代。如果在堆中沒有內存完成實例分配,並且也無法再擴展時,會拋出OutOfMemoryError
異常。

5, 方法區

與javaHeap一樣是各個線程共享的內存區域,用於存放已被虛擬機載入的類信息、常量、靜態變數、及時編譯器編譯後的代碼等數據。當方法區無法滿足內
存分配的需求時,將拋出OutOfMemoryError異常。方法同時包含常聽說的運行時常量池,用於存放編譯期生成的各種字面量和符號引用。

6, 直接內存

直接內存並不是虛擬機運行時數據區的一部分,也不是java虛擬機規范中定義的內存區域,是jvm外部的內存區域,這部分區域也可能導致OutOfMemoryError異常。

二,jvm參數

-Xss(StackSpace)棧空間

-Xms ,-Xmx(heap memory
space)堆空間:Heap是大家最為熟悉的區域,他是jvm用來存儲對象實例的區域,Heap在32位的系統中最大為2G,其大小通過-Xms和
-Xmx來控制,-Xms為jvm啟動時申請的最小Heap內存,默認為物理內存的1/64,但小於1G,-Xmx為jvm可申請的最大的Heap內存,
默認為物理內存的1/4,一般也小於1G,默認當空餘堆內存小於40%時,jvm會最大Heap的大小到-Xmx指定大小,可通過
-XX:MinHeapFreeRatio來指定這個比例,當空餘堆內存大於70%時,JVM會將Heap的大小往-Xms指定的大小調整,可通過
-XX:MaxHeapFreeRatio來指定這個比例,但通常為了避免頻繁調整HeapSize的大小,將-Xms和-Xmx的值設為相同。

-XX:PermSize -XX:MaxPermSize :方法區持久代大小: 方法區域也是全局共享的,在一定的條件下它也會被 GC ,當方法區域需要使用的內存超過其允許的大小時,會拋出 OutOfMemory 的錯誤信息。

三,常見內存溢出錯誤解決辦法

1, OutOfMemoryError異常

除了程序計數器外,虛擬機內存的其他幾個運行時區域都有發生OutOfMemoryError(OOM)異常的可能,

Java Heap 溢出

一般的異常信息:java.lang.OutOfMemoryError:Java heap spacess

java堆用於存儲對象實例,我們只要不斷的創建對象,並且保證GC Roots到對象之間有可達路徑來避免垃圾回收機制清除這些對象,就會在對象數量達到最大堆容量限制後產生內存溢出異常。

出現這種異常,一般手段是先通過內存映像分析工具(如Eclipse Memory
Analyzer)對mp出來的堆轉存快照進行分析,重點是確認內存中的對象是否是必要的,先分清是因為內存泄漏(Memory
Leak)還是內存溢出(Memory Overflow)。

如果是內存泄漏,可進一步通過工具查看泄漏對象到GC Roots的引用鏈。於是就能找到泄漏對象時通過怎樣的路徑與GC Roots相關聯並導致垃圾收集器無法自動回收。

如果不存在泄漏,那就應該檢查虛擬機的參數(-Xmx與-Xms)的設置是否適當。

2, 虛擬機棧和本地方法棧溢出

如果線程請求的棧深度大於虛擬機所允許的最大深度,將拋出StackOverflowError異常。

如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常

這里需要注意當棧的大小越大可分配的線程數就越少。

3, 運行時常量池溢出

異常信息:java.lang.OutOfMemoryError:PermGen space

如果要向運行時常量池中添加內容,最簡單的做法就是使用String.intern()這個Native方法。該方法的作用是:如果池中已經包含一個等於
此String的字元串,則返回代表池中這個字元串的String對象;否則,將此String對象包含的字元串添加到常量池中,並且返回此String
對象的引用。由於常量池分配在方法區內,我們可以通過-XX:PermSize和-XX:MaxPermSize限制方法區的大小,從而間接限制其中常量
池的容量。

4, 方法區溢出

方法區用於存放Class的相關信息,如類名、訪問修飾符、常量池、欄位描述、方法描述等。

異常信息:java.lang.OutOfMemoryError:PermGen space

方法區溢出也是一種常見的內存溢出異常,一個類如果要被垃圾收集器回收,判定條件是很苛刻的。在經常動態生成大量Class的應用中,要特別注意這點。

⑽ java內存溢出的問題如何排查

java程序大家都知道,內存溢出是經常見的錯誤,下面從基本的開始分析!
內存溢出是由於沒被引用的對象(垃圾)過多造成JVM沒有及時回收,造成的內存溢出。如果出現這種現象可行代碼排查:
一)是否App中的類中和引用變數過多使用了Static修飾 如public staitc Student s;在類中的屬性中使用 static修飾的最好只用基本類型或字元串。如public static int i = 0; //public static String str;
二)是否App中使用了大量的遞歸或無限遞歸(遞歸中用到了大量的建新的對象)
三)是否App中使用了大量循環或死循環(循環中用到了大量的新建的對象)
四)檢查App中是否使用了向資料庫查詢所有記錄的方法。即一次性全部查詢的方法,如果數據量超過10萬多條了,就可能會造成內存溢出。所以在查詢時應採用「分頁查詢」。
五)檢查是否有數組,List,Map中存放的是對象的引用而不是對象,因為這些引用會讓對應的對象不能被釋放。會大量存儲在內存中。
六)檢查是否使用了「非字面量字元串進行+」的操作。因為String類的內容是不可變的,每次運行"+"就會產生新的對象,如果過多會造成新String對象過多,從而導致JVM沒有及時回收而出現內存溢出。
如String s1 = "My name";
String s2 = "is";
String s3 = "xuwei";
String str = s1 + s2 + s3 +.........;這是會容易造成內存溢出的
但是String str = "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是這種就不會造成內存溢出。因為這是」字面量字元串「,在運行"+"時就會在編譯期間運行好。不會按照JVM來執行的。
在使用String,StringBuffer,StringBuilder時,如果是字面量字元串進行"+"時,應選用String性能更好;如果是String類進行"+"時,在不考慮線程安全時,應選用StringBuilder性能更好。
知道原因了,解決起來就非常簡單了。

閱讀全文

與java溢出判斷相關的資料

熱點內容
安卓機內存刪除怎麼恢復 瀏覽:329
Qt環境的編譯軟體放到linux 瀏覽:212
聯創列印系統怎麼連接伺服器 瀏覽:935
杭州行政命令 瀏覽:160
如何查找伺服器日誌 瀏覽:801
加密的鑰匙扣怎麼寫 瀏覽:579
文件夾更新不了怎麼辦 瀏覽:475
壓縮機指示燈亮是什麼原因 瀏覽:956
什麼app訂酒店半價 瀏覽:765
中老年解壓神器 瀏覽:243
訊飛語音ttsandroid 瀏覽:468
腰椎壓縮性骨折術後能坐車嗎 瀏覽:507
python類裝飾器參數 瀏覽:347
均線pdf微盤 瀏覽:791
女生喜歡玩的解壓游戲 瀏覽:442
支付寶暗號加密操作 瀏覽:133
柯潔在哪個app下圍棋 瀏覽:751
平板用什麼app看內在美 瀏覽:609
cad計算機命令 瀏覽:173
郵箱設置域名伺服器錯誤什麼意思 瀏覽:671