本地线程分配缓冲

最近,我一直在研究遭受严重性能问题的Java应用程序。 在许多问题中,真正引起我注意的一个问题是新对象的分配速度相对较慢(应用程序分配了大量的相当大的对象)。 后来发现,原因是大量的分配发生在TLAB之外。

什么是TLAB?

在Java中,新对象在Eden中分配。 这是线程之间共享的内存空间。 如果考虑到多个线程可以同时分配新对象,那么显然需要某种同步机制。 怎么解决呢? 分配队列? 某种互斥锁? 即使这些是不错的解决方案,也有更好的解决方案。 这是TLAB发挥作用的地方。 TLAB代表线程本地分配缓冲区,它是Eden内部的一个专为线程分配的区域。 换句话说,只有一个线程可以在该区域中分配新对象。 每个线程都有自己的TLAB。 因此,只要在TLAB中分配对象,就不需要任何类型的同步。 在TLAB内部进行分配很简单
指针缓冲 (这就是为什么有时称为指针缓冲分配)的原因
–因此将使用下一个空闲内存地址。

TLAB变得满满的

可以想象,TLAB不是无限的,在某些时候它开始变满。 如果线程需要分配一个不适合当前TLAB的新对象(因为它几乎已满),则会发生两件事:

  • 线程获取新的TLAB
  • 该对象在TLAB之外分配

JVM根据几个参数决定将要发生的情况。 如果选择了第一个选项,则线程的当前TLAB将“退休”,并且分配将在新的TLAB中完成。 在第二种情况下,分配是在Eden的共享区域中完成的,这就是为什么需要某种同步的原因。 通常,同步是有代价的。

物体太大

默认情况下,将针对每个线程分别动态调整TLAB的大小。 根据Eden的大小,线程数及其分配率重新计算TLAB的大小。 更改它们可能会影响TLAB的规模-但是,由于分配率通常会有所不同,因此没有简单的公式可以解决。 当线程需要分配一个永远无法容纳在TLAB中的大对象(例如,大数组)时,它将在Eden的共享区域中分配,这又意味着同步。 这正是我的应用程序中正在发生的事情。 由于某些对象太大,因此它们从未在TLAB中分配。

在TLAB之外分配一些对象并不一定是一件坏事–这是在次要GC之前发生的典型情况。 问题是,与TLAB内部相比,TLAB外部有大量分配。 在这种情况下,有两个可用选项:

  • 缩小物体
  • 尝试调整TLAB尺寸

就我而言,手动调整TLAB大小不是最佳选择。 众所周知,只有很少的对象类型在TLAB之外分配。 通常,修复代码是最好的选择。 在我将对象显着缩小之后,它们已装入TLAB,并且TLAB内部分配给TLAB外部分配的比率恢复正常。

翻译自: https://www.javacodegeeks.com/2019/03/thread-local-allocation-buffers.html

本地线程分配缓冲

本地线程分配缓冲_线程本地分配缓冲区相关推荐

  1. 线程基础知识_线程生命周期_从JVM内存结构看多线程下的共享资源

    线程生命周期 线程状态 New: 线程创建(new Thread()) Runnable: 线程可运行(thread.start()), 注: 调用start并不一定是运行状态, 可能在等待CPU调度 ...

  2. 如何保证线程安全有序性_线程安全性-原子性-可见性-有序性

    一.相关定义: 线程安全类:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些进程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安 ...

  3. Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)

    文章目录 1.线程的定义,进程和线程的关系 2.Linux下的线程 Linux原生线程库(pthread库pthread.h) 线程的优点 线程的私有数据 3.线程控制 ①创建线程(pthread_c ...

  4. java 线程亲缘性_线程的调度、优先级和亲缘性

    每隔20ms左右,Windows要查看当前存在的所有线程内核对象.在这些对象中,只有某些对象被视为可以调度的对象.Windows选择可调度的线程内核对象中的一个,将它加载到CPU的寄存器中,它的值是上 ...

  5. java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?

    在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...

  6. sae mysql 同步本地_MYSQL入门之三_将本地MySQL数据导入SAE数据库_MySQL

    bitsCN.com MYSQL入门之三_将本地MySQL数据导入SAE数据库 1. MySQL字符集 MySQL的默认字符集是latin1,将本地MySQL库导出成sql,再导入到SAE的MySQL ...

  7. 易语言mysql线程池数量_线程池最佳线程数量到底要如何配置?

    前言 对应从事后端开发的同学来说,线程是必须要使用了,因为使用它可以提升系统的性能.但是,创建线程和销毁线程都是比较耗时的操作,频繁的创建和销毁线程会浪费很多CPU的资源.此外,如果每个任务都创建一个 ...

  8. 线程停止继续_线程不是你想中断就能中断

    这是我2021年的第2篇原创文章,原汁原味的技术之路尽在Jerrycodes 为什么不强制停止 如何用 interrupt 停止线程 sleep 期间能否感受到中断 停止线程的方式有几种 总结 启动线 ...

  9. threadpooltaskexecutor线程池使用_线程池的理解及使用

    1.为什么要使用线程池 线程池由任务队列和工作线程组成,它可以重用线程来避免线程创建的开销,在任务过多时通过排队避免创建过多线程来减少系统资源消耗和竞争,确保任务有序完成: 线程池的好处: 1,因为线 ...

最新文章

  1. linux刷新指定URL脚本,【图片】linux下crontab定时执行本地脚本和定时访问指定url【不要牧师吧】_百度贴吧...
  2. 相机标定 matlab opencv ROS三种方法标定步骤(1)
  3. linux获取url中文内容_Chrome OS 似乎将在Linux 的方向上更进一步
  4. thinkphp5 404 file_put_contents 无法打开流:权限被拒绝
  5. RHEL6关闭IPv6
  6. SolrJ管理SolrCloud
  7. maven实战总结,工作中常见操作
  8. LINUX的“脏奶牛”
  9. 对称加密-DES加密
  10. 活动目录管理中常用的脚本(一)
  11. L1-042 日期格式化-PAT团体程序设计天梯赛GPLT
  12. ios共享账号公众号_我的世界 minecraft 国际版 非网易版 ios下载账号分享 公众号 iphone ipad...
  13. 人人商城小程序消息服务器配置,如何设置小程序模板消息?
  14. Python分词统计
  15. RTKLIB_E.4GNSS卫星星历表和时钟
  16. Windows无法启动 VMware Workstation server服务解决方法
  17. jsp文件上传图片到服务器
  18. php命令行生成文件,php命令行生成与读取配置文件
  19. 学习电商项目的经验总结(三)
  20. 水溶性CdseTe ZnS量子点

热门文章

  1. 牛客题霸 [进制转换] C++题解/答案
  2. STL的可持久化数组
  3. 牛客网 【每日一题】6月11日题目精讲 背包
  4. 小G的项链(Manacher)
  5. P5591-小猪佩奇学数学【单位根反演】
  6. P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】
  7. P5666-[CSP-S2019]树的重心【树状数组】
  8. 牛客挑战赛43C-最优公式【二分】
  9. nssl1454-最短路【并查集,贪心】
  10. ssl1341-Asteroids【最大匹配,最小点覆盖,图论】