JVM基础知识汇总

1.hotspot JVM 后台进程:
1.1 虚拟机进程
1.2 GC进程
1.3 信号分发进程
1.4 周期性任务进程

2.JVM 运行时的内存:
2.1 新生代:eden 80% ,from servivor 10% ,to survor10%
2.2 老年代

3.Java 四种引用类型:
1.强引用:把一个对象赋给一个引用变量,这个引用变量就是一个强引用。
2.弱引用
3.软引用
4.虚引用:虚引用的主要作用是跟踪对象被垃圾回收的状态。

4.垃圾回收器分类:
分为两个区(新生代、老年代)
新生代:
1.Serial 垃圾收集器(单线程、复制算法)
2.ParNew 垃圾收集器(Serial+多线程)
3.parallel scavenge 收集器(多线程算法、高效)
老年代:
1.serial Old(单线程、标记算法):
2.parallel Old(多线程、标记整理算法)
3.*CMS(多线程、标记清除算法):主要目标是获取最短垃圾回收停顿时间,和其他年老代使用标记-整理算法不同,它使用多线程的标记-清除算法。
a)初始标记
b)并发标记
c)重新标记
d)并发删除
4.G1 收集器

5. Java IO/NIO:
IO 是面向流的,NIO 是面向缓冲区的
IO(五种模型):
1.阻塞IO模型
2.非阻塞IO模型
3.多路复用 IO 模型
4.信号驱动 IO 模型
5.异步IO模型:只需要先发起一个请求,当接收内核返回的成功信号时表示 IO 操作已经完成,可以直接去使用数据了。
NIO:
1.Channel(通道):可以用来进行读操作,又可以用来进行写操作
2.Buffer(缓冲区):缓冲区,实际上是一个容器,是一个连续数组,读取或写入的数据都必须经由 Buffer。
3.Selector:能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。

6.JVM 类加载机制:
1.加载:这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的入口
2.验证:确保 Class 文件的字节流中包含的信息是否符合当前虚拟机的要求
3.准备:准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,在方法区中分配这些变量所使用的内存空间。
4.解析:虚拟机将常量池中的符号引用替换为直接引用的过程。
符号引用:引用的目标并不一定要已经加载到内存中,但是它们能接受的符号引用必须是一致的,因为符号引用的字面量形式明确定义在 Java 虚拟机规范的 Class 文件格式中。
直接引用:是可以指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄,直接引用存在,那么引用目标必定在常量池中
5.初始化:开始正在执行类定义的Java代码
a)执行类构造器方法的过程
以下几种不会执行初始化:

  1. 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。
  2. 定义对象数组,不会触发该类的初始化。
  3. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触

发定义常量所在的类。

  1. 通过类名获取 Class 对象,不会触发类的初始化。
  2. 通过 Class.forName 加载指定类时,如果指定参数 initialize 为 false 时,也不会触发类初

始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。

  1. 通过 ClassLoader 默认的 loadClass 方法,也不会触发初始化动作。

6、类加载器:
1.启动类加载器(bootstrap ClassLoader)
2.扩展类加载器(Extension ClassLoader)
3.应用程序类加载器(Application ClassLoader)
7、双亲委派:
当一个类获得加载请求时,首先不会自己加载类,会委派给父类完成,当父类加载器无法完成请求的时候,子类才会尝试自己加载。主要保证不同的类加载器最终得到的都是同样的Object对象。

你可能感兴趣的:(java,jvm)