对象空间分配流程如下:

针对这个流程,分别解释一下每一个选项的使用场景。

栈上分配:

栈上分配的基础在于逃逸分析,逃逸分析可以得到三种对象的逃逸状态。

  • 全局逃逸:一个对象的引用逃出了方法或者线程。
  • 参数级逃逸:在方法调用过程中传递对象的引用到另一个方法。
  • 没有逃逸:一个可以进行标量替换的对象。

基于分析结果,一般有如下3种优化:

  • 堆分配对象变成栈分配对象,栈分配的对象,不需要gc,在方法离开此方法栈后,栈空间的数据随之销毁。
  • 消除同步,逃逸分析可以判断出某个对象是否始终只被一个线程访问,如果只被一个线程访问,那可以取消对其的同步保护,可以较大的提升并发程度与性能。
  • 矢量替代,如果发现对象的内存存储结构不需要连续进行的话,就可以将对象的部分甚至全部都保存在CPU寄存器内。

逃逸分析:

开启:-XX:+DoEscapeAnalysis

关闭:-XX:-DoEscapeAnalysis

标量替换:

开启:-XX:+EliminateAllocations

关闭:-XX:-EliminateAllocations

锁消除:

开启:-XX:+EliminateLocks

关闭:-XX:-EliminateLocks

在jdk1.8都是默认开启的。

栈空间的大小,对栈上分配有一定的影响,但栈空间更多的是影响线程调用栈深度与可以创建的线程数量。

TLAB分配:

一般的对象分配内存,都是在新生代进行空间申请的。在多个线程都在申请空间时,每次对象分配都必须进行同步。竞争激烈的场合分配的效率又会进一步下降。TLAB是一个存在于eden区的线程独享内存区域,主要用于降低在新生代分配对象时的内存竞争,提升对象分配的效率。

默认开启,也可以使用-XX:+UseTLA参数主动开启。

TLAB的refill操作包括如下几个动作:

  • 将当前TLAB抛弃,这个过程中最重要的是将TLAB末尾尚未分配给Java对象的空间分配成一个filler object;
  • 从Eden区新分配一块空白的空间(可能存在失败);
  • 将新分配的空间范围记录到ThreadLocalAllocBuffer里。

TLAB refill不成功,就会触发YGC。

Java对象空间分配流程相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( C/C++ 设置 Java 对象字段 | 查找字段 | 设置字段 )

    文章目录 I . 设置 Java 对象 属性 流程 II . 查找 Java 对象属性 ( GetFieldID ) III . 设置 Java 对象属性 ( SetXxxField ) I . 设置 ...

  2. 深入理解JVM之对象分配流程

    Java对象分配流程 栈上分配 参考: https://www.cnblogs.com/BlueStarWei/p/9358757.html (讲的很好) https://blog.csdn.net/ ...

  3. Java 并发编程解析 | 如何正确理解Java对象创建过程,我们主要需要注意些什么问题?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 从接触 Java 开发到现在,大家对 Java 最直观的印象是什么呢?是它宣传的 &qu ...

  4. java对象的内存分配流程

    了解对象的内存分配流程对常见内存溢出问题.jvm优化有很大作用. 内存分配原则 对象栈内分配 通常理解new对象都在堆中分配存储空间,但是当(通过逃逸分析 确定)对象仅在方法内使用而未被外部访问的时候 ...

  5. 【JVM】Java对象创建的流程步骤

    · 本文摘要 · 罗列Java创建对象的各种方式: · 讲解Java对象创建的流程步骤: 一.Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = ...

  6. 韩顺平Java学习笔记P245对象创建流程分析P246this关键字-P250

    P245对象创建流程分析 //1.先在方法区加载方法类 //2.在堆里开空间一个存放age,一个存放name //3.(先默认初始化有默认值age=0,name=null,再显示初始化age=90,n ...

  7. Java对象分配原理

    Java对象模型: OOP-Klass模型 在正式探讨JVM对象的创建前,先简单地介绍一下hotspot中实现的Java的对象模型.在JVM中,并没有直接将Java对象映射成C++对象,而是采用了oo ...

  8. sqlserver2008未将对象引用设置到对象的实例_JVM | Java对象的创建、存储和访问详解...

    引言   Java程序员都知道如何创建对象,不就是一个Person person = new Person()的语句就解决了么?然而,我们只知道new,却对于底层如何实现对象的创建.如何存储到内存中去 ...

  9. 谈谈Java对象的生命周期

    经过前面的分析 ,我们现在来看一下创建的对象到底是什么东西,并且完整的总结一下一个对象从创建到回收到底经过了哪些阶段. 1 对象的创建 对象创建的主要流程:  1.类加载检查 虚拟机遇到一条new指令 ...

最新文章

  1. 4种事务特性,5种隔离级别,7种传播行为
  2. 你研究过单例么?这样写单例效率最高.
  3. Discuz!NT博客非官方升级!!
  4. Docker最全教程——从理论到实战(七)
  5. 10年老电脑如何提速_中国电信宣布将对宽带免费提速,最高500Mbps
  6. kafka topic 一段时间不消费_全网最通俗易懂的 Kafka 入门
  7. 黄子韬现身助力公益 百度推出听障儿童手语翻译小程序
  8. 2021 年各家大厂的 AI Lab 现状如何?
  9. 进制转换演示及其Python示例
  10. python jupyter
  11. ubuntu16.04 pytorch 安装
  12. 修改docx表格_文件杂乱怎么办?批量整理修改文件名我就用它
  13. element tree不刷新视图_安卓从入门到进阶第五章(视图查看)
  14. mysql gui tools ojdbc14.jar_转 OJDBC驱动版本区别 [ojdbc14.jar,ojdbc5.jar跟ojdbc6.jar的区别]...
  15. SpringDataJPA调用存储过程实例
  16. PMP-强化练习题一(180题答案及解析)
  17. php两段音频合成一个,使用PHP合并MP3文件的类,兼容php4、php5
  18. 【qstock量化】数据篇之宏观指标和财经新闻文本
  19. VS2015官方下载地址(个人免费版)
  20. js 页面打印,兼容单个打印和分页批量打印,自定义页眉和简单页脚

热门文章

  1. 考研英国文学复习要点
  2. FC-AE-ASM节点卡(支持 FC-AE-ASM 协议)
  3. 1114 计算营业额
  4. Arpg战斗系统-技能学习篇
  5. 【计算机毕业设计】停车场管理系统
  6. CWnd::WindowProc的理解
  7. 如何编制试算平衡表_在实际工作中,余额试算平衡通过编制试算平衡表进行。()...
  8. 适合大学生用的网课作业搜题找答案的神器分享~~
  9. 【Mac SSH】SSH连接工具finalShell推荐
  10. AI语音外呼机器人是如何帮助电销行业获客