JVM知识点更新

CMS垃圾收集的过程

  • 初始标记:在这个阶段,虚拟机需要停暂停正在执行的任务,标记一下GC roots能够直接关联到的对象
  • 并发标记: 在初始标记的基础上继续向下追溯标记
  • 重新标记:在并发标记期间因为用户线程的运作而导致标记发生了变化,需要重新标记,需要停顿
  • 并发清除:清理垃圾

FULL GC次数太多如何调优

  • 不要调用System.gc:不需要用此方法就不要使用,让虚拟机管理自己的内存
  • 老年代空间不足:让对象在新生代多存活一段时间,避免创建大的对象或数组
  • 增大老年代的空间

JVM直接内存

在jdk1.4中新加入了NIO类,引入一种基于通道和缓冲区的I/O方式,它可以使native函数库在堆外分配内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。避免在java堆和native堆中来回复制数据。

直接内存的使用场景

  • 有很大的数据需要存储,它的生命周期很长
  • 适合频繁的I/O操作,例如网络并发场景

java内存模型

java内存模型(JMM)是线程间通信的控制机制,JMM定义了主内存和线程之间的抽象关系。线程之间的共享变量存储在主内存,每个线程都有一个私有的本地内存,本地内存存储了该线程以读/写共享变量的副本。

符号引用与直接引用

符号引用是以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要能够无歧义的定位到目标即可
直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载如内存中了。

如何自定义一个类加载器

继承ClassLoader类并实现findClass方法

client模式与server模式的区别

Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.原因是:

当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译器, 而-server模式启动的虚拟机采用相对重量级,代号为C2的编译器. C2比C1编译器编译的相对彻底,服务起来之后,性能更高.

你可能感兴趣的:(JVM知识点更新)