首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

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

  •  
  •   andj4cn · 64 天前 · 1524 次点击
    这是一个创建于 64 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    9 回复  |  直到 2019-08-20 00:34:12 +08:00
        1
    Raymon111111   64 天前
    native 方法然后通过 C++ 申请的空间吧

    使用的话应该是自己维护了申请到空间的指针
        2
    lsc   64 天前
    JVM 应该是启动虚拟机的时候就按配置初始化内存,分配堆栈等空间吧
    那既然是 cpp 开发那应该是 malloc,至于你说直接使用操作系统内存空间是指 DirectByteBuffer ?
        3
    wr410   64 天前
    底层只负责给你申请一块地,至于这块地怎么分怎么用是 jvm 自己的事。
        4
    reus   64 天前
    向操作系统申请内存,都是通过系统调用,例如 mmap。所有 malloc 的实现也不例外,所以其实你说的 1 和 2,是不冲突的,不同层面而已。
        5
    taogen   64 天前 via Android
    1. 系统调用是操作系统提供的接口。2. malloc 是编程语言提供的接口,它最终也是使用系统调用。3. JVM 是操作系统中的一个用户进程,通过最终通过系统调用得到一段虚拟内存空间。4. 通过内存空间的首地址和长度,限制 JVM 的内存访问范围。
        6
    andj4cn   63 天前
    @reus 嗯这个我明白。像 glibc 标准库实现了自己的内存分配算法,就是避免多次使用系统调用效率低下的问题。直接使用系统调用实现,和使用基于系统调用的 malloc 是不一样的。
        7
    andj4cn   63 天前
    @taogen 这个我明白。是这样的,我是想知道,在具体的代码实现层面,JVM 使用的是 malloc 分配内存,还是直接调用的 system call
        8
    billlee   63 天前
    hotspot 应该是直接用 mmap. 因为堆配置的太大的时候,启动就会报 mmap 失败。
        9
    felixlong   63 天前 via Android
    都是用 mmap,除非嵌入式 jvm 系统不支持 mmap。 因为 mmap 可以只分配虚拟地址空间但是不分配实际内存。用 malloc 的话那就得一下子申请最大的 gc 内存。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2776 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 11:47 · PVG 19:47 · LAX 04:47 · JFK 07:47
    ♥ Do have faith in what you're doing.