菜鳥裹裹面試————神一般的面試完后才知道是阿里旗下的三大子公司之一


首先面試官一上來就問:你知道菜鳥裹裹嗎?答曰:聽說過。不敢說不知道。

1、首先問你懂JVM嗎?答曰:了解一點。然后就問(1)棧和堆的區別(PS:靜態代碼塊和構造函數的運行順序,以及父類構造函數和子類構造函數的運行順序),(2)JVM運行機制,(3)一個HelloWorld.java運行出HelloWorld的流程:

(1)棧和堆的區別

 java程序運行的關鍵是棧和堆。它們是把內存形象的分為棧內存和堆內存。

a.棧是運行時的單位,堆時存儲單位

b.棧內存中存儲着句柄(對象的引用),堆內存中存儲着new出來的對象實例。而且在實例化的時候建立句柄對內容的指向關系.

c.程序運行,首先訪問句柄,然后調用具體內容

d.軟件設計的角度看,棧代表了處理邏輯,而堆代表了數據。這樣分開,使得處理邏輯更為清晰,分而治之的思想。

e. 棧因為運行時的需要,比如保存系統運行的上下文,需要進行地址段的划分。由於棧只能向上增長,因此就會限制住棧存儲內容的能力。而堆不同,堆中的對象是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。        Java 的堆是一個運行時數據區,類的對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。        堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。        棧的優勢是,存取速度比堆要快,僅次於寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量(int, short, long, byte, float, double, boolean, char)和對象句柄。

f.java中變量在內存中的分配

1、類變量(static修飾的變量):在程序加載時系統就為它在堆中開辟了內存,堆中的內存地址存放於棧以便於高速訪問。靜態變量的生命周期--一直持續到整個"系統"關閉

2、實例變量:當你使用java關鍵字new的時候,系統在堆中開辟並不一定是連續的空間分配給變量(比如說類實例),然后根據零散的堆內存地址,通過哈希算法換算為一長串數字以表征這個變量在堆中的"物理位置"。 實例變量的生命周期--當實例變量的引用丟失后,將被GC(垃圾回收器)列入可回收“名單”中,但並不是馬上就釋放堆中內存

3、局部變量:局部變量,由聲明在某方法,或某代碼段里(比如for循環),執行到它的時候在棧中開辟內存,當局部變量一但脫離作用域,內存立即釋放 

附:java的內存機制 

Java 把內存划分成兩種:一種是棧內存,另一種是堆內存。在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java 會自動釋放掉為該變量分配的內存空間,該內存空間可以立即被另作它用。

  堆內存用來存放由 new 創建的對象和數組,在堆中分配的內存,由 Java 虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或者對象之后,還可以在棧中定義一個特殊的變量,讓棧中的這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或者對象,引用變量就相當於是為數組或者對象起的一個名稱。引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外后被釋放。而數組和對象本身在堆中分配,即使程序運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身占據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變為垃圾,不能在被使用,但仍然占據內存空間不放,在隨后的一個不確定的時間被垃圾回收器收走(釋放掉)。

  這也是 Java 比較占內存的原因,實際上,棧中的變量指向堆內存中的變量,這就是 Java 中的指針!

2、Linux了解嗎?答曰:了解一點。然后就是問題:你看過Linux內核嗎?答曰:沒有。看過Hadoop源碼嗎?答曰沒有。我只是在上面用一些工具(yum,vim,tcpreplay,snort,Hadoop生態系統安裝配置。Linux服務器系統安裝)

3、機器學習算法HMM,馬爾科夫鏈,SVM,Fpgrowth算法的優化,可以對其頻繁模式挖掘過程中采用HMM模型一樣訓練出一個模型,然后在數據不斷增長的情況下,怎么優化。講講馬爾科夫鏈是什么,HMM模型的過程,用處(預測)。看過矩陣論嗎?答曰:沒有。那你知道協方差(對兩個模型的選擇,比較哪個模型更適合場景應用),特征向量,特征值。。。。。算法不需要代碼實現,需要知道原理,怎么應用。

 4、針對一年的日志數據,怎么找出其中排名前10的異常數據。

答曰:

模板)6、海量數據分布在100台電腦中,想個辦法高校統計出這批數據的TOP10。
方案1:
s  在每台電腦上求出TOP10,可以采用包含10個元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我們首先取前10個元素調整成最小堆,如果發現,然后掃描后面的數據,並與堆頂元素比較,如果比堆頂元素大,那么用該元素替換堆頂,然后再調整為最小堆。最后堆中的元素就是TOP10大。
s 求出每台電腦上的TOP10后,然后把這100台電腦上的TOP10組合起來,共1000個數據,再利用上面類似的方法求出TOP10就可以了。

 

不知道這算不算是阿里的面試。。。要是的話 讓我找塊牆撞了吧。。。答得這么渣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM