小弟在弄监控,涉及到堆内内存和堆外内存,对 Java 并不是很了解, 看了几个文章,有的说堆内内存就是 JVM 直接分配的。但是 JVM 中又有堆内存,栈内存,PC 计数器。堆内内存是指 JVM 的堆内存嘛?还是 JVM 的内存。
堆外内存有说是直接内存(Direct memory)又有的说是 Native Memory ,有点懵逼。
1
cloudzhou 2023-08-15 15:11:00 +08:00
比如你用 jni 申请了一大块内存,那这里肯定属于对外内存
|
2
Ianchen 2023-08-15 15:22:05 +08:00
一个小区,你自己房子多大,你就只能用多大,这就是堆内,你自己的房子,你自己随便折腾,计数器、栈内存等。
超出你房子的空间,且在小区内的其他空间就是堆外内存。 一套房相当于一个 JVM ,一个小区多大,就是你系统内存多大。 |
5
zoyua 2023-08-15 16:14:24 +08:00 1
@Cola98 当然不是啊,这就涉及到 JVM 的又臭又长的八股文了,建议搜索一下 JVM 内存区域,里面有虚拟机栈、程序计数器、本地方法栈,然后才是堆
|
6
cheneydog 2023-08-15 16:17:15 +08:00 1
除了 JNI ,还有 Direct Memory 方式申请的内存应该也是堆外的
|
7
4kingRAS 2023-08-15 16:27:25 +08:00 1
一个是 JVM 管理的,一个不是 JVM 管理的需要手动申请,释放,跟 C++一样
|
8
cs419 2023-08-15 16:46:57 +08:00 1
堆内存 的 GC 是虚拟机自动执行
Direct memory 的 GC 需要你手动执行 创建对象 系统会在堆上 划出一个区域放数据 如果有数据要暂存 只能通过对象包一下 不能直接放内存里 算是二道贩子 对写代码的人友好 Direct memory 里可以直接放数据进去 并且这个数据不清理 会内存会被一直占用 灵活更高 没有中间商 但也没售后了(gc) 如果处理不当 容易内存泄漏 |
9
Chinsung 2023-08-15 17:47:11 +08:00 1
严格意义上来讲,不是堆内的内存都属于堆外内存,堆的大小就是通过启动命令设置进去的,除了堆之外,JVM 使用的其他内存都是堆外内存,包括 classloader ,线程,垃圾回收,直接内存( direct memory ),一般 java 讨论的堆外内存通常指的是直接内存( direct memory ),但是你是运维的话,我感觉还是把这个概念和你说清楚比较好
|
10
voidmnwzp 2023-08-15 18:15:21 +08:00 via iPhone 1
不归 jvm 管理的内存,无法自动释放
|