java低延迟_像Java这样的C ++具有低延迟

java低延迟

总览

以前,我写过一篇有关Java之类的C的文章。 这是我以前遇到的术语。 但是,经过思考,我认为像Java这样的C ++是一个更好的术语,因为您仍在使用OOP惯例(不是C惯例),但是您需要投入更多的精力来管理和回收内存。

我现在支持的术语是“低级” Java编程。

低延迟和“自然” Java

许多低延迟系统仍使用我称为自然Java的程序进行编程。 在大多数情况下,这是最简单,最有效的方法。 当您具有大堆大小和低延迟要求时,这些问题才真正开始,因为它们不能很好地协同工作。

如果您有一个已建立的程序,并且重写是不合理的,则需要Zing之类的东西,它具有真正的并发收集器。 尽管您可能会看到1-4 ms的最严重的停顿,但这与非实时系统一样好。 有传言说RedHat正在产生并发收集器,但是正如Oracle在G1中发现的那样,编写有效的低延迟是非常困难的。 G1工作正常,只是不适合低延迟交易(例如,暂停时间为1毫秒),我不确定是否会如此。

如果可以重写关键组件,尤其是出于性能以外的原因而正在考虑这样做,则可以显着提高性能,但可以使用更像C ++或C的低级编程。语言是指您正在使用与那些语言相同的技巧,并且已经使用了很长时间,但是使用Java。

为什么用Java进行低级编程?

主要原因是集成和易于支持。 低级Java与自然Java代码非常紧密地集成在一起。 所有的Java工具都可以很好地使用它,并且它仍然是跨平台的(至少是跨OS的)。某些底层技术是JVM特定的,例如它们可以在OpenJDK / HotSpot上工作,但不能在IBM的JVM上工作,反之亦然。 他们可能会起作用,但很多都无济于事。 例如,在HotSpot上使用不安全可能会更快,但在Android上会明显慢。

低级Java编程的另一个好处是,经验丰富的Java开发人员发现使用它相对容易。 他们可能会发现很难从头开始编写,但是如果使用隐藏更多细节的库,则可以有效地使用它。

低级Java有哪些注意事项?

延迟目标

除非您在99.9%的时间内运行时间少于1毫秒,否则您现在可以认为1毫秒的延迟不是那么快。 Java中最快的系统通常约为100微秒,甚至低于包装箱外部的20微秒。

如何处理高吞吐量

对于交易系统,建议您将等待时间设置得尽可能低,并且吞吐量通常足够。 例如,编年史可以以一个线程的持续速率以最大爆发次数持续完整的Opera提要。 这是可能的,因为编年史的潜伏期很短。 一条很小的4字节消息的平均延迟为7纳秒。 即使JVM在下一行崩溃时,它也将保留。 在这一点上吞吐量不是一个问题。

对于反向测试,低延迟是不够的。 这是因为您想要做的是在不到一秒钟的时间内(理想情况下)重播数月的数据。 在这种情况下,您需要高度的并行性以及能够在短时间内重播大量数据的能力。 为此,我使用了内存映射文件,这些文件对我需要的数据进行了预装查询。 如果这些文件为二进制格式并适合主内存,则可以非常快速地跨线程重复访问它们。

处理GC。

垃圾收集暂停会使您减速,因此最快的方法是构建引擎是不使用休息时间。 相反,您给自己一个预算,这是您可以合理拥有的最大伊甸园大小。 这可能是24 GB的Eden。 如果您花了一整天的时间来填满,一天之内就不会收集,即使是次要的收集也是如此。 假设您可以在晚上或周末停下来几秒钟,则可以在预定时间执行完全GC,而GC不再是问题。

即使这样,我还是建议尽量减少垃圾并定位内存访问模式,以最大程度地提高L1 / L2效率,从而可以将性能提高2-5倍。 L3缓存至少比L1慢10倍,并且如果您不给L1填充垃圾(正如许多Java程序一样),您的程序将更快,更一致地运行。

将共享内存用于IPC

这有两个优点。

  1. 您可以保留所有事件的记录,以及整天的时间安排和微不足道的开销。 因为可以保留更多数据,所以可以在外部,下游或重现错误来重现系统的确切状态。 这为您提供了基于数据驱动的海量测试,您可以通过测试系统实时提供生产数据,以查看ti在运行之前的行为。
  2. 实际上,它可能比其他方法快得多。 一条微小的消息的平均写入延迟为7纳秒,并且在不到100纳秒的时间内对另一个进程可见。

固定芯

许多人已经尝试过固定核心,但并没有太大的区别。 这可能是由于a)应用程序的抖动过大,几乎没有关系,或者b)然后没有固定到隔离的内核。 我发现如果绑定到隔离的内核,最坏情况的延迟会从2毫秒下降到10微秒,但固定到非隔离的内核似乎根本没有帮助。

忙碌中

您不希望关键线程进行上下文切换,而避免这种情况的一种方法是永远不要放弃内核或CPU。 这可以通过在固定的隔离内核上忙于等待来完成。 我所做的一件事是使用隔离的核心
a)对最关键的线程有选择地禁用超线程,而其余的则保留。
b)通过不对“垃圾”内核进行超频来更多地使隔离内核超频。 通过限制不需要最大速度的磁芯产生的热量,可以达到这一目的。 例如,假设您有一个十六进制内核,则不让内核0,2,4保持超频,而超频内核1,3,5则不使用HT,比整个插槽多使用10%。 我认为超频内核在芯片上并不相邻,因此它们不太可能过热。

更大的地址空间集合

Chronicle和OpenHFT的直接存储的主要功能是它们允许访问64位大小。 (由于OS / CPU的限制,技术上只能使用48位)这意味着您可以将TB大小的数据集作为一个集合进行管理,而该集合具有在Java内存中本地的数十亿条记录/摘录。 这样甚至可以避免JNI障碍或系统调用来降低应用程序速度。

结论

如果您的应用程序将其90%的时间用在其代码的10%或80/20中,则可以使用“自然” Java编写90%的代码,或者使用第三方库。 但是,如果您用低级Java编写10%的代码,则可以显着提高性能。

参考: Vanilla Java博客上的JCG合作伙伴 Peter Lawrey提供了Java 等C ++的低延迟特性。

翻译自: https://www.javacodegeeks.com/2013/07/c-like-java-for-low-latency.html

java低延迟

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

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

相关文章

Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties

文章目录HashMap类LinkedHashMap类TreeMap类Hashtable类Properties类HashMap类 1、HashMap类概述 HashMap是 Map 接口使用频率最高的实现类,允许使用null键和null值,与HashSet一样,不保证映射的顺序。 所有的key构成的集合是Set&#xff1a…

为什么SpringBoot如此受欢迎,以及如何有效地学习SpringBoot?

SpringBoot是最流行和使用最广泛的Java框架。 有时这种讨论“为什么SpringBoot如此受欢迎?” 来我和我的朋友/同事之间。 另外,我确实收到了许多人发来的电子邮件,询问“春天很大,如何快速学习?” 。 在这篇文章中&…

支持linux系统摄像头模块,在Linux操作系统上使用摄像头

我的公家笔记本的摄像头一直没啥用,偶尔用 vmware player 2.0模拟个 msn 用(其实到目前一次都没用过)。搞过安全对这东西严重不信任通常都不驱动,忽然想起重案6组那个警察兄弟说搞高科技的最怕高科技产品。linux 下一直没装,晚上闲着没啥事&a…

Java实现复数Complex的加减乘除运算、取模、求幅角角度

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) /*** Author: Yeman* Date: 2021-09-23-9:03* Description:*/…

linux 域账户密码忘记,linux基础命令-用户域用户组管理

//与用户相关的配置文件:/etc/passwd: #用户的配置文件, 保存用户账户的基本信息/etc/shadow #用户影子口令文件一、用户帐号文件——passwd1.“/etc/passwd”文件是UNIX安全的关键文件之一。该文件用于用户登录时效验用户的登录名、加密的口令数据项、…

Java集合(8)--集合工具类Collections

Collections 是一个操作 Set、List 和 Map 等集合的工具类。 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。 排序操作 reverse(List):反转 List 中元素的顺…

Java程序员应在2018年学习的3种JVM语言

如果您是Java程序员,并且想学习更多的编程语言以扩展您的知识和技能,但是不确定选择哪种编程语言,那么您来对地方了。 在本文中,我将分享Java程序员可以在2018年学习的3种JVM语言以及为什么要学习它们。 成为多语种开发人员的素质…

Java泛型(1)--集合使用泛型Generic、自定义泛型、泛型在继承上的体现、通配符的使用

文章目录泛型的概念集合中使用泛型自定义泛型结构泛型在继承上的体现通配符的使用泛型的概念 集合容器类在设计阶段/声明阶段不能确定这个容器实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个…

linux 内存 面试,【Linux内存面试题】面试问题:查看机器配置命… - 看准网

1、查看内存大小solari:prtconf -vp | grep Memlinux :grep MemTotal /proc/meminfo2、查看硬盘大小solari:df -klinux :fdisk -l[rootssoldap ~]# fdisk -lDisk /dev/sda: 146.6 GB, 146685296640 bytes255 heads, 63 sectors/tr…

蚂蚁组件 axure 蚂蚁_蚂蚁属性细微差别

蚂蚁组件 axure 蚂蚁每隔一段时间,我会想起Ant属性的一些细微差别 ,一旦忘记它们,在与Ant交互时会引起混乱。 特别是, Ant属性 通常是不可变的 (不包括Ant 1.8以来的局部属性 ),并且在其第一次设…

JavaIO流(1)--File类的使用

文章目录File类概述常用构造器常用方法File类概述 File类能新建、删除、重命名文件和目录,但不能访问文件内容本身,如果需要访问文件内容本身,则需要使用后续的输入/输出流。 要在Java程序中表示一个真实存在的文件或目录,那么必…

linux抓包提示没有权限,linux下wireshark不用sudo权限抓包包

ubuntu安装了wireshark,发现打不开网络接口,后来从网上得知要用sudo从命令行执行,确实可以,但是执行过程中一直要开一个命令行窗口,不爽,想直接用单击图标的方法运行之,在网上查询找到以下两个方…

Http基本身份验证在Spring Security中如何工作?

在上一篇文章中,您学习了如何在基于Spring安全性的Java应用程序中启用Http基本身份验证 ,现在,我们将进一步进一步了解http基本身份验证在Spring安全性中的工作原理。 如果您还记得的话,当您使用HTTP Basic进行身份验证时&#xf…

JavaIO流(2)--IO流原理、流的分类及节点流文件流操作

文章目录IO流简介IO流原理流的分类IO 流体系节点流和处理流节点流操作IO流简介 I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。 Java程序中,对于数据的输入/输出操作…

linux权限体系有哪些角色,详解Linux下系统权限

一、权限概述1. 什么是权限权限:在计算机系统中,权限是指某个计算机用户具有使用软件资源的权利。软件资源:Linux系统中,一切皆文件!SO,这里的软件资源就是文件资源。所以,我们今天所讲的权限&a…

试用期java_Java 7试用资源

试用期javaJava 7为完成使用后需要关闭的资源(例如文件,流,数据库连接和套接字)提供了更好的资源管理。 这种语言构造称为try-with-resources语句。 完成这项工作的机制称为AutoCloseable接口。 Java 7资源类均实现此接口。 该接口…

让你的对象跑出内存,写入到磁盘或者进行网络传输,一文掌握Java对象序列化

文章目录对象序列化是什么如何让对象可序列化让对象跑出内存对象序列化是什么 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获…

JDK 9:NotNullOrElse方法已添加到Objects类

JDK 9向Objects类添加了一些新方法&#xff0c;包括本文中突出显示的两个static方法&#xff1a; requireNonNullElse&#xff08;T&#xff0c;T&#xff09;和requireNonNullElseGet&#xff08;T obj&#xff0c;Supplier <&#xff1f;extended T>供应商&#xff09;…

linux下删除只读文件,linux – 我无法删除文件’rm:无法删除X只读文件系统’

我正在尝试删除rdiff备份文件夹,因为备份过程中出现了一些问题,需要删除它的历史记录并重试.但是,当我跑&#xff1a;rm -r -f rdiff-backup-data我在一些文件上得到以下内容&#xff1a;rm: cannot remove X: Read-only file system这是我运行mount时得到的&#xff1a;/dev/s…

让你的数据和对象有源有出路,一文打尽,Java常用IO流处理流(处理字节流文件流)缓冲流、转换流、对象流等

文章目录缓冲流转换流标准输入输出流打印流数据流对象流随机存取文件流Java NIO缓冲流 为了提高数据读写的速度&#xff0c;Java API提供了带缓冲功能的流类&#xff0c;在使用这些流类时&#xff0c;会创建一个内部缓冲区数组&#xff0c;缺省使用8192个字节(8Kb)的缓冲区。 …