- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
场景
我们正在开发一种 API,可以在多线程环境中每小时处理大约 2-3 百万次点击。服务器是 Apache Tomcat 7.0.64。
我们有一个包含大量数据的自定义对象,我们称它为 XYZDataContext。当收到新请求时,我们将 XYZDataContext 对象关联到请求上下文。每个请求一个 XYZDataContext 对象。我们将并行生成各种线程来满足从 XYZDataContext 对象收集数据/处理数据到 XYZDataContext 对象的请求。我们将并行处理事物的线程需要访问此 XYZDataContext 对象,并且为了避免在应用程序的任何地方将此对象传递给各种对象/方法/线程,我们正在考虑使它成为线程本地的。线程将使用来自 XYZDataContext 对象的数据,并将更新该对象中的数据。当线程结束时,我们计划将生成的子线程中更新的 XYZDataContext 对象中的数据合并到主线程的 XYZDataContext 对象中。
我的问题:
这是一个好方法吗?
线程池风险 - Tomcat 服务器将维护一个线程池,我读到将 threadlocal 与线程池一起使用是一场灾难,因为线程不是按说进行 GC 处理而是被重用,因此对 threadlocal 对象的引用不会进行 GC 处理,并且会导致在内存中存储我们不再需要的巨大对象,最终导致 OutOfMemory 问题...
除非它们被引用为弱引用,以便立即进行 GC。
我们使用的是 Java 1.7 开放的 JDK。我看到了 ThreadLocal 的源代码,虽然 ThreadLocalMap.Entry
是一个弱引用,但它没有与 ReferenceQueue 相关联,并且 Entry 构造函数的注释说“由于未使用引用队列,陈旧只有当表开始空间不足时,才能保证删除条目。"
我想这在缓存的情况下效果很好,但在我们的情况下并不是最好的。我希望立即对线程本地 XYZDataContext 对象进行 GC。 ThreadLocal.remove()
方法在这里会生效吗?有没有什么办法可以在下一次 GC 运行时强制清空空间?
这是使用 ThreadLocal 对象的正确方案吗?或者我们是否在滥用线程局部概念并在不应该使用它的地方使用它?
最佳答案
我的直觉告诉我你走错了路。由于您已经有一个中央上下文对象(一个用于所有线程)并且您希望同时从多个线程访问它,我会选择一个托管上下文对象并提供线程安全方法来访问它的单例。
我强烈建议同时进行所有操作,而不是操作上下文对象的多个属性。最好的情况是您只传递一个对象,其中包含您要在上下文对象中更改的所有属性。
例如
Singleton.getInstance().adjustContext(ContextAdjuster contextAdjuster)
您可能还想考虑使用线程安全队列,用线程中的 ContextAdjuster
对象填充它,最后在 Context 的线程中处理它。
谷歌搜索 Java 中的并发、阻塞和非阻塞队列。我相信您会找到大量示例代码。
关于java - 在这种高流量的多线程场景中,我应该使用 ThreadLocal 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41918081/
我正在寻找一种方法来创建根据价格选择我的产品的过滤器(选择下拉菜单)。 我知道这样的查询是完全可能的: SELECT * FROM products ORDER BY price ASC SELECT
函数参数中或显示尺寸时(高度,宽度)的顺序是否有约定? 最佳答案 我不知道大量的语言,但我使用过的语言(宽度,高度)。它更适合沿着 (x, y) 坐标线。 关于language-agnostic -
在我的表单中,我让用户输入房间的长度高度和宽度以获得 m2、m3 和瓦特的计算值。但是用户也应该能够直接输入 height 和 m2 来获取值。我尝试了很多语法,但 if else 不能正常工作。我知
我在 Elasticsearch 中创建了一个索引,看起来像 {"amazingdocs":{"aliases":{},"mappings":{"properties":{"Adj Close":{"
我有以下功能,我需要清除数据库中的所有图片列并移动到文件系统。当我一次性完成这一切时,内存太多并且会崩溃。我切换到递归函数并执行 20 次写入和批量操作。 我需要为大约 6 个表执行此操作。我的 Re
我正在编写一个函数来计算 PI 的值,并将其作为 double 值返回。到目前为止,一切都很好。但是一旦函数到达小数点后14位,它就不能再保存了。我假设这是因为 double 有限。我应该怎么做才能继
2020年是中国CDN行业从98年诞生到今天快速发展的第二十四年,相关数据显示,全国感知网速持续上扬,达到了3.29兆/秒,标志着在宽带中国的政策指导下,中国的网速水平正在大步赶上世界发达国家的水平
在 aerospike 集合中,我们有四个 bin userId、adId、timestamp、eventype,主键是 userId:timestamp。在 userId 上创建二级索引以获取特定用
$('#container').highcharts('Map', { title : { text : 'Highmaps basic demo'
有没有办法显示自定义宽度/高度的YouTube视频? 最佳答案 在YouTube网站上的this link中: You can resize the player by editing the obj
我使用 Highcharts ,我想在 Highcharts 状态下悬停时制作动态不同的颜色。 正如你可以看到不同的颜色,这就是我做的 var usMapChart , data = [] ; va
在所有节点上运行 tpstats 后。我看到很多节点都有大量的 ALL TIME BLOCKED NTR。我们有一个 4 节点集群,NTR ALL TIME BLOCKED 的值为: 节点 1:239
我发现 APC 上存在大量碎片 (>80%),但实际上性能似乎相当不错。我有 read another post这建议在 wordpress/w3tc 中禁用对象缓存,但我想知道减少碎片是否比首先缓存
对于我的脚本类(class),我们必须制作更高/更低的游戏。到目前为止,这是我的代码: import random seedVal = int(input("What seed should be u
我发现 APC 上存在大量碎片 (>80%),但实际上性能似乎相当不错。我有 read another post这建议在 wordpress/w3tc 中禁用对象缓存,但我想知道减少碎片是否比首先缓存
对于我的脚本类(class),我们必须制作更高/更低的游戏。到目前为止,这是我的代码: import random seedVal = int(input("What seed should be u
我已经 seen >2 字节的 unicode 代码点,如 U+10000 可以成对编写,如 \uD800\uDC00。它们似乎以半字节 d 开头,但我只注意到了这一点。 这个 split Actio
有人可以帮我理解为什么我的饼图百分比计算不正确吗?看截图: 根据我的计算,如 RHS 上所示,支出百分比应为 24.73%。传递给 Highcharts 的值如下:- 花费:204827099.36-
我阅读了有关该问题的所有答案,但我还没有找到任何解决方案。 我有一个应用程序,由我的 api 服务器提供。 Wildfly 8.1 和 Mysql 5.6。当查看时间到来时(Wildfly 服务器连接
我正在用选定的项目创建圆形导航。当用户单击任何项目时,它将移动到定义的特定点。一切都很好,除了当你继续点击项目时,当动画表现不同并且项目在 360 度圆中移动并且它被重置直到你重复场景时,我希望它
我是一名优秀的程序员,十分优秀!