Re: [閒聊] 群暉面試心得

看板Soft_Job (軟體人)作者 (Face the truth.)時間11年前 (2015/04/17 21:08), 編輯推噓19(19013)
留言32則, 19人參與, 最新討論串2/2 (看更多)
因為小弟過去有淺顯的研究一點點 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

04/17 21:34, , 1F
04/17 21:34, 1F

04/17 21:48, , 2F
04/17 21:48, 2F

04/17 22:00, , 3F
04/17 22:00, 3F

04/17 22:11, , 4F
所以請問 JAVA 有free memory 的機制嗎?
04/17 22:11, 4F

04/17 22:24, , 5F
04/17 22:24, 5F

04/17 22:55, , 6F
04/17 22:55, 6F

04/17 23:13, , 7F
推觀念~
04/17 23:13, 7F

04/17 23:18, , 8F
04/17 23:18, 8F

04/17 23:51, , 9F
從C++跑去寫Java完全沒想這麼多…
04/17 23:51, 9F

04/18 01:11, , 10F
04/18 01:11, 10F

04/18 01:18, , 11F
04/18 01:18, 11F

04/18 02:13, , 12F
04/18 02:13, 12F

04/18 09:24, , 13F
請問不靠GC Java還能怎麼釋放記憶體?
04/18 09:24, 13F

04/18 09:58, , 14F
推觀念 所以這題目該如何回答好? java要怎麼自己釋放
04/18 09:58, 14F

04/18 09:58, , 15F
04/18 09:58, 15F

04/18 10:01, , 16F
還是得回歸到乞丐中的王者 還是乞丐
04/18 10:01, 16F

04/18 10:02, , 17F
除了gc你沒有任何其他方法可以主動釋放記憶體
04/18 10:02, 17F

04/18 10:05, , 18F
至於不浮濫生成物件 多利用物件池的概念來重用 那也是不
04/18 10:05, 18F

04/18 10:05, , 19F
錯的記憶體管理方式
04/18 10:05, 19F

04/18 17:09, , 20F
04/18 17:09, 20F

04/18 20:02, , 21F
那面試官的問題也很靠盃啊 照原po描述
04/18 20:02, 21F

04/18 20:03, , 22F
java物件是要怎麼自己release?
04/18 20:03, 22F

04/18 22:04, , 23F
no, minor GC不需stop the world, 盡量將物件生命週期縮
04/18 22:04, 23F

04/18 22:05, , 24F
短, 避免進行major GC, 才是正常做法。
04/18 22:05, 24F

04/18 22:10, , 25F
當然create new instance有其overhead, 但我想對初學者
04/18 22:10, 25F

04/18 22:10, , 26F
來說,可以先朝物件生命週期縮短著手,再開始學習pool概念
04/18 22:10, 26F

04/19 10:23, , 27F
了解了JAVA BIG O了解不了 職場政治的BIG O 也是沒用
04/19 10:23, 27F

06/06 12:43, , 28F
Java的GC本來就是要Programmer專注在自己的商業邏輯上
06/06 12:43, 28F

06/06 12:44, , 29F
而不是還要程式設計師還要擔心memmory release就像
06/06 12:44, 29F

06/06 12:45, , 30F
遠古時候,iphone new的物件都要自己release,現在都
06/06 12:45, 30F

06/06 12:45, , 31F
是用ARC 在管理,自己管理還容易出錯。能交給電腦做的
06/06 12:45, 31F

06/06 12:46, , 32F
就應該交給電腦,電腦還會做的比你還好。
06/06 12:46, 32F
文章代碼(AID): #1LCGNKiP (Soft_Job)
文章代碼(AID): #1LCGNKiP (Soft_Job)