看板 Soft_Job 關於我們 聯絡資訊
因為小弟過去有淺顯的研究一點點 JVM,加上自己是 Android Developer, 所以想分享一下過去自己的經驗給原po,看能不能幫上一點忙。 其實原po說的沒有錯:當 object 沒有被 reference 到時,的確是可以被 GC 掉的。 而主管問的也很好:難道你都是靠 JVM 來做記憶體管理嗎? 很明顯之間有認知上的差距,而小弟想解釋一下這中間的差距到底在哪裡。 GC 本身其實只是 "協助者" 的角色, 它充其量只是當記憶體不夠時,把沒有被 reference 到的 object 回收掉。 一般的情況下,GC 時需要 stop the world, interpreter 必須停止等待 GC 結束才可繼續執行。 而為了減少等待的時間,會把 heap 切成 young/old 等等的 generation, 因為 young generation 中 object 存活的時間可能比較短,有較高的可能性被回收掉。 所以若時常只 scan young generation 有較高的機率找到 garbage, 同時也可兼顧縮短 stop the world 的時間。 所以,GC 只是一個 tool/helper,它只負責清掃而已。 因此 GC 充其量只能說是記憶體回收,不是記憶體管理。 因為記憶體回收,只是記憶體管理一小部分。 記憶體回收只知道掃掉 garbage, 但實際上常常會有 garbage 因為 programmer 寫法不好而依舊被 strongly referenced, GC 不負責這樣的狀況,因此OOM就可能會出現。 記憶體管理應該要是一個更高階的概念, 工程師在撰寫程式時,清楚的知道每個使用的物件的生命週期, 並配合程式執行的各個狀態, 在使用者體驗與記憶體使用率上,做最有效率的配置與權衡。 好的記憶體回收機制是好的記憶體管理的一部分, 而好的記憶體管理是好的程式的一部分。 而好的程式是由好的 programmer 寫出來的。 雖然 GC 能夠協助 java programmer 在大部分的情況下不須擔心記憶體回收的工作, 但 programmer 依舊要負責把記憶體管理的工作做好, 因為撰寫程式的目的還是要幫使用者有效率的解決問題,而不是製造更多問題。 ※ 引述《sing10407 (阿U)》之銘言: : 群暉面試心得 : 打個記錄 雖然應該沒機會了 : 我情況很特別 : 就想要放棄今年的研替 找明年研替 但今年開始工作 : 因此我覺得應該沒什麼大公司要這樣的模式 但是我還是丟丟看履歷 : 基本上我累積專案還滿多 所以應該是不缺工作 只是想挑戰較高薪的看看 104就沒開履歷 : 國立普大資管碩 4+1 應該這學期會畢業 : 然後大學有兼職 大概有6~7個作品 有2~3個大型專案參與經驗 : 主要是java、c#、database方面較強 , web base 系統經驗較豐富 : 主要想挑戰群暉當然是想挑戰他的白板考coding : 因為我們大學部老師上課就是直接發紙下去寫.. 然後programming技巧教很多 : 被操過來的 所以白板coding對我來說算小case : 反而演算法和os忘光了(若是有準備考過研究所 特別複習過的 應該比較強) : 面試前一天 把作業拿出來看一下(linked list、stack、queue、sorting...) : 然後跟學弟拿了補習班的os翻一翻(因為大學修課滿熟 所以就很快就翻完了) : 就跑去考了 : 之前爬文好像大多都有四關?? : 不過我一關就回家了 也不知道是怎樣XD 可能是太弱吧 : 一開始自我介紹 ok : 再來他看到我的專案 請我隨便挑兩個介紹我在裡面幹嘛 : 因為已經是一兩年前的專案了 所以他問到很細節很細節 其實有點答不太出來 : ex. 我這個系統因為邏輯非常複雜 所以用了xxx技巧 : 然後面試官就會更進一步問說複雜在哪 我在解釋時只能憑印象 : 所以讓面試官聽起來好像覺得沒那麼複雜 : 然後就聊天中扯到process 他就問我說thread和process差在哪 : 因為這個題目在爬群暉面試文中就有了 所以pass : 然後他又會更進階問 : 比如說什麼是race condition、有什麼發法可以解決、什麼是semophore等等 : 都還算在我的OS腦海資料庫範圍內 都還算回答得90%對 : 接下來就是白板考試 : 考官要叫我寫stack : 我就說我要用linked list 他說為什麼 我說我對資結就array和linked list比較熟 : linked list不用事先assign空間 : 然後就用java 寫完 : 大部分都對 只有小地方錯 面試官也沒多說什麼 : 但是他對我new 完object後 使用完沒有去release空間 去控制memory好像很有意見 : 我解釋說 jvm會將程式後來沒有reference到的物件自動release掉 : 他就說: 所以你就靠jvm來幫你管理記憶體嗎? : 感覺對方很重視管理記憶體 但是我沒寫過c 所以沒真正操作過記憶體管理 : 在後來有問我進來後想要做哪部分 我就說web base較熟悉 : 但如果到其他的部份我也可以很快上手 : 接下來有問到說 假設你今天要幫一個人做同步備份 你會怎麼做 : 我回答是raid 他就叫我解釋 我就只能回答出raid1而已 : 然後他問我會用什麼方法幫user做備份 假設家中的nas壞掉的話 : 這個問題真的難倒我 因為我不知道他是要問很技術的還是什麼 : 後來他細心解釋後 說例如XX protocal 或 ftp等等的 : 我就說可能是 ftp : 然後面試就到這邊 : 過了幾分鐘就有一個人說1個月內若有二次面試會在通知 : 不過根據我爬文 好像沒有當面給offer就沒了 或者最晚都是隔一個小時就有二面電話 : 心得: : 其實整體表現我覺得還ok : 只是只有一關滿意外的 我猜可能是上面提及的特殊研替身分 : 留個參考給要去面試的 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.171.64.229 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1429276116.A.B19.html
sing10407: 推 04/17 21:34
dennis2030: 推 04/17 21:48
kkoala: 推 04/17 22:00
Jimmy0301: 所以請問 JAVA 有free memory 的機制嗎? 04/17 22:11
likesp999: 推 04/17 22:24
lallbas: 推 04/17 22:55
ntddt: 推觀念~ 04/17 23:13
iceberg: 推 04/17 23:18
wuliou: 從C++跑去寫Java完全沒想這麼多… 04/17 23:51
jammy50605: 推 04/18 01:11
Stdout: 推 04/18 01:18
hSATAC: 推 04/18 02:13
ianlin45: 請問不靠GC Java還能怎麼釋放記憶體? 04/18 09:24
Ghosso: 推觀念 所以這題目該如何回答好? java要怎麼自己釋放 04/18 09:58
Ghosso: ? 04/18 09:58
discoby: 還是得回歸到乞丐中的王者 還是乞丐 04/18 10:01
discoby: 除了gc你沒有任何其他方法可以主動釋放記憶體 04/18 10:02
discoby: 至於不浮濫生成物件 多利用物件池的概念來重用 那也是不 04/18 10:05
discoby: 錯的記憶體管理方式 04/18 10:05
jenocool: 推 04/18 17:09
ianlin45: 那面試官的問題也很靠盃啊 照原po描述 04/18 20:02
ianlin45: java物件是要怎麼自己release? 04/18 20:03
sealight: no, minor GC不需stop the world, 盡量將物件生命週期縮 04/18 22:04
sealight: 短, 避免進行major GC, 才是正常做法。 04/18 22:05
sealight: 當然create new instance有其overhead, 但我想對初學者 04/18 22:10
sealight: 來說,可以先朝物件生命週期縮短著手,再開始學習pool概念 04/18 22:10
starericc: 了解了JAVA BIG O了解不了 職場政治的BIG O 也是沒用 04/19 10:23
timeflying: Java的GC本來就是要Programmer專注在自己的商業邏輯上 06/06 12:43
timeflying: 而不是還要程式設計師還要擔心memmory release就像 06/06 12:44
timeflying: 遠古時候,iphone new的物件都要自己release,現在都 06/06 12:45
timeflying: 是用ARC 在管理,自己管理還容易出錯。能交給電腦做的 06/06 12:45
timeflying: 就應該交給電腦,電腦還會做的比你還好。 06/06 12:46