作者yrulee (Face the truth.)
標題Re: [閒聊] 群暉面試心得
時間Fri Apr 17 21:08:34 2015
因為小弟過去有淺顯的研究一點點 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