本地线程分配缓冲_线程本地分配缓冲区

本地线程分配缓冲

最近,我一直在研究遭受严重性能问题的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

本地线程分配缓冲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 触发器计算总价,mysql’插入’触发器根据其他字段计算字段

我正在尝试创建一个触发器,它将根据用户输入的lat / lng列更新GEOMETRY列.我的触发器看起来像这样 –CREATE TRIGGER tbl.fooAFTER INSERT ON tbl FOR EACH ROWBEGINUPDATE tblSET coord Point(lng, lat)WHERE id NEW.id;END但是,当我插入一个带有lng,lat值的新行时,我收到以…

oracle连接外部数据库_使用Oracle验证外部数据

oracle连接外部数据库我经常在Corda Slack频道中闲逛,并尽可能回答问题。 我尝试回答的合理数量的问题与Oracle有关。 更具体地说,何时使用。 我觉得我可以回答,“当您需要验证可能经常更改的外部数据时使用Oracle”。 我大概在某个时候写了一…

macOS如何格式化移动硬盘和U盘

1.打开磁盘工具 2.在左侧选择要格式化的外置磁盘设备,接着在右上角点击【抹掉】 3.点击【抹掉】会弹出如下的对话框,在格式中建议选择 ExFAT 格式,这是一个在 Windows 和 macOS 都可以使用的文件系统格式 选择好要格式化的文件系统格式后&…

macOS查看IP地址的命令

查看内网的 IP 地址&#xff1a; [~]$ ipconfig getifaddr en0 192.168.30.25 # 或者 [~]$ ifconfig en0 en0: flags8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500options400<CHANNEL_IO>ether d4:61:9d:11:c2:94 inet6 fe80::cbc:309b:57a4:5cf6…

mysql注入漏洞语句,web安全之sql注入漏洞

概念通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。通俗地讲&#xff0c;它是利用现有应用程序&#xff0c;将(恶意)的SQL命令注入到后台数据库引擎执行的能力&#xff0c;它可以通过在Web表单中输入(恶意…

ssrs 基于表达式显示_基于表达式的访问控制

ssrs 基于表达式显示1.概述 今天&#xff0c;我们将回顾基于表达式的访问控制&#xff08;EBAC&#xff09;&#xff0c;基于角色的访问控制&#xff08;RBAC&#xff09;和基于属性的访问控制&#xff08;ABAC&#xff09;之间的区别&#xff0c;并将重点放在EBAC上。 2.什么…

macOS下载、安装、使用tomcat服务器及IntelliJ IDEA for Mac 如何集成、配置、运行tomcat

文章目录web 服务器软件tomcat如何下载安装 tomcatmacOS 下如何启动 tomcatWindows 启动 tomcat部署项目的方式直接将项目放到 webapps 目录下即可在 tomcat 的配置文件 server.xml 中进行配置部署在 tomcat 的 localhost 目录下通过 xml 文件完成部署IntelliJ IDEA 集成 tomca…

run spark pi_Spark Run本地设计模式

run spark pi现在&#xff0c;许多Spark应用程序已成为遗留应用程序&#xff0c;很难在本地进行增强&#xff0c;测试和运行。 Spark具有很好的测试支持&#xff0c;但仍有许多Spark应用程序不可测试。 当您尝试运行一些旧的Spark应用程序时&#xff0c;我将分享一个常见错误…

php 表单 同步,Jquery点击按钮 异步和同步提交表单

最近在开发一个jsp学生信息管理系统&#xff0c;由于刚刚接触jsp&#xff0c;遇到问题比较多&#xff0c;特此记录与大家分享。Jquery ajax提交表单到servlet示例前台部分代码&#xff1a;姓名学号 ajax提交表单代码&#xff1a;//增加学生&#xff0c;异步提交学生表单$(&q…

IntelliJ IDEA for Mac如何配置数据源(Data Source)和用户驱动(User Driver)及数据库控制台_数据源配置(Console)详解

文章目录直接添加数据源&#xff08;Data Source&#xff09;添加驱动和数据源&#xff08;Driver and Data Source&#xff09;驱动数据库控制台直接添加数据源&#xff08;Data Source&#xff09; 直接添加数据源&#xff0c;IDE 会默认指定数据库驱动&#xff0c;如下图所示…

app aws_服务网格:Istio和AWS App Mesh

app aws本周在AWS re&#xff1a;Invent上的重大公告之一是AWS App Mesh 。 在谈论它之前&#xff0c;让我们先看一下网格到底是什么…… 什么是服务网格&#xff1f; 服务网格是微服务体系结构的基础结构层。 它处理服务之间的通信问题&#xff0c;使该通信更加可见&#xf…

php screw 密钥,php-screw php代码加密工具用法(整理)

1、进入http://sourceforge.net/projects/php-screw/下载最新版本php_screw-1.5.tar.gz 解压安装&#xff1a; #tar zxf php_screw-1.5.tar.gz #cd php_screw-1.5 #vi php_screw.h 将 #define PM9SCREW “\tPM9SCREW\t” #define PM9SCREW_LEN 10 修改为任意字串,如&#xff1a…

IntelliJ IDEA如何部署项目、部署方式以及部署相关的操作

文章目录工件列表工件类型添加工件部署项目exploded 工件的部署war 工件的部署手动部署项目war 包部署exploded 部署部署有关的操作deploy/redeploy&#xff08;部署/重新部署&#xff09;rerun/run&#xff08;重启服务器/启动服务器&#xff09;Update resources&#xff08;…

php恒等符,php学习笔记(三)操作符与控制结构

php学习笔记(三)操作符与控制结构更新时间&#xff1a;2011年08月06日 20:09:31 作者&#xff1a;好久没更新了&#xff0c;这段时间挺忙的。下面继续php学习 之 操作符与控制结构&#xff1b;一&#xff0e;字符串插入为了给开发人员处理字符串值提供最大的灵活性&#xff0…

spring框架三层架构_Spring框架架构

spring框架三层架构这是Spring Framework Architecture的概述。 了解Spring Framework的各个组成部分如何组织以及如何相互联系。 如果您想了解什么是Spring框架及其功能&#xff0c;请阅读Spring框架简介 。 总览 Spring是一个模块化框架 。 它不是作为一个软件包或多个模块捆…

IntelliJ IDEA for Mac如何管理SDK/JDK,模块如何设置SDK/JDK?

文章目录管理 IDE 中的 SDK设置模块依赖的 SDK管理 IDE 中的 SDK 设置模块依赖的 SDK

php 数组是否属于迭代器,数组的迭代器属性Iterator介绍

[导读]数组默认有迭代器属性数组默认有迭代器属性var arr [111,222,333];var aa arr[Symbol.iterator]();aa.next(); // { value: 111, done: false }aa.next(); // { value: 222, done: false }aa.next(); // { value: 333, done: false }aa.next(); // { value: undefined,…

elk 聚合日志_使用ELK堆栈进行日志聚合

elk 聚合日志1.简介 随着微服务的使用&#xff0c;创建稳定的分布式应用程序和摆脱许多遗留问题变得很容易。 但是微服务的使用也带来了一些挑战&#xff0c; 分布式日志管理就是其中之一。 由于微服务是隔离的&#xff0c;因此它们不共享数据库和日志文件&#xff0c;因此实时…

Java对象如何实现比较规则

文章目录一、Comparable二、Comparator示例代码一、Comparable public interface Comparable 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序&#xff0c;类的 compareTo 方法被称为它的自然比较方法。 实现此接口的对象列表&#xff08;和数组…

python教材目录,python 目录

python在安装的时候&#xff0c;就自带了很多模块&#xff0c;我们把这些模块称之为标准库&#xff0c;其中&#xff0c;有一个是使用频率比较高的&#xff0c;就是 os 。这个库中方法和属性众多&#xff0c;有兴趣的看官可以参考官方文档&#xff1a;https://docs.python.org/…