13 张图解 Java 中的内存模型
开发者全社区
共 784字,需浏览 2分钟
· 2020-12-02
作者:Carson_Ho
链接:juejin.im/post/6844903677279338509
作者:Carson_Ho
链接:juejin.im/post/6844903677279338509
了解Java中的对象、变量等存放的内存区域十分重要 本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢
目录
![](https://filescdn.proginn.com/923f31ccb1267e98fdb137c776594e51/2b89655162e5df8d67f0a45298ff3eed.webp)
1. 内存模型 & 分区
Java虚拟机在运行Java程序时,会管理着一块内存区域:运行时数据区
在运行时数据区里,会根据用途进行划分:
Java虚拟机栈(栈区) 本地方法栈 Java堆(堆区) 方法区 程序计数器
![](https://filescdn.proginn.com/f5552138e4a1aa96c08b77d95cff0265/125a2bcf91a8260699ff543da2333cf9.webp)
2. Java堆
![](https://filescdn.proginn.com/c7a42eb4556a3b00ec8868f33f47d333/7f39e0f5ee4e79da067b677467a24f12.webp)
![](https://filescdn.proginn.com/4a70e529e1b907075593385f631adedb/488413be0fd14b8255fecfbbed316db3.webp)
3. Java虚拟机栈
![](https://filescdn.proginn.com/b9268e0a6cbb42bf569ec8fa201e6586/b0afb1f3a832f1082112901f39b7a387.webp)
![](https://filescdn.proginn.com/9a21ff9b11806212567a28773a1593f3/d3c36436137daba08d172c03bc382845.webp)
4. 本地方法栈
![](https://filescdn.proginn.com/1fb371a5438003de77add924c640ba49/43e67155ebe92d6bbd2f7704e62fbb44.webp)
5. 方法区
![](https://filescdn.proginn.com/e11435ba3abe64bdd1e138fe365a2335/1630f40f8e47e86a1b30be26d5bcddd6.webp)
![](https://filescdn.proginn.com/f491cfa68a8fb1ef9ea4cf685bf883ed/ff7d2a6e98cc93486618eb968d44731c.webp)
![](https://filescdn.proginn.com/8164541c7c671093e1a19c9c03a3b9fd/bf775dc53cd1831b8078e3be5920ac8c.webp)
6. 程序计数器
![](https://filescdn.proginn.com/c21f02a4173f61be4130e2bac3574109/03bf0b11e5611061a2a6184dc438fc31.webp)
![](https://filescdn.proginn.com/44136b2acb6ef5cb990e313c7247dae1/975240b7fc0e937c67f277a743cfd4a5.webp)
7. 额外知识:直接内存
定义:NIO类(JDK1.4引入)中基于通道和缓冲区的I/O方式 通过使用Native函数库 直接分配 的堆外内存 特点:不受堆大小限制
不属于虚拟机运行时数据区的一部分 & 不在堆中分配
应用场景:适用于频繁调用的场景
通过一个 存储在Java堆中的DirectByteBuffer对象 作为这块内存的引用 进行操作,从而避免在 Java 堆和 Native堆之间来回复制数据,提高使用性能
抛出的异常:OutOfMemoryError,即与其他内存区域的总和 大于 物理内存限制
8. 总结
![](https://filescdn.proginn.com/310cfae0d44790ba373e3a72341c7187/253e0cc8dd895f333735182bf57518bc.webp)
评论