相关疑难解决方法(0)

在Java中访问内存的最佳方法是什么,类似于mmap?

我正在开发一个需要与C应用程序通信的Java应用程序.C应用程序使用共享内存和mmap进行通信,我需要Java应用程序才能访问相同的内存.

我的第一次尝试涉及使用JNI调用从共享内存中检索数据,但每次JNI调用的开销都会导致性能下降,因此我想要一种方法来获取Java中的内存并在Java端进行数据检索.

我的想法是我需要做以下事情:

  1. 使用一个JNI调用来获取我需要附加到的共享内存位置的位置
  2. 创建一个新的FileChannel()
  3. 使用该FileChannel使用map()创建MappedByteBuffer

这是最好的方法吗?另外,我不确定如何实际创建FileChannel以指向正确的内存位置.

java memory

17
推荐指数
1
解决办法
7361
查看次数

Linux下进程之间的最低延迟通知方法

我正在寻找允许一个进程进入休眠状态并允许其他进程唤醒它的最低延迟 IPC.

我正在寻找最低延迟的方法.到目前为止一些可行的方法

  1. 将一个字节写入管道并从中读取.
  2. 将一个字节写入套接字并从中读取.
  3. 发送信号(杀死)并等待它(sigwait)
  4. 使用sem_post/sem_wait

还有其他更好的想法?

任何特定于Linux的解决方案都可以.

linux ipc

14
推荐指数
2
解决办法
3758
查看次数

Linux上用于Java/C++应用程序的共享内存IPC的良好替代品

我目前正在使用Java和C++应用程序之间的IPC共享内存,但寻找更方便的替代方案.

有人可以建议一个性能和速度相同的更好的方法吗?

谢谢!

c++ java linux ipc shared-memory

10
推荐指数
2
解决办法
1万
查看次数

Java TCP/IP套接字延迟 - 卡在50μs(微秒)?(用于Java IPC)

我们一直在分析和分析我们的应用程序,以尽可能减少延迟.我们的应用程序由3个独立的Java进程组成,它们都运行在同一台服务器上,它们通过TCP/IP套接字相互传递消息.

我们将第一个组件的处理时间缩短到25μs,但我们发现TCP/IP套接字(在本地主机上)写入下一个组件总是需要大约50μs.我们看到另一个异常行为,因为接受连接的组件可以写得更快(即<50μs).目前,除套接字通信外,所有组件的运行时间均小于100μs.

不是TCP/IP专家,我不知道可以做些什么来加快这个速度.Unix Domain Sockets会更快吗?MemoryMappedFiles?什么其他机制可能是一种更快的方式将数据从一个Java进程传递到另一个Java进程?

更新6/21/2011我们创建了2个基准测试应用程序,一个用Java编写,一个用C++编写,用于更紧密地比较TCP/IP并进行比较.Java应用程序使用NIO(阻塞模式),而C++使用Boost ASIO tcp库.结果或多或少相当,C++应用程序比Java快约4μs(但在其中一项测试中,Java胜过C++).此外,两个版本的每条消息的时间都有很多变化.

我认为我们同意共享内存实现最快的基本结论.(虽然我们也想评估Informatica产品,只要它符合预算.)

java tcp ipc interprocess low-latency

10
推荐指数
1
解决办法
5208
查看次数

MQ以异步方式处理,聚合和发布数据

一些背景,在得到真正的问题之前:

我正在开发一个由几个不同模块组成的后端应用程序.目前,每个模块都是一个命令行java应用程序,它是"按需"运行的(稍后会详细介绍).

每个模块都是一个"步骤",是一个更大的过程的一部分,您可以将其视为数据流; 第一步从外部源收集数据文件并将其推送/加载到某些SQL数据库表中; 然后根据不同的条件和事件(时间,数据库中存在数据,通过Web服务/ Web界面完成的消息和详细说明),从(1个或多个)DB表中获取数据,处理它们,并将它们写在不同的表格上.步骤在三个不同的服务器上运行,并从三个不同的DB读取数据,但只能在一个DB中写入.目的是汇总数据,计算指标和统计数据.

目前,每个模块都是定期执行的(从第一个模块的几分钟/小时,到链中最后一个模块的几天,需要聚合更多数据,因此等待"更长时间"从它们可用),使用的cronjob.运行一个模块(当前是一个java控制台应用程序),它会检查数据库中给定日期时间窗口中新的未处理信息,并完成其工作.

问题:它有效,但是......我需要扩展和维护它,这种方法开始显示其局限性.

  1. 我不喜欢依靠"民意调查"; 这是浪费,考虑到以前模块的信息足以在他们需要的信息可用时"告诉"链中的其他模块,并且他们可以继续.
  2. 它"缓慢":链条上的模块延迟了几天,因为我们必须确保数据是由前面的模块到达和处理的.所以我们"停止"这些模块,直到我们确定我们拥有所有数据.新增功能需要实时(不是很难,但"尽快")计算某些指标.一个很好的例子就是在这里发生的事情,在SO上,带有徽章!:)我需要获得一些非常相似的东西.

为了解决第二个问题,我将介绍"部分"或"增量"计算:只要我有一组相关信息,我就会处理它.然后,当一些其他链接信息到达时,我计算差异并相应地更新数据,但我还需要通知其他(从属)模块.

问题

- 1)哪种方法最好? - 2)相关:哪些是"通知"其他模块(在我的情况下是java可执行文件)相关数据可用的最佳方式?

我可以看到三种方式:

  • 将其他"非数据"表添加到数据库中,每个模块写入"嘿,我已经完成了这个并且它可用".当cronjob启动另一个模块时,它会读取表格,确定他可以计算子集xxx,然后执行.等等
  • 使用Message Queues,如ZeroMQ(或Apache Camel,如@mjn建议)而不是DB表
  • 使用像Redis这样的键值存储,而不是数据库表

编辑:我确信基于队列的方法是要走的路,我为完整性添加了"table + polling"选项,但现在我明白这只是一种分心(显然,每个人都会回答"是的,使用队列,民意调查是邪恶的" - 这是正确的!".因此,让我重新解释一下这个问题: 使用像Redis这样的pub/sub的键值存储使用MQ的优点/缺点是什么?

  • 3)有没有任何解决方案可以帮我完全摆脱cronjobs?

编辑:特别是,在可能的情况下,它意味着:在某些MQ和/或键值存储中是否有一种机制可以让我发布带有"时间"的消息?比如"在1天内交付"?显然,持久性和"几乎一次"交付保证

  • 4)我应该将此消息(基于事件?)的解决方案构建为集中式服务,并将其作为其中一个服务器上的守护程序/服务运行吗?
  • 5)我是否应该放弃按需启动订阅者的想法,让每个模块作为守护进程/服务连续运行?
  • 6)哪些是赞成和缺点(可靠性,单点故障与资源使用和复杂性......)?

编辑:这是我最关心的一点:我想"排队"自己根据队列中的消息激活"模块",类似于MSMQ激活.这是个好主意吗?Java世界中有什么东西可以实现它,我应该自己实现它(通过MQ还是通过Redis),还是应该将每个模块作为守护进程运行?(即使某些计算通常是在突发中发生,两小时处理然后是两天的空转?)

注意:我不能使用重型容器/ EJB(No Glassfish或类似产品)

编辑:骆驼对我来说似乎有点太重了.无论是在资源还是开发的复杂性方面,我都在寻找一些非常轻松的东西

java notifications dataflow message-queue redis

7
推荐指数
1
解决办法
753
查看次数

Java和C++之间的进程间通信

可能重复:
Java和C/C++之间进程间通信的最快(低延迟)方法

我想问一下是否有人可以建议我在同一台机器上的两个进程之间传输大量数据的最快方法,一个用Java构建,另一个用C++构建

我必须在Internet上构建一个具有客户端 - 服务器架构的业务应用程序,其结构类似于this->

Java客户端应用---(Java套接字)-----> Java Servlet ----> C++业务逻辑.

它需要高度可移植,因为我们事先不能说客户端的目标环境,所以根据我的说法,java将是它的最佳选择.它将通过java套接字与java服务器进行交互.servelet应该与用C++构建的业务逻辑交互.

我将使用java仅用于通信部分,所有其余的业务逻辑将在C++中使用.

我是Java的业余程序员,在C++方面有很好的经验.

任何建议都会受到欢迎..

c++ java ipc

0
推荐指数
1
解决办法
2911
查看次数