溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【深入淺出-JVM】(7):棧上分配

發布時間:2020-07-16 09:25:16 來源:網絡 閱讀:346 作者:mousycoder 欄目:編程語言

概念

對那些作用于不會逃逸出方法的對象,在分配內存時,不在將對象分配在堆內存中,而是將對象屬性打散后分配在線程私有棧內存上,這樣隨著方法調用結束,棧上分配打散的對象也被回收掉,不在增加 GC 額外壓力。

Java 對象分配流程

【深入淺出-JVM】(7):棧上分配

示例

循環創建1000000000一個對象,阻止棧上分配

棧上分配條件:開啟逃逸分析 & 開啟標量替換

JVM 參數:

  • 棄用逃逸分析(不允許判斷對象是否可以逃逸出函數體)

-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:

【深入淺出-JVM】(7):棧上分配

分析:

本次發生的是 Minor GC,發生 GC 的原因是堆空間沒有合適的區域能夠存放數據結構導致的,堆從7651K 回收到 5603K,


感謝您的耐心閱讀,如果您發現文章中有一些沒表述清楚的,或者是不對的地方,請給我留言,您的鼓勵是作者寫作最大的動力。

作 者 : @mousycoder

原文出處 : http://mousycoder.com/thinking-in-jvm/7/

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女