对象空间分配流程如下:
 
针对这个流程,分别解释一下每一个选项的使用场景。

栈上分配:

栈上分配的基础在于逃逸分析,逃逸分析可以得到三种对象的逃逸状态。
  • 全局逃逸:一个对象的引用逃出了方法或者线程。
  • 参数级逃逸:在方法调用过程中传递对象的引用到另一个方法。
  • 没有逃逸:一个可以进行标量替换的对象。
基于分析结果,一般有如下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. Java对象回收流程

    一.可回收对象判断 引用计数器算法:为对象放置一个引用计数器,当对象被引用时则计数器加一,如果一个对象的计数器标识为零的时候,则表明该对象可被回收.这种方法比较简单,但无法解决对象之间互相引用的情况. ...

  2. 【Java基础】Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 package ...

  3. Java类的加载和对象创建流程的详细分析

    相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下: package com.test; public ...

  4. java 对象的初始化流程(静态成员、静态代码块、普通代码块、构造方法)

    一.java对象初始化过程 第一步,加载该类,一个java对象在初始化前会进行类加载,在JVM中生成Class对象.加载一个类会进行如下操作,下面给出递归描述.(关于Class对象详见反射 点击这里) ...

  5. java对象与XML相互转化

    起因 最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的. 目的 ...

  6. Activiti工作流学习(一)部署对象和流程定义

    一.前言 前一段时间在工作中,使用了流程审批,对api的调用非常不熟悉,都是调用别人写好的接口在界面上进行显示,基本了解了流程审批的主要步骤,现对流程审批进行学习,主要是调用api进行CRUD操作,感 ...

  7. Java对象在JVM中的生命周期

          当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时 ...

  8. Java对象的创建

    学了很久的java,是时候来一波深入思考了.比如:对象是如何在JVM中创建,并且被使用的.本文主要讲解下new对象的创建过程.要想更深入的了解建议去认认真真的看几遍<深入理解Java虚拟机> ...

  9. 【JAVA零基础入门系列】Day8 Java的控制流程

    什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...

随机推荐

  1. MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 的解决方法

    解决方法如下:  方法 1.在线修改提高允许的max_connection_errors数量: A. 登录Mysql数据库查看max_connection_errors: mysql>show ...

  2. 解决 idea template jsp模板中使用自定义路径 模板不显示问题

    ${} 是一个模板中的关键字,所以建立时需要用 \ 注释即可正常显示  ${APP_PATH}

  3. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

  4. Python数据结构 将列表作为栈和队列使用

    列表作为栈使用 Python列表方法使得列表作为堆栈非常容易,最后一个插入,最先取出(“后进先出”).要添加一个元素到堆栈的顶端,使用 append() .要从堆栈顶部取出一个元素,使用 pop()  ...

  5. 《深入分析Java Web技术内幕》读书笔记之JVM内存管理

    今天看JVM的过程中收获颇丰,但一想到这些学习心得将来可能被遗忘,便一阵恐慌,自觉得以后要开始坚持做读书笔记了. 操作系统层面的内存管理 物理内存是一切内存管理的基础,Java中使用的内存和应用程序的 ...

  6. Java基础知识:Java实现Map集合二级联动4

    comboBox.setModel(new DefaultComboBoxModel(getProvince())); // 添加省份信息 final JLabel label = new JLabe ...

  7. phpldapadmin具体设置

    一.需求    1.属性隐藏 只显示用户名,部门(因为是单OU设计为了做区分),登录密码 2.属性顺序显示 部门>用户名>登录密码 3.使用UID可以登陆 用户可以使用账户(自己的名字)登 ...

  8. ICPC 沈阳 Problem C

    题意 求n的全排列中将前k个数排序后最长公共子序列>=n-1的个数 思考 我们先把最后可能产生的结果找出来,再找有多少种排列能构成这些结果 设排列为s S like 1,2,3,...,n , ...

  9. .net mvc5 不同view()的视图 代码

    public class Test { public int id { set; get; } public string name { set; get; } } public ActionResu ...

  10. 亚马逊AWS业务副总裁:如何在基础设施上降成本

    腾讯科技 林靖东 11月17日编译 亚马逊Amazon Web Services业务的副总裁.著名工程师詹姆斯汉密尔顿(James Hamilton)在AWS re:Invent大会上解释了公司是如何 ...