JVM随笔(上)

一、类的加载、连接和初始化

   1、加载:查找并加载类的二进制数据到JVM

   2、连接:

         验证:保证被加载类的正确性

         准备:给类的静态变量分配内存空间,赋值一个默认的初始值

         解析:把类中的符号引用转换为直接引用

                  在把java编译为class文件时,虚拟机并不知道所引用的地址:助记符:符号引用转为真正的直接引用,找到对应的直接地址

   3、初始化:给类的静态变量赋值

   注意:Final常量

           1、常量的值在编译时期可以确定的,则会将常量放进方法调用者的常量池里面,例如:public static final String str="Hello,parent";

          2、常量的值在非编译期间确定的,那么这个常量就不会放进方法调用者的常量池里面,

          例如:public static final String str =UUID.randomUUID().toString();

二、ClassLoader

  1、java虚拟机自带的加载器

      BootStrap ClassLoader 根加载器(加载系统的包,JDK核心库,rt.jar) 由C++实现

      Ext           ClassLoader  扩展类加载器(加载一些扩展jar包中的类)

      App/Sys   ClassLoader  应用(系统)加载器,(我们自己编写的java类)

  2、用户自定义的加载器

      ClassLoader:只需要继承这个抽象类来定义自己的类加载器

  3、双亲委派机制

       加载顺序:先让BootStrap去加载,如果BootStrap不能加载,则交给Ext去加载,如果Ext不能加载,才由AppClassLoader加载

       好处:可以保护java的核心类不会被自己定义的类替代

三、Native:

     1、本地方法,只要带了这个关键字,说明Java的作用范围达不到

     2、JNI:Java Native Interface:java本地方法接口

四、程序计数器

    1、每个线程都有一个程序计数器,是线程私有的

JVM随笔(上)

    2、程序计数器就是一块十分小的内存空间(基本可以忽略不计),作用可以看作是字节码的执行的行号指示器

五、方法区(Method Area)

     1、方法区是Java虚拟机规范中定义的运行时数据区域之一,和堆(heap)一样可以在线程之间共享

    2、JDK1.7之前

     永久代:用于存储一些虚拟机加载类信息,常量,字符串、静态变量等等。。。。这些东西都会放到永久代中;

     永久代大小空间是有限的:如果满了 OutOfMemoryError:PermGen

    3、JDK1.8之后

       彻底将永久代移除 HotSpot jvm ,Java Heap 中或者 Metaspcace(Native Heap)元空间;

       元空间就是方法区在 HotSpot jvm 的实现;

       方法区重要就是来存:类信息,常量,字符串、静态变量、符号引用、方法代码。。。。。。

       元空间和永久代,都是对JVM规范中方法区的实现。

       元空间和永久代最大的区别:==元空间并不在Java虚拟机中,使用的是本地内存!==

    -XX:MetasapceSize10m

上一篇:Class的加载过程


下一篇:JVM(一)——概述和类加载子系统