概述

关于java虚拟机,学过好几遍,但学一遍忘一遍。而我这个人,经常被人说“记忆力”好,比如我喜欢看电视剧,台词都记得。其实并不是我记忆力有多么的好,而是经常重复。前几天忽然想明白,我是如何记住那些电视剧台词的。首先要有兴趣记,兴趣这个事儿吧,是可以有的。只要你愿意对一件事培养兴趣,是能产生兴趣的,关键是你不愿意。而工作技能知识的学习,是需要有兴趣的,要有探索新知识的能力。再就是重复,重复次数多了,自然就能记住,比如快排算法,每天看一遍,默写一遍,总是能记住的。最后我能想到的一点是,把你想记住的内容,与你已经产生浓厚兴趣的其他事情建立联系。知识联系起来,就容易记住了。

虚拟机一些参数

# 设置堆内存,最小内存Xms,最大内存 Xmx。最大最小一样,可以避免堆自动扩展
-Xmx4g -Xms4g
# 设置方法区大小
-XX:PermSize=10m -XX:MaxPermSize=10m

对象是否存活

虚拟机判断可以回收已经不被使用的对象,书上介绍了两种判断方法。

  1. 引用计数法
    有引用时,计数器加1;引用失效,计数器减1。优点是实现简单,判定效率高。问题是:无法解决循环引用的问题。
  2. 可达性分析(Reachability Analysis)
    基本思想是以可以作为GC Roots的对象作为起点,向下搜索,搜索路径成为引用链(Reference Chain)。当一个对象不被任何一个GC Roots对象引用,就可以被回收。

可以作为GC Roots的对象有如下几种情况:

  1. 虚拟机栈中引用的对象
  2. 方法区中 类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(Native方法)引用的对象

四种引用类型,由强到弱依次是:

  1. 强引用( Strong Reference )
    普遍存在的类似于Object obj = new Object()就是强引用
  2. 软引用( Soft Reference)
    描述一下有用 但非必须的对象。在系统将要发生内存溢出之前,会把这些对象列入回收范围内,进行第二次回收。
  3. 弱引用( Week Reference )
    也是描述非必须的对象,这些对象只能生存到下一次垃圾回收之前。
  4. 虚引用( Phantom Reference )
    一个对象是否有虚引用存在,不影响生存时间。也无法通过虚引用获取一个对象实例。设置虚引用的目的是:在这个对象被回收的时候,收到一个系统通知

对象实例回收过程:
一个对象被回收要经历两次标记过程:一是经过可达性分析后,没有与GC Roots相关的引用,这时,对象会被第一次标记,并判断是否需要筛选(执行其finalize方法);二是再次标记,则会被回收。如果第二次标记时,对象被重新引用,则可以逃过被回收。

类的回收:
当一个类被判断为无用类时,可以被回收。判断条件比较苛刻,必须同时满足三个条件。一是该类所有实例对象已经被回收;二是加载改类的ClassLoader被回收;三是该类的java.lang.Class对象没有在任何地方被引用,无法通过反射访问该方法。