概念

对那些作用于不会逃逸出方法的对象,在分配内存时,不在将对象分配在堆内存中,而是将对象属性打散后分配在线程私有栈内存上,这样随着方法调用结束,栈上分配打散的对象也被回收掉,不在增加 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):栈上分配的更多相关文章

  1. JVM之对象分配:栈上分配 & TLAB分配

    1. Java对象分配流程 2. 栈上分配 2.1 本质:Java虚拟机提供的一项优化技术 2.2 基本思想: 将线程私有的对象打散分配在栈上 2.3 优点: 2.3.1 可以在函数调用结束后自行销毁 ...

  2. LWJGL3的内存管理,第二篇,栈上分配

    LWJGL3的内存管理,第二篇,栈上分配 简介 为了讨论LWJGL在内存分配方面的设计,本文将作为该系列随笔中的第二篇,用来讨论在栈上进行内存分配的策略,该策略在 LWJGL3 中体现为以 Memor ...

  3. Java对象栈上分配

    转自 https://blog.csdn.net/o9109003234/article/details/101365108 在学习Java的过程中,很多喜欢说new出来的对象分配一定在对上: 其实不 ...

  4. 如何限制一个类只在堆上分配和栈上分配(StackOnly HeapOnly)

    [本文链接] http://www.cnblogs.com/hellogiser/p/stackonly-heaponly.html [题目] 如何限制一个类只在堆上分配和栈上分配? [代码]  C+ ...

  5. Java中的栈上分配

    博客搬家自https://my.oschina.net/itsyizu/blog/ 什么是栈上分配 栈上分配是java虚拟机提供的一种优化技术,基本思想是对于那些线程私有的对象(指的是不可能被其他线程 ...

  6. php7 改为从栈上分配内在的思路

    php7的特点是规则上不从堆上分配内存,改为从栈上分配内存, 因为有些场景是从堆上分配内在后,还要手动释放内存,利用栈分配内在快的特点,在有需要的时候,再在堆上分配内在 但是栈上分配的内存,不能返回, ...

  7. 【LWJGL3】LWJGL3的内存分配设计,第一篇,栈上分配

    简介 LWJGL (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java绑定库.<我的世界> ...

  8. 【小实验】rust的数组是在堆上分配还是在栈上分配的呢?

    先看代码: fn main(){ let v = [1,2,3,4,5]; let addr = &v[0] as *const i32 as usize; println!("ar ...

  9. 栈上分配存储器的方法 alloca 抽样

    声明一个局部变量,必须分配在堆栈上,但有或没有它的方法 当然,,那是 alloca 下面的代码显示了可变长度参数转换,alloca 要使用 int main(int argc, char ** arg ...

随机推荐

  1. Ubuntu 16.04 下Redis Cluster集群搭建

    实际操作如下: 准备工作 版本:4.0.2 下载地址:https://redis.io/download 离线版本:(链接: https://pan.baidu.com/s/1bpwDtOr 密码: ...

  2. linux下设置git代理访问.

    有时候克隆仓库巨慢无比,需要设置代理. 一般情况下 proxychains 可以搞定的. 但是某些情况,如go 安装模块的时候是调用git的.这个时候proxchains就不行了. go 也可以通过设 ...

  3. java集合类-Set接口

    Set集合 Set集合中的对象不按特定的方式排序,只是简单的把对象放入集合中,但是不能包含重复对象. Set集合由Set接口和Set接口的实现类组成,Set接口继承与于Collection接口 Set ...

  4. elasticsearch _create api创建一个不存在的文档

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/create-doc.html当我们索引一个文档, 怎么确认我们正在创建一个完全 ...

  5. jinja2-模版简介

    一 简介 在Flask中,调用render_template来对模版进行渲染,使用render_template,只需要导入这个API就可以,from flask import render_temp ...

  6. Maven版本问题导致的 unable to import maven project, see logs for details. 问题

    新电脑安装了基础环境后,jdk,maven也都安装好了,idea安装后,导入Java项目一切正常,但是idea中code一直导入import依赖包出现问题,错误提示:unable to import ...

  7. [js]vue小结

    vue基础 - vue是一个渐进式框架 vue (视图渲染) components(路由机制) vue-router(路由管理) vuex (状态管理) vuecli (构建工具) - 库和框架 库如 ...

  8. MySql数据库的下载和安装卸载

    下载:到mysql官网下载 卸载 1.找到mysql安装目录下的my.ini文件 2.找到配置项datadir datadir="D:/develop /MySQL/MySQL Server ...

  9. Flask-Login详解

    Flask-Login详解 关于Flask登录认证的详细过程请参见拙作<<使用Flask实现用户登陆认证的详细过程>>一文,而本文则偏重于详细介绍Flask-Login的原理, ...

  10. springboot和hadoop2.7.7集成开发

    1.本人在腾讯云安装hadoop2.7.7,详细安装请看以前的博客 2.pom.xml文件 <?xml version="1.0" encoding="UTF-8& ...