對那些作用于不會逃逸出方法的對象,在分配內(nèi)存時,不在將對象分配在堆內(nèi)存中,而是將對象屬性打散后分配在線程私有棧內(nèi)存上,這樣隨著方法調(diào)用結束,棧上分配打散的對象也被回收掉,不在增加 GC 額外壓力。
我們提供的服務有:成都網(wǎng)站設計、成都網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、四子王ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的四子王網(wǎng)站制作公司
循環(huán)創(chuàng)建1000000000一個對象,阻止棧上分配
棧上分配條件:開啟逃逸分析 & 開啟標量替換
JVM 參數(shù):
-server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGC
使用 server 模式棄用逃逸分析(-server -XX:-DoEscapeAnalysis),設置堆空間大小10m,初始空間10m,打印 GC 日志
-server -Xmx10m -Xms10m -XX:+PrintGC -XX:-EliminateAllocations
以上二選一
代碼:
package com.mousycoder.mycode.happy_jvm;
/**
* @version 1.0
* @author: mousycoder
* @date: 2019-06-11 16:55
*/
public class OnStackTest {
public static class User{
public int id = 0;
public String name = "";
}
public static void alloc(){
User u = new User();
u.id = 5;
u.name = "mousycoder";
}
public static void main(String[] args) {
long b = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
alloc();
}
long e = System.currentTimeMillis();
System.out.println(e-b);
}
}
輸出:
[GC (Allocation Failure) 7651K->5603K(9728K), 0.0003680 secs]
[GC (Allocation Failure) 7651K->5603K(9728K), 0.0003829 secs]
[GC (Allocation Failure) 7651K->5603K(9728K), 0.0003809 secs]
[GC (Allocation Failure) 7651K->5603K(9728K), 0.0003731 secs]
[GC (Allocation Failure) 7651K->5603K(9728K), 0.0003286 secs]
VisualGC:
分析:
本次發(fā)生的是 Minor GC,發(fā)生 GC 的原因是堆空間沒有合適的區(qū)域能夠存放數(shù)據(jù)結構導致的,堆從7651K 回收到 5603K,
感謝您的耐心閱讀,如果您發(fā)現(xiàn)文章中有一些沒表述清楚的,或者是不對的地方,請給我留言,您的鼓勵是作者寫作最大的動力。
作 者 : @mousycoder
原文出處 : http://mousycoder.com/thinking-in-jvm/7/
文章標題:【深入淺出-JVM】(7):棧上分配
當前鏈接:http://aaarwkj.com/article18/jejsgp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、標簽優(yōu)化、響應式網(wǎng)站、網(wǎng)站營銷、搜索引擎優(yōu)化、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)