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