[問題] memory leak in c++ & java

作者: ireullin (raison detre)   2015-06-18 11:11:36
請問一下各位
關於memory leak的情形
在c/c++的狀況中
如果配置了記憶體但是沒有釋放
最後該程式結束後
記憶體是否還會歸還作業系統
還是從此這段記憶體就無法再使用
直到下一次的作業系統重新開機
在早期公司的前輩們都是這樣說的
但是後來看了一些文章之後
好像並不是這樣
而java中的如果產生了memory leak
通常是該物件已經沒有在使用
但是有其他的物件還參照著這個指標的狀況
造成GC無法正常回收
請問在何種狀況下記憶體才會歸還
1. 該java程式結束後
2. 整個jvm結束
3. 必須等到作業系統重開
我在網路上查了很多
但是各家說法好像都不一樣
所以想請問一下大家的意見
作者: azureblaze (AzureBlaze)   2015-06-18 11:36:00
1.一般作業系統程式結束就會還2. java板在隔壁但我相信是1.記憶體卡到重開是很嚴重的問題,現代OS不會讓你這樣搞
作者: ctrlbreak   2015-06-18 11:57:00
對OS而言JVM才是應用程式 XD
作者: azureblaze (AzureBlaze)   2015-06-18 12:14:00
可是JVM裡的OS理論上也會處理吧
作者: uranusjr (←這人是超級笨蛋)   2015-06-18 13:51:00
一個 JVM 通常就是對應到一個 Java application, 所以對 Java 而言前兩個其實基本上對等; 對於 OS 而言 JVM本身就是一個程式, 所以和 C/C++ 狀況一樣, 會不會在程式結束回收要看 OS, 前面 free() 討論串有稍微討論到
作者: Killercat (殺人貓™)   2015-06-18 15:44:00
第一個問題 非保護模式的幾乎是定番,一定中獎但是保護模式的OS通常都能正確歸還第二個問題雖然是java 不過查"weak reference java"C++有對應的std::weak_ptr可以用請養成善用weak reference的好習慣 善待自己也善待別人
作者: johnhmj (耗呆肥羊)   2015-06-18 16:56:00
weak_ptr since C++11 http://goo.gl/CfrdpB
作者: ireullin (raison detre)   2015-06-18 17:11:00
請問非保護模式是指?
作者: Killercat (殺人貓™)   2015-06-18 17:16:00
DOS跟大多數的MCU都是非保護模式,請google保護模式....其實我一時忘了名詞 非保護模式應該直接叫真實模式主流OS都是保護模式 包含Linux OSX跟Windows另外 C++11之前 也有boost::weak_ptr能用
作者: tinlans ( )   2015-06-18 23:18:00
去 MCU 廠上班就會知道死了... XD
作者: WPC001 (好悶, 迷惘~~)   2015-06-19 20:31:00
C++11的weak ptr跟這有啥關係? 你真的清楚甚麼是weak_ptr?C++... boost不是唯一... 也沒有一定要用
作者: Killercat (殺人貓™)   2015-06-19 20:57:00
這是相對於shared_ptr對gc的(原理不同 結果一樣)app結束回收是另外一件事,他一共問了三件事情weak_ptr指的是他講的「java memory leak」歸納一下 他問了1.記憶體app結束釋放 2.java的"leak"跟3.Java程式結束何時記憶體會「歸還」而我回答的是2 順便跟他說這相當於c++11的weak_ptr而普通reference可以比做shared_ptr

Links booklink

Contact Us: admin [ a t ] ucptt.com