JVM调优学习

java类的加载过程

jvm的核心类加载器

什么是双亲委派

启动jvm.dll文件启动java虚拟机---》创建一个类加载器(c++)---》c++调用java代码启动sun.miscLauncher实列,然后通过这个实例启动很多java类加载器---》获取自己的加载器classloder,是AppClassLoder的实例(launcher.getClassLoder())---》运行指定的类文件---》调用main方法启动---》运行程序---》jvm销毁

 

 

类的加载:验证,准备,解析,初始化jvm,加载使用

  验证:验证字节码的准确性

  准备:给类的静态变量分配内存,并赋予默认值

  解析:将符号引用转变为直接引用(指向数据存储在内存中的指针或句柄)

  初始化:对类的静态变量初始化为指定的值,执行静态代码块

运行时常量池,类型信息,字段信息,方法信息,类加载器的引用,对应class实例的引用

 

引导类加载器:负责加载支撑jvm运行的位于jre的lib目录下的核心类库,不如rt。jar,charsets.jar等

扩展类加载器:负责加载支撑jvm运行的位于jre的lib下的ext扩展目录下的jar包

应用程序类加载器:负责加载classPash路径下的jar包,主要是加载自己写的类

自定义类加载器:负责加载用户自定义路径下的类包

 

 

 

 java虚拟机主要有

 

 java每个方法启动都会在栈中分配一块内存

  在栈帧中存储局部变量,操作数栈,动态链接,方法出口等

  程序计数器:记录程序执行到哪一行代码

  操作数栈:用于计算局部变量的内存空间

  动态链接:将符号转化为jvm认识的符号

  方法出口:记录方法返回到主线程的位置

 

 

 

jvisualvm  查看所有的jvm中的线程几各个变量对象回收机制

 

双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载

 双亲委派:

 

 

 

为什么要设计双亲委派机制?
    沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
    避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载次,保一证被加载类的唯一性
 
 
对象的创建过程
  类加载---》分配内存---》初始化--》设置对象头--->执行《init》方法
 

 

 

内存的分配方法:
  指针碰撞(默认使用)
如果Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点
的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离
  空闲列表
如果Java堆中的内存并不是规整的,已使用的内存和空 闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟
机就必须维护一个列表,记 录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,
并更新列表上的记录

对象头  实时数据  对象填充  mark word

 垃圾收集算法:

 

  

标记复制算法(gc可达性分析算法) 年轻代使用

标记清除算法  老年代使用(内存可能不能连续)

标记整理算法(内存整齐,连续)

 

 

垃圾收集器

 

 

 

 

 

 

 cms的内存模型

 

 

 

逃离分析  标量替换

 

posted @ 2021-03-09 00:24  码处世界来  阅读(48)  评论(0编辑  收藏  举报