首页
首页
文章目录
  1. 运行时数据区域:
  2. 垃圾回收:
  3. 垃圾收集算法:
  4. 垃圾收集器
  5. 内存分配和回收策略
  6. 内存分配策略
  7. 类加载机制:

JVM学习笔记

运行时数据区域:

程序计数器,java虚拟机栈,本地方法区,堆,方法区(运行时常量池)。

  • 程序计数器:记录正在执行的虚拟机字节码指令的地址(执行的为本地方法就为空)。
  • Java虚拟机栈:每个java方法在执行的同时会创建一个栈帧用于存储局部变量表,操作数表栈,常量池引用等信息。从方法调用直至执行完成的过程,对应着一个栈帧在java虚拟机栈中的入栈和出栈的过程。
    可以通过-Xss这个虚拟机参数来指定每一个线程的Java虚拟机栈内存大小,在JDK1.4中默认是256k,儿子啊JDK1.5位1M。
    java -Xss HackJava
  • 本地方法栈:本地方法栈与Java虚拟机栈类似,他们之间的钱包瘪只不过是本地方法栈为本地方法服务
    本地方法一般是用其他语言编写的,并且被便以为基于本机硬件和操作系统的程序,对待这些地方需要特别处理。
  • 堆:所有对象都在这里分配内存,是垃圾回收的主要区域
    现代的垃圾收集器基本都是采用分带收集算法,其主要的思想是针对不同类型的对象采用不同的垃圾回收算法。可以将堆分为两代
    新生代和老年代。
    堆不需要连续内存,并且可以动态增加其内存,增加失败会报错:OutOfMenoryError异常
    可以通过-Xms和-Xmx这两个虚拟机参数指定一个程序的堆内存的大小,第一个参数设置初始值,第二个参数设置最大值
    java -Xms 1M -Xmx2M HackTheJava
  • 方法区:用于存放已被加载的类信息、常量、静态变量、及时编译器编译后的代码等数据
    和堆一样不需要梁旭的内存,并且可以动态扩展,一样跑出错误
    对这块区域进行垃圾回收的主要目标是对常量池的回收和堆类的卸载,但一般比较困难实现。

垃圾回收:

  • 可达性分析算法:
    以GCRoot为起始点进行搜索,可达的对象都是存活的,不可达的对象都是可回收的。
    GCRoot一般包含以下内容
  1. 虚拟机栈中局部变量表中引用的对象
  2. 本地方法栈中JNI中引用的对象
  3. 方法区中类静态属性引用的对象
  4. 方法区中的常量引用对象
    方法区的回收:
    finalize()实现自救
    四种引用类型:强引用,软引用,弱引用,虚引用

垃圾收集算法:

  1. 标记 - 清除
    标记阶段:程序会检查每个对象是否是活动对象,如果是活动对象,则程序会在对象头部打上标记。
    清除阶段:进行对象回收并取标记位,另外,还会判断回收后的分块与前一个空想分块是否连续。连续就合并,
    回收对象就是把对象作为分块,连接到空闲链表中。
  2. 标记 - 整理
    让所有的存活对象向一端移动,然后直接清理掉端边界以外的内存。
  3. 复制
    将内存划分为大小相等的两块,每次只能使用其中的一块,只一块用完以后就将存活的复制到另一块上去,把使用的空间进行一次清理
    现代的虚拟机采用这个方法回收新生代,一个大的Eden和两个小的Survivor。每次使用一个Eden和一个Survior,然后复制到另一个Servior
    Survivor存储不下就放到老年代。
  • 分代收集
    将堆分为新生代和老年代。
    新生代使用复制算法,老年代使用标记清除或者标记整理

垃圾收集器

除了CMS个G1之外,其他的垃圾收集器都是以串行的方式执行

  1. Serial(串行)收集器 在Client场景下的默认新生代收集器

  2. ParNew收集器:他是Serial收集器的多线程版本,在Server场景下的默认新生代收集器

  3. Parallel Scavenge收集器 : 多线程收集器,

  4. Serial Old收集器: 老年代的串行收集器

  5. Parallel Old收集器: 老年代多线程的串行收集器

  6. CMS收集器:标记清除
    四个阶段
    初始标记:仅仅只标记一下GC Roots能直接关联到的对象,速度很快,需要停顿。
    并发标记:进行GC Roots Tracing过程,整个回收过程中好事最长,不需要停顿。
    重新标记:为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那部分标记,需要停顿。
    并发清除。

  7. G1收集器:

内存分配和回收策略

Minor GC 和 Full GC
MinorGC回收新生代,频繁调用
FullGC回收老年代和新生代,少执行,时间长。

内存分配策略

  1. 对象优先在Eden分配
  2. 大对象直接进入老年代(长字符串和数组)
  3. 长期存活的对象直接进入老年代
  4. 动态进入老年代
  5. 空间分配担保

进行Full GC的条件:
老年代空间不足,空间分配担保失败

类加载机制:

在运行时动态加载的,因为会占用空间。
加载,验证,准备,解析,初始化,使用,卸载。

类的加载过程包括
加载,验证,准备,解析,初始化。
类加载器:启动类加载器,在javahome的lib中,扩展类加载器,应用程序类加载器。

支持一下
扫一扫,支持一下,爱你。
  • 微信扫一扫
  • 支付宝扫一扫