本文的相关代码和笔记都放在了我的github,希望大家多多挑错。欢迎各位大佬批评。
本文的全部代码已经放在了github中。里面也包含了JVM实验的大部分代码,希望大家多多支持。
JVM<一>内存自动管理思维导图
0. Java的内存区域与溢出异常
0.0 Java内存区域划分![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/70e18b40019680aff3e8710bea5594ec.png)
1. 方法区
-
变成了在直接内存中的元空间,大小不受限制,只受物理内存的限制。本来是受
-XX:MaxPermSize
的影响的。-XX:MetaspaceSize class metadata的初始空间配额,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载, 同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间, 那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。 -XX:MaxMetaspaceSize 可以为class metadata分配的最大空间。默认是没有限制的。 -XX:MinMetaspaceFreeRatio 在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。 -XX:MaxMetaspaceFreeRatio 在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。
-
总结:方法区已经是一个逻辑上的概念了,功能已经被堆和直接内存实现了。
-
类型信息放在直接内存中,常量和静态变量放在了堆里面。
2. 直接内存
-
元空间在这实现。
-
使用-XX:MaxDirectMemorySize指定直接内存的大小,如果不指定和-Xmx一致。
3. 堆
- 对象分配、运行时常量池、静态字段。(或者说是常量和静态变量)。
- 垃圾回收的重点区域
- 要求连续的内存空间
4. 栈
- 栈上分配
- 标量替换
5. 程序计数器
- 无用
- 记住就行了
- 线程私有
0.1 Java对象
- 对象的整体概述
2. 对象访问定位
- 使用句柄池 -> 快速
- 使用直接指针访问 -> 对象移动的的时候,不用移动对象,直接移动实例的指针, 用户(栈中)的reference不用修改。
- 句柄池中存了两个:类型和引用
0.2 实战: OutOfMemoryError异常
-
本地方法栈的两种,首先区分throwable和Exception的区别。使用Excetion接收不到JVM层面的异常
OutOfMemory异常代码
本文的代码在github中,。里面也包含了JVM实验的大部分代码,希望大家多多支持。