问题标签 [directmemory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 堆外缓存 DirectMemory 准备好投入生产了吗?是活跃的吗?
DirectMemory 似乎是 Java 唯一的开源堆外缓存。
准备好生产了吗?
这是一个积极的、可行的项目吗?我查看了它的邮件列表存档,它的数量非常少。
java - 堆上 Java 缓存有多少数据太多?我应该什么时候开始考虑堆外缓存?
对于像 ehcache 这样的堆上缓存来说,多少数据太多了?
我得到一个 24GB RAM 服务器。我可能会开始使用 2-4 GB 进行缓存,但最终可能会使用 20GB 左右的缓存。在什么时候我应该担心堆上缓存的 GC 会花费太长时间?
顺便问一下,DirectMemory 是唯一可用的开源堆外缓存吗?准备好迎接黄金时段了吗?
java - GetByteArrayElements 使用直接内存?
我的程序中有一个 Direct Memory OOM。
java中使用的程序ByteBuffer.allocateDirect()
,C++端将数据写入该缓冲区。但是当我试图改变ByteBuffer.allocateDirect()
toByteBuffer.allocate()
和 usingGetByteArrayElements()
来写入数据时。我仍然得到相同的直接内存OOM。
我很困惑,这是GetByteArrayElements()
使用直接内存复制数组吗?
非常感谢。
java - 在 Linux 上的 java 热点 jvm 中使用大页面和 DirectByteBuffer
我想做什么
我需要使用直接内存来避免 GC 移动东西。我想为那些启用大页面。
至今
标志 -XX:+UseLargePages 在使用堆缓冲区(非直接 ByteBuffers)时工作正常,但在使用 DirectByteBuffers 时不再工作。我也尝试过使用 MappedByteBuffers 和一个hugetlbfs 文件系统。这可行,但会引发许多问题,因此我正在寻找不同的解决方案。
配置 CentOS release 6.3、hotspot、jdk1.7
[编辑]
查看热点源代码,他们使用 malloc 来分配具有 Unsafe 的内存,是否需要 shmat/shmget 或 mmap 才能使用大页面。
[编辑] 为什么非堆内存
我们在一个 NUMA 上下文中,对于一个内存数据库,有很多长寿命的对象。当 UseNUMA 标志打开时,JVM 不会对旧代进行分区。使用直接内存允许我们让内存靠近需要它的线程。
在决定使用 DirectByteBuffers 的过程中,基准测试显然发挥了重要作用。我不是在问我是否应该使用 DirectByteBuffer,而是在寻找我的问题的答案。
java - 如何使用长内存地址调用 Java 方法?
假设我有一个在 Java 中很长的内存地址,如果我知道内存地址是一个函数指针,我怎么能在这个地址调用函数?
我对此感兴趣的原因是处理堆外对象。我将在不受 GC 影响的直接字节缓冲区中创建对象。这将允许我否定 GC 暂停时间,因为如果我不在堆上创建任何对象,GC 将永远不会运行。
java - 如何使用 Java Unsafe 释放内存,使用 Java 引用?
Java Unsafe 类允许您按如下方式为对象分配内存,但是使用此方法您将如何在完成时释放分配的内存,因为它不提供内存地址...
有没有办法从对象引用访问内存地址,也许默认 hashCode 实现返回的整数会起作用,所以你可以这样做......
好像不太对...
c# - 使用 DMA 访问高速串口
我在 c# 中使用串行端口组件,它运行良好!但问题是如何才能更快地处理高速(例如 2 Mbps)数据传输。
正如我对此进行的研究一样,我发现可以直接访问内存(使用 DMA 像这个链接)。谁能告诉我如何在我的应用程序中定义和使用它?
java - 缓冲区与不安全 - JVM 外部
我需要使用 GC 无法控制的可用 RAM 中的空间。我读了几篇同样的文章,介绍了两种方法。它们在以下代码中指定。
导入 java.lang.reflect.Field;导入 java.nio.ByteBuffer;
导入 sun.misc.Unsafe;
公共类 DirectMemoryTest {
}
我有一些问题
1)为什么我应该注意代码中提到的方法1,因为根据我的理解 ByteBuffer.allocateDirect() 不能返回一个存储容量大于 2GB 的缓冲区?因此,如果我的要求是存储 3 GB 的数据,我必须创建一个新缓冲区并将数据存储在那里,这意味着除了存储数据之外,我还有识别相应缓冲区的额外责任(在 'n 列表之外) ' 缓冲区),它维护指向直接内存的指针。
2)方法2不是比方法1快一点,因为我不必先找到缓冲区然后再找到数据,我只需要一个对象字段的索引机制并使用getDouble / getInt方法并传递绝对值地址 ?
3)直接内存的分配(说堆内存是否正确?)与PID有关吗?如果在一台机器上,我有 2 个 java 进程,PID 1 和 PID 2 中的 allocateMemory 调用让我永远不会使用相交的内存块?
4) 为什么最后一个 sysout 语句没有导致 0.0 ?这个想法是每个双精度都使用 8 个字节,所以我将 1.0 存储在 allocateMemory 返回的地址,比如地址 = 1,地址 1+8 的 2.0 是 9,然后停止。那么默认值不应该是 0.0 吗?
java - 查找谁分配直接内存的有效方法
我正在开发一个 JAVA 项目,该项目集成了来自许多团队的许多组件。
今天,我们观察到强烈的直接内存消耗,但我们无法找到它的分配位置。
我正在寻找一种有效的方法(工具)来调查此类问题
谢谢你的帮助菲利普
java - 为 Java 应用程序设置 MaxDirectMemory 和 MaxHeapMemory
对于我的 Java 应用程序,我尝试使用命令行选项来限制堆内存和直接内存使用。
当我试图了解有关 Java 应用程序内存布局的更多信息时,我偶然发现了以下 VMware文章。
从文章中,我假设 -Xmx 设置可用于限制堆使用,而 MaxDirectMemory 设置可用于限制堆外的本机内存(图中的客户操作系统内存)。但是,当我运行一个简单的程序时,结果会有所不同。我使用 ByteBuffer.allocateDirect 分配本机内存,而 ByteBuffer.allocate 分配堆内存。
它是一个 64 位处理器 (OSX) 和 64 位 JVM。
第一次实验
当我在没有任何选项的情况下运行上述程序时,它在分配了 3.6G 的内存后崩溃了。当我使用“-XX:MaxDirectMemorySize=100g”选项或“-Xms100g -Xmx100g”选项时,它在 65 次循环或大约 65G 的内存分配后崩溃。
我不明白
- 既然我的物理内存只有16G,为什么分配了16G的内存后没有崩溃?64G的本机内存分配有什么特别之处?
- 当我使用“-Xms100g -Xmx100g”时,本机内存分配限制如何变化?我假设本机内存限制仅由选项“-XX:MaxDirectMemorySize=100g”根据我提供的链接中的上图控制。但是,结果不同。堆大小内存设置也改变了直接内存缓冲区限制。
- 不提供命令行选项时,3.6G内存分配有什么特别之处?
第二次实验
我将 ByteBuffer.allocateDirect 更改为 ByteBuffer.allocate 以在堆内存而不是本机内存中分配。
当我在没有任何选项的情况下运行上述程序时,它在分配了 2.7G 的内存后崩溃了。当我使用“-XX:MaxDirectMemorySize=100g”选项时,它没有任何效果。它在分配 2.7G 内存后崩溃。我觉得,这很有道理。但是,当我添加“-Xms100g -Xmx100g”选项时,它在 48 个循环或大约 48G 的内存分配后崩溃。
我不明白为什么,
- 既然我的物理内存只有16G,为什么分配了16G的内存后没有崩溃?48G的堆内存分配有什么特别之处?
- 不提供命令行选项时,2.7G内存分配有什么特别之处?
第三次实验
我在循环内启用了 allocateDirect 和 allocate 函数。当我添加“-Xms100g -Xmx100g”选项时,它在 24 个循环或有效的 48G 内存分配结合两者后崩溃。(24G本机内存+24G堆内存)
有人可以帮助我理解我在理解 Java 内存布局方面哪里错了吗?(参考链接中的图表)