问题标签 [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.

0 投票
1 回答
546 浏览

java - 堆外缓存 DirectMemory 准备好投入生产了吗?是活跃的吗?

DirectMemory 似乎是 Java 唯一的开源堆外缓存。

准备好生产了吗?

这是一个积极的、可行的项目吗?我查看了它的邮件列表存档,它的数量非常少。

0 投票
3 回答
3185 浏览

java - 堆上 Java 缓存有多少数据太多?我应该什么时候开始考虑堆外缓存?

对于像 ehcache 这样的堆上缓存来说,多少数据太多了?

我得到一个 24GB RAM 服务器。我可能会开始使用 2-4 GB 进行缓存,但最终可能会使用 20GB 左右的缓存。在什么时候我应该担心堆上缓存的 GC 会花费太长时间?

顺便问一下,DirectMemory 是唯一可用的开源堆外缓存吗?准备好迎接黄金时段了吗?

0 投票
1 回答
1002 浏览

java - GetByteArrayElements 使用直接内存?

我的程序中有一个 Direct Memory OOM。

java中使用的程序ByteBuffer.allocateDirect(),C++端将数据写入该缓冲区。但是当我试图改变ByteBuffer.allocateDirect()toByteBuffer.allocate()和 usingGetByteArrayElements()来写入数据时。我仍然得到相同的直接内存OOM。

我很困惑,这是GetByteArrayElements()使用直接内存复制数组吗?

非常感谢。

0 投票
3 回答
995 浏览

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,而是在寻找我的问题的答案。

0 投票
1 回答
136 浏览

java - 如何使用长内存地址调用 Java 方法?

假设我有一个在 Java 中很长的内存地址,如果我知道内存地址是一个函数指针,我怎么能在这个地址调用函数?

我对此感兴趣的原因是处理堆外对象。我将在不受 GC 影响的直接字节缓冲区中创建对象。这将允许我否定 GC 暂停时间,因为如果我不在堆上创建任何对象,GC 将永远不会运行。

0 投票
1 回答
2375 浏览

java - 如何使用 Java Unsafe 释放内存,使用 Java 引用?

Java Unsafe 类允许您按如下方式为对象分配内存,但是使用此方法您将如何在完成时释放分配的内存,因为它不提供内存地址...

有没有办法从对象引用访问内存地址,也许默认 hashCode 实现返回的整数会起作用,所以你可以这样做......

好像不太对...

0 投票
3 回答
2870 浏览

c# - 使用 DMA 访问高速串口

我在 c# 中使用串行端口组件,它运行良好!但问题是如何才能更快地处理高速(例如 2 Mbps)数据传输。

正如我对此进行的研究一样,我发现可以直接访问内存(使用 DMA 像这个链接)。谁能告诉我如何在我的应用程序中定义和使用它?

0 投票
1 回答
2045 浏览

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 吗?

0 投票
1 回答
441 浏览

java - 查找谁分配直接内存的有效方法

我正在开发一个 JAVA 项目,该项目集成了来自许多团队的许多组件。

今天,我们观察到强烈的直接内存消耗,但我们无法找到它的分配位置。

我正在寻找一种有效的方法(工具)来调查此类问题

谢谢你的帮助菲利普

0 投票
1 回答
3424 浏览

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 的内存分配后崩溃。

我不明白

  1. 既然我的物理内存只有16G,为什么分配了16G的内存后没有崩溃?64G的本机内存分配有什么特别之处?
  2. 当我使用“-Xms100g -Xmx100g”时,本机内存分配限制如何变化?我假设本机内存限制仅由选项“-XX:MaxDirectMemorySize=100g”根据我提供的链接中的上图控制。但是,结果不同。堆大小内存设置也改变了直接内存缓冲区限制。
  3. 不提供命令行选项时,3.6G内存分配有什么特别之处?

第二次实验

我将 ByteBuffer.allocateDirect 更改为 ByteBuffer.allocate 以在堆内存而不是本机内存中分配。

当我在没有任何选项的情况下运行上述程序时,它在分配了 2.7G 的内存后崩溃了。当我使用“-XX:MaxDirectMemorySize=100g”选项时,它没有任何效果。它在分配 2.7G 内存后崩溃。我觉得,这很有道理。但是,当我添加“-Xms100g -Xmx100g”选项时,它在 48 个循环或大约 48G 的内存分配后崩溃。

我不明白为什么,

  1. 既然我的物理内存只有16G,为什么分配了16G的内存后没有崩溃?48G的堆内存分配有什么特别之处?
  2. 不提供命令行选项时,2.7G内存分配有什么特别之处?

第三次实验

我在循环内启用了 allocateDirect 和 allocate 函数。当我添加“-Xms100g -Xmx100g”选项时,它在 24 个循环或有效的 48G 内存分配结合两者后崩溃。(24G本机内存+24G堆内存)

有人可以帮助我理解我在理解 Java 内存布局方面哪里错了吗?(参考链接中的图表)