Java内存管理
JVM内存模型总体框架
运行时数据区
各个区的介绍
程序计数器:“线程独立”,用于记录下一条要运行的指令。对于java方法,用于记录正在执行的java字节码地址;对于本地方法,为空。“唯一 一个未规定OOM情况的区域”
本地方法栈:功能类似于虚拟机栈,管理的是本地方法,(用c实现)。
“以上两个区规定了栈溢出和OOM情况”- java堆:“线程共享”,存放了所有对象实例和数组。GC垃圾回收管理的主要区域。“规定了OOM情况”, “新生代和老年代” 。
-参数 Xms –堆的初始值大小(最小值)
-参数 Xmx –堆的最大值
-参数 Xmn –新生代堆大小
-参数 XXSurviorRatio –Eden区与survior区的大小比值
建议Xms=Xmn=1/3 Xmx - 方法区:“线程共享”,存放常量、静态变量及已经被JVM加载的类信息。“作为持久代”。
-参数 XX:permsize –持久代的初始大小
-参数XX:MaxPerSize –持久代的最大容量
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堆以及方法区。
- 首先将obj放入JVM栈的局部变量表中,作为对象引用类型。
- new Object()反映到java堆中,会在堆内分配一块区域存储Object类的对象实例数据。
- Object类型的信息则存放于方法区中。
通过obj引用定位访问到对象具体内容的方式一般有两种,通过句柄或者直接使用指针。
1. 通过句柄访问的方式
2.直接指针访问的方式