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

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

  •  
  •   andj4cn · 2019-08-19 16:42:28 +08:00 · 4195 次点击
    这是一个创建于 1952 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    9 条回复    2019-08-20 00:34:12 +08:00
    Raymon111111
        1
    Raymon111111  
       2019-08-19 16:48:49 +08:00
    native 方法然后通过 C++ 申请的空间吧

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