JVM<一>内存管理[一]内存划分与内存溢出

本文的相关代码和笔记都放在了我的github,希望大家多多挑错欢迎各位大佬批评

本文的全部代码已经放在了github中。里面也包含了JVM实验的大部分代码,希望大家多多支持。

JVM<一>内存自动管理思维导图

在这里插入图片描述

0. Java的内存区域与溢出异常

0.0 Java内存区域划分在这里插入图片描述

1. 方法区
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7nwfmMq-1665483502254)(D:\blgs\source\imgs\image-20220419200223728.png)]

  • 参考方法区的变迁

  • 变成了在直接内存中的元空间,大小不受限制,只受物理内存的限制。本来是受-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对象

  1. 对象的整体概述

在这里插入图片描述

2. 对象访问定位

在这里插入图片描述

在这里插入图片描述

  • 使用句柄池 -> 快速
  • 使用直接指针访问 -> 对象移动的的时候,不用移动对象,直接移动实例的指针, 用户(栈中)的reference不用修改。
  • 句柄池中存了两个:类型和引用

0.2 实战: OutOfMemoryError异常

在这里插入图片描述

  1. 本地方法栈的两种,首先区分throwable和Exception的区别。使用Excetion接收不到JVM层面的异常

    img

OutOfMemory异常代码

本文的代码在github中,。里面也包含了JVM实验的大部分代码,希望大家多多支持。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值