Java内存管理

Java内存管理

JVM内存模型总体框架

  1. 运行时数据区

    这里写图片描述

  2. 各个区的介绍

    • 程序计数器:“线程独立”,用于记录下一条要运行的指令。对于java方法,用于记录正在执行的java字节码地址;对于本地方法,为空。“唯一 一个未规定OOM情况的区域”
      这里写图片描述

    • 本地方法栈:功能类似于虚拟机栈,管理的是本地方法,(用c实现)。
      “以上两个区规定了栈溢出和OOM情况”

    • java堆:“线程共享”,存放了所有对象实例和数组。GC垃圾回收管理的主要区域。“规定了OOM情况”“新生代和老年代”
      -参数 Xms –堆的初始值大小(最小值)
      -参数 Xmx –堆的最大值
      -参数 Xmn –新生代堆大小
      -参数 XXSurviorRatio –Eden区与survior区的大小比值
      建议Xms=Xmn=1/3 Xmx
    • 方法区:“线程共享”,存放常量、静态变量及已经被JVM加载的类信息。“作为持久代”
      -参数 XX:permsize –持久代的初始大小
      -参数XX:MaxPerSize –持久代的最大容量

    这里写图片描述

  3. JVM垃圾回收算法
    主要有复制算法、标记-清除算法、标记-整理算法。

    • 复制算法:分块处理的思想,将区域分成两部分,只利用其中一部分,另一部分用于放置转移后的垃圾对象。
    • 标记-清除算法:在运行过程中,将要回收的对象做上标记,等到要回收的时候,扫描整个空间,清除被标记的对象。 会产生大量内存碎片
    • 标记-整理算法: 一开始的标记过程同上,当要回收时,现将做上标记的对象移到一侧后,在统一进行垃圾回收。不会产生大量碎片

      新生代主要采用复制算法和标记-清除算法;年老代主要采用标记-整理算法和标记-清除算法;持久代采用标记-整理算法。

4.java程序的工作原理

这里写图片描述

5.类加载器

- Bootstrap ClassLoader(引导类加载器): 主要由底层C++实现,加载$JAVA-HOME中jre/lib/rt.jar中所有类。
- Extension ClassLoader(扩展类加载器) : 加载扩展jar包。
- App ClassLoader(系统/应用加载器) : 负责加载环境变量classpath中的jar包以及目录中的类。
- Custom CLassLoader(用户自定义加载器)

类加载器先自底向上检查类是否已被加载,再自顶向下尝试加载类。类在加载时,将.class文件中的二进制数据读入内存,并放入方法区,并在堆内创建一个类对象,用该封装方法区中的数据结构。

6.具体对象访问图

    Object obj=new Object();

这一行代码涉及到三个区域,JVM栈、java堆以及方法区。

  1. 首先将obj放入JVM栈的局部变量表中,作为对象引用类型。
  2. new Object()反映到java堆中,会在堆内分配一块区域存储Object类的对象实例数据。
  3. Object类型的信息则存放于方法区中。

通过obj引用定位访问到对象具体内容的方式一般有两种,通过句柄或者直接使用指针。
1. 通过句柄访问的方式

这里写图片描述

2.直接指针访问的方式

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值