java8 的内存模型疑问。

2020-05-22 10:54:10 +08:00
 xiaobaobao
8 现在是把之前的方法区转变成了元空间,元空间被放在本地内存中,与此同时我看到很多文章还有写直接内存也是在本地内存中,和元空间并列的
可是当我去查什么是直接内存,很多都是当作本地内存来说。
疑问是:
1:正确的内存模型下本地内存是分为元空间和直接内存吗?
2:1 成立的话,什么是直接内存?就单单只是直接操作堆外内存?不是一个空间就只是一个操作什么的吗?
2022 次点击
所在节点    Java
6 条回复
Aresxue
2020-05-22 11:17:02 +08:00
Heap memory 堆内存:JVM 进程内的内存,由 JVM 管理以表示 Java 对象
Native memory/Off-heap:是在不在堆内的进程地址空间内分配的内存(还属于 JVM 的进程分配内存)
Direct Memory 直接内存:类似于本机,但也意味着正在共享硬件中的底层缓冲区。例如网络适配器或图形显示中的缓冲区。这里的目标是减少在内存中复制相同字节的次数
是分配在 C Heap 上的 Buffer,由于不属于 JVM HEAP,管理 /监控起来会比较困难,但也会被 GC 回收。DirectByteBuffer 自身是( Java )堆内的,它背后真正承载数据的 buffer 是在( Java )堆外——Native memory 中的

native heap: 本机内存(原指机器的所有内存,jvm 进程使用的也是它的一部分,但一般场景下经常指不属于 jvm 进程的内存)
CRUD
2020-05-22 11:25:43 +08:00
1.元空间使用的就是直接内存,即元空间时在直接内存上分配
2.直接内存是使用 native 函数库直接分配的,使用 native 函数库直接分配堆外内存后在通过存储在 Java 堆中的 DirectByteBuffer 对象做为这块内存的的引用进行操作,不受 Java 虚拟机管理,大小不受 Java 堆限制但受物理机总内存限制。
wysnylc
2020-05-22 11:58:41 +08:00
8 还好还是分代模型,ZGC 直接推翻标记整理+复制算法而且(暂时)不分代
sonice
2020-05-22 13:42:34 +08:00
@Aresxue Direct memory 是省去的 heap 到 native 还是 native 到 kernel 的复制啊?
luozic
2020-05-22 14:12:21 +08:00
zgc 不分代就是新分配对象内存性能会比分代的 C4GC 性能差点,不过在大内存上面比其他几个 hotspot 的 gc 性能强多了。
Aresxue
2020-05-23 13:39:48 +08:00
@sonice 都有,Direct Memory 使用的是 Native memory/Off-heap,仍归属于 Java 进程,所以该部分内存本身是在用户空间的,但用户态和内核态之间的拷贝其实也被优化了,本质上是因为用户态的逻辑地址和内核态的逻辑地址
使用的是同一个物理空间,所以相当于用户态和内核态也不存在拷贝

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674294

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX