成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試篇:虛擬機棧5連問?一聽心里就樂了

云計算 虛擬化
假如我們的棧幀不固定,設置為動態擴展的,那在我們的內存不足時,也就沒有足夠的內存來支持棧的擴展,這個時候就會出現OOM異常,即內存溢出問題。

[[399686]]

面試路上

“滴,滴滴......”師傅我們到哪了?我還要趕著面試呢。

「師傅:」 快了快了,下個路口就到了。真是服了這幫人了,不會開車凈往里湊。

聽著司機師傅的抱怨聲,不禁想起首打油詩:滿目尾燈紅,耳盈刺笛聲。心憂遲到久,頹首似雷轟。

一下車趕緊小跑就進了富麗堂皇的酒店,不不不,是商務樓,這大廳有點氣派,讓我有點想入非非呀。

面試經過

“咚咚咚”,“請進”。

「面試官:」 小伙子長得挺帥呀,年輕人就是有活力,來先做個簡單的自我介紹吧。

「阿Q:」 面試官你好,My name is “影流之主”,來自艾歐尼亞,是LOL中的最強中單(不接受反駁),論單殺沒有服過誰。我的口頭禪是“無形之刃,最為致命”,當然你也可以叫我阿Q,這是我的簡歷。

「面試官:」 阿Q,那咱也不寒暄了,直接切正題吧。看你jvm寫的知識點最多,那就先說一下你對虛擬機棧的理解吧。

「阿Q:」 內心OS:這波可以吹X了。咳...咳...虛擬機棧早期也叫java棧,是在jvm的運行時數據區存在的一塊內存區域。它是線程私有的,隨線程創建而創建,隨線程消亡而結束。

嗯。。。假裝想一下??

眾所周知,棧只有進棧和出棧兩種操作,所以它是一種快速有效的分配存儲方式。對于它來說,它不存在垃圾回收問題,但是它的大小是動態的或者固定不變的,因此它會存在棧溢出或者內存溢出問題......

「面試官:」 打斷一下啊,你剛才說會存在棧溢出和內存溢出問題,那你能分別說一下為什么會出現這種情況嗎?

「阿Q:」 可以可以,我們知道虛擬機棧由棧幀組成,每一個方法的調用都對應著一個棧幀的入棧。我們可以通過-Xss參數來設置棧的大小,假設我們設置的虛擬機棧大小很小,當我們調用的方法過多,也就是棧幀過多的話,就會出現StackOverflowError,即棧溢出問題。

假如我們的棧幀不固定,設置為動態擴展的,那在我們的內存不足時,也就沒有足夠的內存來支持棧的擴展,這個時候就會出現OOM異常,即內存溢出問題。

「面試官:」 嗯嗯(點頭狀),示意小伙子思路很清晰呀,那你剛才說到棧幀設置的太小會導致棧幀溢出問題,那我們設置的大點不就可以完全避免棧溢出了嘛。

「阿Q:」 一聽就是要給我挖坑呀,像我們一般都比較崇尚中庸之道,所以一聽到這種絕對的問題,必須機靈點:不不不,調整棧的大小只可以「延緩」棧溢出的時間或者說減少棧溢出的風險。

舉個例子吧

假如一個業務邏輯的方法調用需要5000次,但是此時拋出了棧溢出的錯誤。我們可以通過設置-Xss來獲取更大的棧空間,使得調用在7000次時才會溢出。此時調整棧大小就變得很有意義,因為這樣就會使得業務能正常支持。

那假如是有「死遞歸」的情況則無論怎么提高棧大小都會溢出,這樣也就沒有任何意義了。

「面試官:」 好的,那你看一下這個簡單的小程序,你能大體說一下它在內存中的執行過程嗎?

  1.  public void test() { 
  2.       byte i = 15; 
  3.       int j = 8; 
  4.       int k = i + j; 

來張圖,便于大家更好地理解

「阿Q:」 先把該代碼編譯一下,然后查看它的字節碼文件。如上圖中左邊所示,執行過程如下:

  1. 首先將要執行的指令地址0存放到PC寄存器中,此時,局部變量表和操作數棧的數據為空;
  2. 當執行第一條指令bipush時,將操作數15放入操作數棧中,然后將PC寄存器的值置為下一條指令的執行地址,即2;
  3. 當執行指令地址為2的操作指令時,將操作數棧中的數據取出來,存到局部變量表的1位置,因為該方法是實例方法,所以0位置存的是this的值,PC寄存器中的值變為3;
  4. 同步驟2和3將8先放入操作數棧,然后取出來存到局部變量表中,PC寄存器中的值也由3->5->6;
  5. 當執行到地址指令為6、7、8時,將局部變量表中索引位置為1和2的數據重新加載到操作數棧中并進行iadd加操作,將得到的結果值存到操作數棧中,PC寄存器中的值也由6->7->8->9;
  6. 執行操作指令istore_3,將操作數棧中的數據取出存到局部變量表中索引為3的位置,執行return指令,方法結束。

「面試官:」 內心OS:這小子貌似還可以呀。說的還不錯,那你能說一下方法中定義的局部變量是否線程安全嗎?

「阿Q:」 那我再用幾個例子來說一下吧。

  1. public class LocalParaSafeProblem { 
  2.  
  3.  
  4.     /** 
  5.      * 線程安全的 
  6.      * 雖然StringBuilder本身線程不安全, 
  7.      * 但s1 變量只存在于這個棧幀的局部變量表中, 
  8.      * 因為棧幀是每個線程獨立的一份, 
  9.      * 所以這里的s1是線程安全的 
  10.      */ 
  11.     public static void method01() { 
  12.         // 線程內部創建的,屬于局部變量 
  13.         StringBuilder s1 = new StringBuilder(); 
  14.         s1.append("a"); 
  15.         s1.append("b"); 
  16.     } 
  17.  
  18.     /** 
  19.      * 線程不安全 
  20.      * 因為此時StringBuilder是作為參數傳入, 
  21.      * 外部的其他線程也可以訪問,所以線程不安全 
  22.      */ 
  23.     public static void method02(StringBuilder stringBuilder) { 
  24.         stringBuilder.append("a"); 
  25.         stringBuilder.append("b"); 
  26.     } 
  27.  
  28.     /** 
  29.      * 線程不安全 
  30.      * 此時StringBuilder被多個線程同時操作 
  31.      */ 
  32.     public static void method03() { 
  33.         StringBuilder stringBuilder = new StringBuilder(); 
  34.         new Thread(() -> { 
  35.             stringBuilder.append("a"); 
  36.             stringBuilder.append("b"); 
  37.         }, "t1").start(); 
  38.  
  39.         method02(stringBuilder); 
  40.     } 
  41.  
  42.     /** 
  43.      * 線程不安全 
  44.      * 因為此時方法將StringBuilder返回出去了 
  45.      * 外面的其他線程可以直接修改StringBuilder這個引用了所以不安全 
  46.      */ 
  47.     public static StringBuilder method04() { 
  48.         StringBuilder stringBuilder = new StringBuilder(); 
  49.         stringBuilder.append("a"); 
  50.         stringBuilder.append("b"); 
  51.         return stringBuilder; 
  52.     } 
  53.  
  54.  
  55.     /** 
  56.      * StringBuilder是線程安全的 
  57.      * 此時stringBuilder值在當前棧幀的局部變量表中存在, 
  58.      * 其他線程無法訪問到該引用, 
  59.      * 方法執行完成之后此時局部變量表中的stringBuilder的就銷毀了 
  60.      * 返回的stringBuilder.toString()線程不安全 
  61.      * 最后的返回值將toString返回之后,其他線程可以操作而String本身是線程不安全的。 
  62.      */ 
  63.     public static String method05() { 
  64.         StringBuilder stringBuilder = new StringBuilder(); 
  65.         stringBuilder.append("a"); 
  66.         stringBuilder.append("b"); 
  67.         return stringBuilder.toString(); 
  68.     } 

看到這估計會有點繞,那我就總結一下吧:如果對象是在方法內部產生且在內部消亡,不會返回到外部就不存在線程安全問題;反之如果類本身線程不安全的話就存在線程安全問題。

「面試官:」 不錯不錯,有理有據,那你再說說你對堆內存的理解吧。

「阿Q:」 唉,今天太累了,說了一天這個了,不想說了。

「面試官:」 那好吧,那我們今天先到這吧,回去等通知吧。

本文轉載自微信公眾號「阿Q說代碼」,可以通過以下二維碼關注。轉載本文請聯系阿Q說代碼公眾號。

 

責任編輯:武曉燕 來源: 阿Q說代碼
相關推薦

2022-06-02 07:11:13

JVMJava

2021-09-29 09:00:19

Linux虛擬機CentOS

2023-02-07 06:47:58

JVM 模塊Java 虛擬機

2021-04-14 18:58:01

虛擬機 Java內存

2023-02-09 08:48:47

Java虛擬機

2023-07-27 06:59:30

Native線程數據結構

2020-06-03 15:07:01

Java虛擬機棧JVM

2018-09-11 14:47:51

面試Java虛擬機

2024-03-26 07:30:07

Java虛擬機源文件

2012-05-18 10:22:23

2022-06-06 08:00:59

Kvm虛擬機磁盤

2009-09-25 15:46:46

虛擬機軟件

2013-07-17 09:32:58

2010-07-26 09:02:38

2018-02-24 12:54:51

Java虛擬機面試

2020-10-21 08:16:37

Java基礎入門篇

2019-07-31 15:56:57

Jvm虛擬機Content

2011-04-06 09:29:51

vSphere虛擬機備份

2010-11-17 16:45:41

虛擬機

2021-07-12 07:08:52

TCP協議面試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲中午字幕 | 久久久一区二区三区 | 欧美一级免费看 | 亚洲视频在线观看 | 日韩在线电影 | 国产美女在线精品免费 | 伊人艹| 亚洲网站在线观看 | 狠狠躁躁夜夜躁波多野结依 | 性生活毛片 | a久久| 四虎影院免费在线播放 | 91精品久久久久久久久中文字幕 | 精品国产乱码一区二区三区a | 国产欧美日韩 | 中国一级大毛片 | 久久久不卡网国产精品一区 | 成人在线小视频 | 在线免费视频一区 | 国产成人在线视频免费观看 | 国产精品久久久久久久久久免费看 | 久久国产视频一区 | 99在线免费视频 | 久日精品 | 人人做人人澡人人爽欧美 | 中文字幕乱码亚洲精品一区 | av一区二区三区四区 | 新91视频网 | 亚洲人成人一区二区在线观看 | 国产精品久久久久久久久久久久久 | 久久久久国色av免费观看性色 | 亚洲精品一区二区三区在线观看 | 欧美国产精品一区二区三区 | 草草草影院| 99精品免费久久久久久久久日本 | 成人夜晚看av | 波多野结衣一区二区 | 天天操操操操操 | 精品久久久久久久久久久 | 中文字幕精品一区二区三区精品 | 欧美中文一区 |