JVM

JVM类加载机制

大致看了一下类加载机制,有这么几个知识点:

  1. 类加载机制中的类初始化,主要是初始化静态变量以及静态代码块
  2. 双亲委派模型是调用父的类加载器。

我首先说一下简化版类加载机制

首先将二进制文件读进来,并且以方法区中的数据存储方式进行存储,然后再堆中生成相应的class对象,便于方法数据数据的读取。
深入一点就是:
首先进行验证:
验证的意思是判断该二进制文件是否正常,是否满足java二进制文件的要求,比如java二进制文件是以0xCAFEBABE开头的。
加载:对其中的static进行分配空间,并且对其进行赋值为0的操作,注意这个时候有两个东西一个如果是使用final的修饰的变量的话,就需要显示赋值,或者在构造方法中进行赋值,如果是final static 修饰的变量的话,它一定要赋显性值,并且其在准备阶段不会被赋值为0而是赋值为所赋的值。
解析
将符号应用转换为直接引用(意思就是将常量池中的符号引用转换为直接引用)
初始:
如果有父类就对其先初始化,然后初始化static变量以及static{}j进行初始化,
类初始化的方式有哪些?

  1. 通过调用static方法
  2. 通过初始化子类
  3. 如果该类是启动类也将被初始化
  4. 调用该类的new,
  5. 反射加载

类加载器

站在Java虚拟机的角度来讲,只存在两种不同的类加载器:启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有很多其他的虚拟机是用Java语言实现的),是虚拟机自身的一部分;所有其它的类加载器:这些类加载器都由Java语言实现,独立于虚拟机之外,并且全部继承自抽象类 java.lang.ClassLoader,这些类加载器需要由启动类加载器加载到内存中之后才能去加载其他的类。

一般类加载的话

  1. BootstrapClassLoader,负责加载存放在 JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被 -Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.开头的类均被 BootstrapClassLoader加载)。启动类加载器是无法被Java程序直接引用的。
  2. ExtensionClassLoader,该加载器由 sun.misc.Launcher$ExtClassLoader实现,它负责加载 JDK\jre\lib\ext目录中,或者由 java.ext.dirs系统变量指定的路径中的所有类库(如javax.开头的类),开发者可以直接使用扩展类加载器。
  3. ApplicationClassLoader,该类加载器由 sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

类加载的方式有三种
4. 命令行启动应用时候由JVM初始化加载
5. 通过Class.forName()方法动态加载
6. 通过ClassLoader.loadClass()方法动态加载

双亲委派模型:

  1. 开始:ApplicationClassLoader加载类是,自己找,交给ExtensionClassLoad去找,
  2. ExtensionClassloader加载类时,它不找,它交给ApplicationClassloader进行查找。
  3. ApplicationClassLoader找不到的话,交给ExtensionClassLoader进行查找,如果ExtensionClassLoader找不到的话,就交给ApplicationClassLoader进行查找,如果ApplicationClassloader找不到的话就报出类找不到异常。

运行时内存区域,由于这里基本上都懂,我就摊点重要的

java堆区分为年轻代和老年代,年轻代又被分为了eden、from、to区,eden:from :to为8:1:1的内存比例,有的时候方法区也被称为永久代,因为仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,或者说使用永久代来实现方法区而已。
有关于一些参数的设定
-Xms设置堆的最小空间大小。
-Xmx设置堆的最大空间大小。
-XX:NewSize设置新生代最小空间大小。
-XX:MaxNewSize设置新生代最大空间大小。
-XX:PermSize设置永久代最小空间大小。
-XX:MaxPermSize设置永久代最大空间大小。
-Xss设置每个线程的堆栈大小。

这里时没法设置老年代的大小但是可以通过设置堆和年轻代来算出来。

判断对象是否存活

  1. 引用计数法:看对象是否被引用如果引用就加一,如果引用释放就减一
    无法解决对象互相引用的情况
  2. 可达性分析法。从GC root开始向下搜索,搜索的路劲称为引用链,如果一个对象引用没有引用与GC root相连的话,就认为其为没有存货
    GC root
    一般有:
  3. 虚拟栈的变量
  4. 方法区中的静态变量
  5. 方法区中的常量引用
  6. 本地方法栈的变量引用

一般垃圾回收算法:

  1. 标记清除算法:将没用的对象进行标记然后删除
  2. 复制算法:
  3. 标记清除算法:
  4. 分代收集法:把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

未完待续!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值