Java中共享内存的任何概念

22 java memory shared

AFAIK,Java中的内存基于堆,内存从中动态地分配给对象,并且没有共享内存的概念.

如果没有共享内存的概念,那么Java程序之间的通信应该是耗时的.在C中,与其他通信模式相比,通过共享存储器进行进程间通信更快.

如我错了请纠正我.另外,两个Java程序相互交流的最快方式是什么.

Ash*_*ash 23

至少有两种方法 - RAM驱动器Apache APR.

详细信息在这里这里有一些性能测量.


Aar*_*lla 14

由于没有用于创建共享内存段的官方API,因此需要使用帮助程序库/ DDL和JNI来使用共享内存来使两个Java进程相互通信.

实际上,由于Java支持线程,因此这很少成为问题,因此您可以在同一个Java VM中运行两个"程序".那些将共享相同的堆,因此通信将是即时的.另外,由于共享内存段的问题,您无法获得错误.

  • 虽然共享内存确实是一个不同的概念,但是mem-mapped文件可以以类似的方式用于IPC.是的,你对Java 1.4是正确的:) (3认同)
  • @Arkadiy:使用带有NIO的Java 1.4添加了内存映射**文件**.Java 7用NIO 2扩展了它.但是OP希望了解共享**内存**,这是一个不同的概念. (2认同)

Ash*_*ash 9

Peter Lawrey的Java Chronicle项目值得关注.

这些是我之前做过的一些测试,比较了各种堆外和堆上选项.


Cow*_*wan 8

要注意的一件事是使用内存映射文件,使用Java NIO的FileChannel类或类似文件(请参阅map()方法).我们已经非常成功地使用它来在同一台机器上的Java进程和C本机进程之间进行通信(在我们的例子中是单向的).

我承认我不是文件系统专家(幸运的是我们确实有一个人员!)但我们的性能绝对超快 - 实际上你将页面缓存的一部分视为文件并阅读+写入直接没有系统调用的开销.我不确定保证和一致性 - 在Java中有一些方法可以强制将更改写入文件,这意味着它们(通常?通常?通常?不确定)写入实际的基础文件(有点?非常?非常?)懒洋洋地说,这意味着在某些时候它基本上只是一个共享的内存段.

从理论上讲,据我所知,内存映射文件CAN实际上可以由共享内存段支持(我认为它们只是文件句柄),但我不知道在没有JNI的Java中这样做的方法.

  • 这个线程现在甚至更老了,但你可以查看https://github.com/peter-lawrey/Java-Chronicle这样可以实现每秒500万到2000万条消息*持久化*在进程之间单向延迟小于200 ns . (2认同)

Wil*_*ill 7

共享内存有时很快.有时它不 - 它会损害CPU缓存和同步通常是一种痛苦(并且它应该依赖于互斥体等,这可能是一个主要的性能损失).

Barrelfish是一个操作系统,它表明使用消息传递的IPC实际上比共享内存更快,因为核心数量增加(在传统的X86架构上以及你认为它所针对的更具异国情调的NUMA NUCA东西).

因此,您对共享内存快速的假设需要针对您的特定方案和目标硬件进行测试.这些天它不是一般的声音假设!

  • 这是误导.争用写入会损害性能,锁定会损害性能.共享读取有助于提高性能,共享内存优于IPC,具有良好的实现(实际上,最好的IPC系统是通过共享内存实现的.)使用内核IPC对性能来说是可怕的.因此,虽然它有其位置并且在概念上通常更容易使用,但性能绝对不是使用IPC的理由! (4认同)