內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無法回收的內(nèi)存或使用的內(nèi)存過多,最終使得程序運行要用到的內(nèi)存大于虛擬機(jī)能提供的最大內(nèi)存。 ?
創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè),網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十多年品質(zhì),值得信賴!
所以我們應(yīng)該明確:存在內(nèi)存溢出的因不一定導(dǎo)致內(nèi)存溢出的果
public class Know {
public static void main(String [] args)
{
int w = new Integer(args[0]).intValue();
int h = Integer.parseInt(args[1]);
for(int i=0;ih;i++)
{
StringBuffer sb=new StringBuffer();
for(int j=0;iw;j++)
{
sb.append('*');
}
System.out.println(sb.toString());
}
}
}
這是我在網(wǎng)上找的一個例子,試驗了一下,是對的,造成內(nèi)存溢出的原因是
for(int j=0;iw;j++)
{
sb.append('*');
}
是死循環(huán),我原先是這么寫的一個例子
public class Know {
public static void main(String[] args) {
while(true){
System.out.println("ok");
}
}
}
但并沒有導(dǎo)致內(nèi)存溢出,應(yīng)該是它消耗的內(nèi)存比較小或者運行時間短,正如這句話所說“存在內(nèi)存溢出的因不一定導(dǎo)致內(nèi)存溢出的果”
希望可以幫到你
數(shù)據(jù)庫連接沒有關(guān)閉,代碼不合理,循環(huán)過多,創(chuàng)造了太多的對象,java還真不占什么內(nèi)存
自己改一下下面的代碼,把堆棧中的元素改成mp3類型的或更大點的東西
4.Java中參數(shù)都是傳值的。
對于基本類型,大家基本上沒有異議,但是對于引用類型我們也不能有異議。
Java內(nèi)存泄露情況
JVM回收算法 是很復(fù)雜的,我也不知道他們怎么實現(xiàn)的,但是我只知道他們要實現(xiàn)的就是:對于沒有被引用的對象是可以回收的。所以你要造成內(nèi)存泄露就要做到:
持有對無用對象的引用!
不要以為這個很輕易做到,既然無用,你怎么還會持有它的引用? 既然你還持有它,它怎么會是無用的呢?
以下以堆棧更經(jīng)典這個經(jīng)典的例子來剖析。
Java代碼
public class Stack {
private Object[] elements=new Object[10];
private int size = 0;
public void push(Object e){
ensureCapacity();
elements[size++] = e;
}
public Object pop(){
if( size == 0)
throw new EmptyStackException();
return elements[--size];
}
private void ensureCapacity(){
if(elements.length == size){
Object[] oldElements = elements;
elements = new Object[2 * elements.length+1];
System.arraycopy(oldElements,0, elements, 0, size);
}
}
}
上面的原理應(yīng)該很簡單,假如堆棧加了10個元素,然后全部彈出來,雖然堆棧是空的,沒有我們要的東西,但是這是個對象是無法回收的,這個才符合了內(nèi)存泄露的兩個條件:無用,無法回收。
但是就是存在這樣的東西也不一定會導(dǎo)致什么樣的后果,假如這個堆棧用的比較少,也就浪費了幾個K內(nèi)存而已,反正我們的內(nèi)存都上G了,哪里會有什么影響,再說這個東西很快就會被回收的,有什么關(guān)系。下面看兩個例子。
例子1
Java代碼
public class Bad{
public static Stack s=Stack();
static{
s.push(new Object());
s.pop(); //這里有一個對象發(fā)生內(nèi)存泄露
s.push(new Object()); //上面的對象可以被回收了,等于是自愈了
}
}
因為是static,就一直存在到程序退出,但是我們也可以看到它有自愈功能 ,就是說假如你的Stack最多有100個對象,那么最多也就只有100個對象無法被回收其實這個應(yīng)該很輕易理解,Stack內(nèi)部持有100個引用,最壞的情況就是他們都是無用的,因為我們一旦放新的進(jìn)取,以前的引用自然消失!
例子2
Java代碼
public class NotTooBad{
public void doSomething(){
Stack s=new Stack();
s.push(new Object());
//other code
s.pop();//這里同樣導(dǎo)致對象無法回收,內(nèi)存泄露.
}//退出方法,s自動無效,s可以被回收,Stack內(nèi)部的引用自然沒了,所以
//這里也可以自愈,而且可以說這個方法不存在內(nèi)存泄露問題,不過是晚一點
//交給GC而已,因為它是封閉的,對外不開放,可以說上面的代碼99.9999%的
//情況是不會造成任何影響的,當(dāng)然你寫這樣的代碼不會有什么壞的影響,但是
//絕對可以說是垃圾代碼!沒有矛盾吧,我在里面加一個空的for循環(huán)也不會有
//什么太大的影響吧,你會這么做嗎?
}
要定位到行,代碼要debug編譯,至少要帶上行信息。
線程占用內(nèi)存高低,可以用jmap做heap dump出來給MomoryAnalysis分析他可以按線程統(tǒng)計,一般也可以用它來找出造成OOM的原因。
線程占用CPU,上述內(nèi)存的問題是一個方面,另外也可以jstack打線程棧來分析。Linux上ps -T -p可以看底層線程的CPU占用(Windows上需要額外按工具),記得線程編號可以在jstack打出來的線程棧中檢查。
網(wǎng)站欄目:java編寫搶占內(nèi)存代碼,java占內(nèi)存嗎
本文地址:http://jinyejixie.com/article22/hsihcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、微信公眾號、搜索引擎優(yōu)化、小程序開發(fā)、做網(wǎng)站、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)