美文网首页
【深入浅出-JVM】(7):栈上分配

【深入浅出-JVM】(7):栈上分配

作者: mousycoder | 来源:发表于2019-07-15 16:44 被阅读0次

概念

对那些作用于不会逃逸出方法的对象,在分配内存时,不在将对象分配在堆内存中,而是将对象属性打散后分配在线程私有栈内存上,这样随着方法调用结束,栈上分配打散的对象也被回收掉,不在增加 GC 额外压力。

Java 对象分配流程

示例

循环创建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:

分析:

本次发生的是 Minor GC,发生 GC 的原因是堆空间没有合适的区域能够存放数据结构导致的,堆从7651K 回收到 5603K,


感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,您的鼓励是作者写作最大的动力。

作 者 : @mousycoder

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

相关文章

  • 【深入浅出-JVM】(7):栈上分配

    概念 对那些作用于不会逃逸出方法的对象,在分配内存时,不在将对象分配在堆内存中,而是将对象属性打散后分配在线程私有...

  • JVM对象分配之栈上分配 & TLAB分配

    Java对象分配流程 栈上分配技术: 是java虚拟机提供的一项优化技术,它的基本思想是,对于那些线程私有对象(指...

  • 内存分配策略

    详解JVM对象分配内存 对象的内存分分配主要是指对上分配(也可栈上分配),对象主要分配在新生代Eden区,如果启动...

  • JVM对象的栈上分配

    前言 并不是所有对象都需要在堆中分配 栈上分配 Java虚拟机中,几乎所有创建的对象都是在堆中进行分配,并且分配在...

  • jvm深入理解

    一 概要(本文主要参考深入浅出jvm) 1.什么是jvm? 2.jvm是如何分配内存的? 3.jvm是如何保证垃圾...

  • JVM常用参数配置

    本文主要内容: Trace跟踪参数 堆的分配参数 栈的分配参数 JVM其他参数 既然学习JVM,阅读GC日志是处理...

  • JVM学习笔记与调优实战(三):Java对象内存分配与逃逸分析

    标签: JVM 1、Java对象的分配: 栈上分配线程私有小对象无逃逸支持标量替换无需调整(虚拟机自动优化,无需调...

  • JVM的逃逸分析

    对象一定分配在堆中吗? JVM通过逃逸分析,那些逃不出方法的对象会在栈上分配。 什么是逃逸分析? EscapeAn...

  • jvm 基础篇-(2)- 对象分配及回收♻️(-XX:-Hand

    对象分配规则 堆内存: 分配策略: 1、jvm内存宏观分配策略 虚拟机栈分配<<<<<传送门 2、堆内分配策略 1...

  • java对象分配过程

    1.编译器通过逃逸分析判断对象是在栈上分配还是堆上分配,如果是堆上分配则进入下一步。(开启逃逸分析需要设置jvm参...

网友评论

      本文标题:【深入浅出-JVM】(7):栈上分配

      本文链接:https://www.haomeiwen.com/subject/moznkctx.html