堆与栈的区别:

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

问题:java中的对象一定在堆上分配吗?

不一定,在Java中,典型的对象不再堆上分配的情况有两种:TLAB和栈上分配。

首先原因:

我们知道堆是由所有线程共享的,既然如此那它就是竞争资源,对于竞争资源,必须采取必要的同步,所以当使用new关键字在堆上分配对象时,是需要锁的。既然有锁,就必定存在锁带来的开销,而且由于是对整个堆加锁,相对而言锁的粒度还是比较大的,当对象频繁分配时,不免影响效率。

所以对于某些特殊情况,可以采取避免在堆上分配对象的办法,以提高对象创建和销毁的效率。

TLAB分配:

JVM在内存新生代Eden Space中开辟了一小块区域,由线程私有,称作TLAB(Thread-local allocation buffer),默认设定为占用Eden Space的1%。在Java程序中很多对象都是小对象且用过即丢,它们不存在线程共享也适合被快速GC,所以对于小对象通常JVM会优先分配在TLAB上,并且TLAB上的分配由于是线程私有所以没有锁开销。因此在实践中分配多个小对象的效率通常比分配一个大对象的效率要高。

栈上分配:

JVM在Server模式下的逃逸分析可以分析出某个对象是否永远只在某个方法、线程的范围内,并没有“逃逸”出这个范围,逃逸分析的一个结果就是对于某些未逃逸对象可以直接在栈上分配,由于该对象一定是局部的,所以栈上分配不会有问题。

对象非栈上分配的思想和启发:

对象不在堆上分配主要的原因还是堆是共享的,在堆上分配有锁的开销。无论是TLAB还是栈都是线程私有的,私有即避免了竞争(当然也可能产生额外的问题例如可见性问题),这是典型的用空间换效率的做法。

在实践中,类似的做法还有很多,例如Hadoop中对于Map过程在节点的本地内存中处理,直到最后Reduce过程再合并数据。对于任务之间可以分解到不同线程、进程的情况,就可以采用类似的做法用空间换效率,对吞吐率的提升有很大帮助。

摘自:https://hesey.wang/2011/07/object-allocation-on-non-heap.html

无招胜有招之Java进阶JVM(二)相关推荐

  1. 【数据湖存储】数据湖的终极奥秘,无招胜有招

    作为海量数据存储与分析的重要承载方式的数据湖,从2011年概念诞生至今,已经发展了9个年头.而数据湖是什么?又能为数字化经济带来什么?<阿里云数据湖存储解决方案蓝皮书>将为您揭开数据湖的终 ...

  2. 无招胜有招——面向对象设计模式随笔,

    最近在学习面向对象设计模式,GOF的23种设计模式大概看了一遍,简单总结一下,设计模式主要分为三种模式,分别是创建模式,结构模式,行为模式. 回过头想一下具体有哪些模式,在什么情况下用什么设计模式,好 ...

  3. "无招胜有招"nbsp;史上最全的互…

    课前秀:三个段子 第一个段子:一个毫无餐饮行业经验的人开了一家餐馆,仅两个月时间,就实现了所在商场餐厅坪效第一名;VC投资6000万,估值4亿元人民币,这家餐厅是雕爷牛腩. 只有12道菜,花了500万 ...

  4. Dirty Approach之无招胜有招

    每个网站,几乎都有"新闻"的模块.在中国独有的ICP--Internet Copy and Past--模式下,多数站点也靠"转贴"手段汇集新闻信息.如果说新浪 ...

  5. 无招胜有招之Java进阶JVM(五)垃圾回收

    垃圾检测.回收算法 垃圾收集器一般必须完成两件事:检测出垃圾:回收垃圾.怎么检测出垃圾?一般有以下几种方法: 引用计数法:给一个对象添加引用计数器,每当有个地方引用它,计数器就加1:引用失效就减1. ...

  6. 无招胜有招之Java进阶JVM(九)HotSpot

    Java 版本1.8.0_121 Java SE 运行环境:也就是我们所说的jre. 至于hotspot:(两个字 讲究) #翻译的官方文档 Java HotSpot虚拟机是Java SE平台的核心组 ...

  7. 无招胜有招之Java进阶JVM(八)类加载机制

    6.1.ClassLoader的两个作用和一个任务 作用:1.将Class加载到JVM中2.审视每一个类应该由谁加载. 任务:将Class字节码重新解析成统一要求的对象格式 6.2上级委托接待机制又称 ...

  8. 无招胜有招之Java进阶JVM(七)对象模型

    Java对象前言: 在jvm的内存结构中,对象保存在堆中,而我们在对对象进行操作时,其实操作的是对象的引用. Java对象包含三个部分: 一个Java对象可以分为三部分存储在内存中,分别是:对象头(H ...

  9. 无招胜有招之Java进阶JVM(四)内存模型plus

    一.计算机内存模型: 在多CPU的系统中,每个CPU都有多级缓存,一般分为L1.L2.L3缓存,因为这些缓存的存在,提供了数据的访问性能,也减轻了数据总线上数据传输的压力,同时也带来了很多新的挑战,比 ...

  10. 无招胜有招之Java进阶JVM(三)内存模型

    为什么要有内存模型 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情.要说计算机的内存模型,就要说一下一段古老的历史,看一 ...

最新文章

  1. 【Spring】ioc的常用注解
  2. 突发 | Yann LeCun卸任!Facebook变天,做AI不能落地是不成了
  3. java的rsa作用_java 中RSA的方式实现非对称加密的实例
  4. mysql事务在提交后才发送给数据库执行_从一个线上问题分析binlog与内部XA事务提交过程...
  5. android setinputtype光标,Android屏蔽软键盘并且显示光标的实例详解
  6. Datatable删除行的Delete和Remove方法介绍
  7. screen命令简介
  8. java 运行class 传参_JAVA 不同Class传值问题
  9. python静态变量和静态方法_python的静态成员变量、实例成员变量、静态方法、类方法、实例方法...
  10. BugkuCTF-WEB题give_up
  11. html中用js调用ASP文件 实现静态页面动态显示
  12. Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现
  13. php获取当前url完整地址
  14. 炼油化工常用英文缩写
  15. 响应面法 matlab,怎么用MATLAB编写响应面优化的程序?
  16. Echars 如何描绘世界地图
  17. 任天堂switch底座带网口全新方案分享
  18. 【ABC 132 E】Hopscotch Addict(最短路)
  19. Leetcode1859:将句子排序
  20. JVM---垃圾回收概述及相关概念

热门文章

  1. 牛客多校6 - Harmony Pairs(数位dp)
  2. SPOJ - COT Count on a tree(LCA+主席树+离散化)
  3. ZOJ - 3777 Problem Arrangement(状压dp)
  4. HDU - 5451 Best Solver(循环群+矩阵快速幂)
  5. c/c++ 两种文件流用法
  6. ZOJ2112(区间动态求第K大)
  7. EXE和SYS通信(ReadFile WriteFile) 其他方式
  8. C++ 私有成员变量的理解
  9. Flink 在又拍云日志批处理中的实践
  10. Go命令行库Cobra的使用