草庐IT

Java NIO 选择器可能的最小延迟

我正在通过环回(127.0.0.1)在Linux上使用优化的JavaNIO选择器进行一些基准测试。我的测试很简单:一个程序将一个UDP数据包发送到另一个程序,另一个程序将其回显给发送者并计算往返时间。下一个数据包仅在前一个数据包被确认(返回时)时才发送。在执行基准测试之前,会使用几百万条消息进行适当的预热。消息有13个字节(不包括UDPheader)。对于往返时间,我得到以下结果:最短时间:13微秒平均时间:19微秒75%百分位数:18,567纳米90%百分位数:18,789纳米99%百分位数:19,184纳米99.9%百分位数:19,264纳米99.99%百分位数:19,310纳米9

Java NIO2 AsynchronousSocketChannel/AsynchronousServerSocketChannel 和 TLS/SSL

INTERNET上所有在NIO2上可用的源/示例都没有TLS/SSL支持,java.nio.channels.AsynchronousSocketChanneljava.nio.channels.AsynchronousServerSocketChannel据我了解,连接的SSLEngine生命周期不同于AsynchronousSocketChannel.connect&&AsynchronousServerSocketChanne.accept,TLS/SSL应该封装在AIO实现中,那么我如何同时使用它们......?注意:我在Grizzly项目中的一个视频中谈到他们已经实现了它,我

导致虚拟机故障的 Java 映射/nio/NFS 问题 : "a fault occurred in a recent unsafe memory access operation in compiled Java code"

我已经为特定的二进制格式(nfdump如果有人感兴趣)编写了一个解析器类,它使用了java.nio的MappedByteBuffer。读取每个几GB的文件。二进制格式只是一系列header和大部分固定大小的二进制记录,通过调用nextRecord()将其馈送到被调用方,nextRecord()会推送状态机,完成后返回null。它表现良好。它在开发机器上运行。在我的生产主机上,它可以运行几分钟或几小时,但似乎总是抛出“java.lang.InternalError:afaultoccurredinarecentunsafememoryaccessoperationincompiledJa

java - 从经典的多线程到java.nio异步/非阻塞服务器

我是在线游戏的主要开发商。玩家使用特定的客户端软件,该客户端软件通过TCP/IP(TCP,而不是UDP)连接到游戏服务器目前,服务器的体系结构是一个经典的多线程服务器,每个连接只有一个线程。但是在高峰时段,通常有300或400个连接的人,服务器变得越来越迟钝。我想知道,是否通过切换到具有管理多个连接的少量线程的java.nio。*异步I/O模型,性能是否会更好。在网络上查找涵盖此类服务器体系结构基础知识的示例代码非常容易。但是,经过数小时的谷歌搜索,我没有找到一些更高级的问题的答案:1-该协议(protocol)是基于文本的,而不是基于二进制的。客户端和服务器交换以UTF-8编码的文本

java - 使用 java nio 套接字时,“已建立的连接被主机中的软件中止”

我使用javanio套接字开发了一个java服务器。这是我的应用程序的代码:publicclassEchoServer{staticfinalorg.apache.log4j.Loggerlogger=org.apache.log4j.Logger.getLogger(Main.class);privatestaticfinalintBUFFER_SIZE=1024;privatefinalstaticintDEFAULT_PORT=4664;privateInetAddresshostAddress=null;privateintport;privateStringipAddress

java - DELETE_ON_CLOSE 的用处

互联网上有很多示例展示了如何使用StandardOpenOption.DELETE_ON_CLOSE,例如:Files.write(myTempFile,...,StandardOpenOption.DELETE_ON_CLOSE);其他示例类似地使用Files.newOutputStream(...,StandardOpenOption.DELETE_ON_CLOSE)。我怀疑所有这些示例都可能存在缺陷。写文件的目的是你要在某个时候读回它;否则,为什么要写呢?但是DELETE_ON_CLOSE不会导致文件在您有机会阅读之前被删除吗?如果您创建一个工作文件(以处理由于太大而无法保存在内

Java - 内存映射文件的好处

我很难看到Java中内存映射文件(缓冲区)的好处。这是我在实践中看到的方法:我们将文件block映射到主内存并直接在内存中处理任何写入/读取,让操作系统完成将文件持久保存到磁盘的工作。现在,我想将其与常规I/O和一些场景进行对比:追加到文件中为了将文件映射到mem中,我必须将其作为一个整体读取,以进行整体修改。缓冲区大小最初是文件的大小(假设我不知道要写入文件的数据量)。现在,为了附加到文件,我不能这样做,因为缓冲区的大小有限。所以最基本的操作对我来说似乎是不可能的。此外,读取整个文件以附加一小部分似乎相当浪费。所以我猜常规I/O在这种情况下表现更好。坚持改变为了保留更改,我仍然需要刷

java - 如何使用 NIO 从 JAR 中读取文件?

使用ClassLoader.getResourceAsStream(...)从可执行JAR文件本身读取文件对我来说是一个已知的概念,但是我如何使用JavaNIO执行相同的操作?目标是具有如下功能:staticStringreadFullyFromJar(Stringfilename){finalPathpath=Paths.get(Main.class.getResource(fileName).toURI());finalbyte[]bytes=Files.readAllBytes(path);returnnewString(bytes,CHARSET_ASCII);}虽然这在IDE

java - 我应该如何处理 Java 中的一个非常大的数组?

我有一个算法,目前分配一个非常大的double组,它经常更新和搜索。数组的大小为N^2/2,其中N是算法运行的行数。为了与围绕算法的应用程序相关的目的,我还必须保留整个内容的副本。当然,这对我的算法可以处理的行数施加了限制,因为我要应对堆限制。到目前为止,我已经让使用该算法的人更新-Xmx设置以分配更多空间,并且效果很好。但是,我现在遇到了一个真正的问题,我需要这个数组大于我可以放入内存的数组。我已经计划更改我的算法以减轻这种大型阵列的必要性,并在该领域取得一些有希望的结果。然而,这是对过程的根本改变,需要做更多的工作才能达到我当前代码的高度完善状态,该代码在生产中非常成功地运行并且已

Java NIO 选择器 select() 返回 0,尽管 channel 已准备就绪

我的JavaNIO选择器是使用select()实现的所以它会阻塞,直到其中任何一个发生:注册channel已准备就绪是wakeup()编辑线程被打断据此,我对select()返回0的情况做了一些假设:一定是原因2或3。selectedKeys()应该返回一个空的ResultSet我不需要调用selectedKeys()并且可以继续下一个循环迭代,其中将再次调用select()但是,我遇到了select()虽然有readychannel但还是返回0的情况。selectedKeys()按预期返回具有1个SelectionKey的Set。即使多次调用select()也会始终返回0,直到cha