問題1:JAVA內(nèi)存分配的方法?
方法一:指針碰撞幽七,對(duì)象所需要的內(nèi)存在類加載完成以后便可以確定,假設(shè)JAVA堆中內(nèi)存是絕對(duì)規(guī)整的离福,所有用過的內(nèi)存都放在一邊杖狼,空閑的放到另一邊,中間放著一個(gè)指針作為分界點(diǎn)术徊,分配內(nèi)存是通過指針的移動(dòng)本刽。使用Serial、ParNew等帶有Compact過程的收集器時(shí)赠涮,系統(tǒng)采用指針碰撞子寓。
方法二:空閑列表,如果JAVA堆中的內(nèi)存并不是規(guī)整的笋除,而是相互交錯(cuò)斜友,虛擬機(jī)通過維護(hù)一個(gè)列表來記錄哪些內(nèi)存是可用的,哪些內(nèi)存是不可用的垃它。分配內(nèi)存時(shí)從列表中找到一塊足夠大的空間來分配實(shí)例鲜屏。使用CMS這種基于Mark-Sweep算法收集器時(shí),采用空閑列表国拇。
問題2:如何解決高并發(fā)情況下的內(nèi)存分配洛史?
如在給A分配內(nèi)存時(shí),指針還沒來得及修改酱吝,對(duì)象B又同時(shí)使用了原來的指針來分配內(nèi)存情況也殖。解決這種問題有兩種方案;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?方案1:對(duì)分配內(nèi)存空間的動(dòng)作進(jìn)行同步處理务热,實(shí)際上虛擬機(jī)采用CAS配上失敗重試的方式保證更新操作的原子性忆嗜。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 方案2:內(nèi)存分配的動(dòng)作按照線程劃分在不同的空間之中進(jìn)行,即每個(gè)線程在JAVA堆中預(yù)先分配一小塊內(nèi)存崎岂,成為TLAB捆毫,哪個(gè)線程要分配內(nèi)存,就在哪個(gè)線程的TLAB上分配冲甘,只有TLAB用完并分配新的TLAB時(shí)绩卤,才需要同步鎖定