Change Dir

先知cd——热爱生活是一切艺术的开始

统计

留言簿(18)

积分与排名

“牛”们的博客

各个公司技术

我的链接

淘宝技术

阅读排行榜

评论排行榜

JVM学习笔记(2)——类型生命周期

直奔主题吧

  1. 一个java类经过装载、连接和初始化三步达到程序可用状态,其中连接又包含验证、准备和可选的解析过程,验证是检查数据格式、准备是分配内存、解析负责把常量池的符号引用转换为直接引用。
  2. jvm必须在每个类或接口首次主动使用时初始化,有六种主动使用场景:1)创建某个类的新实例,2)调用某个类的静态方法,3)使用某个类或接口的静态字段,用final修饰的静态字段除外,它被初始化为一个编译时的常量表达式,4)调用Java api中的某些反射方法,5)初始化某个类的子类,6)虚拟机启动时某个被标明为启动类的类(含有main方法的类)。
  3. 某个类要初始化,其所有的祖先类必须之前被初始化;接口则不同,只有在某个接口声明的非常量字段被使用时,该接口才初始化。
  4. 类装载的三个基本动作:通过完全限定名找到二进制数据流,解析为方法区内的数据结构,创建一个该类型的java.lang.Class的实例。
  5. 类装载有可能存在预先装载,在预先装载时出问题,会抛出一个LinkageError的异常。
  6. 在准备阶段,内存分配是初始化为默认值的,而不是实际的初始值。默认值列表如下:
    类型 默认初始值
    int 0
    long 0L
    short (short)0
    char '\u0000'
    byte (byte)0
    boolean false
    reference null
    float 0.0f
    double 0.0d
  7. 在准备和解析完后,才进入初始化阶段,为变量赋予真正的初始值。
  8. 初始化类的步骤:1)如果类存在直接超类,且直接超类还没有被初始化,就先初始化直接超类。2)如果类存在一个类初始化方法,就执行此方法。
  9. 第一个被初始化的类永远都是Object。
  10. 所有的类变量初始化语句和类型的静态初始化器都被java编译器收集在一起,放到一个特殊的方法中——<clinit>。
  11. 如果接口包含任何不能在编译时被解析成为一个常量的字段初始化语句,接口就会拥有一个<clinit>方法。
  12. 类变量如果直接赋常量值,那么类是不会初始化的。
  13. 类实例化的四种途径:1)new操作符。2)调用Class或Constructor的newInstance()方法。3)调用任何现有对象的clone()方法。4)通过ObjectInputStream的readObject()方法反序列化。
  14. JVM为它编译的每一个类都至少生成一个实例初始化方法<init>。
  15. 使用启动类装载器装载的类,永远都不会被垃圾收集。

posted on 2012-09-19 18:13 changedi 阅读(362) 评论(0)  编辑  收藏 所属分类: Java技术


只有注册用户登录后才能发表评论。


网站导航: