求助: JVM 底层实现内存分配问题

2019-08-19 16:42:28 +08:00
 andj4cn

有个问题一直想不明白,JVM 应该是运行在用户空间的,JVM 实现了自己的内存管理算法和 GC。
目前主流的 hotspot 虚拟机不是 Java 自举的,还是基于 cpp 开发的。

那么问题来了,JVM 是通过什么方式使用操作系统的内存空间的呢(Linux 下)?

1.使用系统调用,然后直接申请运行空间来实现算法;
2.使用 ptmalloc 等等这些 c 库,malloc 内存,然后实现自己的内存管理算法。

不了解不敢妄言,求 dalao 指点

4174 次点击
所在节点    Java
9 条回复
Raymon111111
2019-08-19 16:48:49 +08:00
native 方法然后通过 C++ 申请的空间吧

使用的话应该是自己维护了申请到空间的指针
lsc
2019-08-19 17:02:31 +08:00
JVM 应该是启动虚拟机的时候就按配置初始化内存,分配堆栈等空间吧
那既然是 cpp 开发那应该是 malloc,至于你说直接使用操作系统内存空间是指 DirectByteBuffer ?
wr410
2019-08-19 17:09:00 +08:00
底层只负责给你申请一块地,至于这块地怎么分怎么用是 jvm 自己的事。
reus
2019-08-19 17:40:01 +08:00
向操作系统申请内存,都是通过系统调用,例如 mmap。所有 malloc 的实现也不例外,所以其实你说的 1 和 2,是不冲突的,不同层面而已。
taogen
2019-08-19 18:36:50 +08:00
1. 系统调用是操作系统提供的接口。2. malloc 是编程语言提供的接口,它最终也是使用系统调用。3. JVM 是操作系统中的一个用户进程,通过最终通过系统调用得到一段虚拟内存空间。4. 通过内存空间的首地址和长度,限制 JVM 的内存访问范围。
andj4cn
2019-08-19 19:50:26 +08:00
@reus 嗯这个我明白。像 glibc 标准库实现了自己的内存分配算法,就是避免多次使用系统调用效率低下的问题。直接使用系统调用实现,和使用基于系统调用的 malloc 是不一样的。
andj4cn
2019-08-19 19:53:26 +08:00
@taogen 这个我明白。是这样的,我是想知道,在具体的代码实现层面,JVM 使用的是 malloc 分配内存,还是直接调用的 system call
billlee
2019-08-19 22:13:32 +08:00
hotspot 应该是直接用 mmap. 因为堆配置的太大的时候,启动就会报 mmap 失败。
felixlong
2019-08-20 00:34:12 +08:00
都是用 mmap,除非嵌入式 jvm 系统不支持 mmap。 因为 mmap 可以只分配虚拟地址空间但是不分配实际内存。用 malloc 的话那就得一下子申请最大的 gc 内存。

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

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

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

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

© 2021 V2EX