CMS垃圾收集器

从 阶段标记过的对象开始,标记其它存活对象,这个阶段垃圾回收线程和应用线程同时运行,重新标记会STW,停顿时间较长,所以在这之前进行一次Minor GC,会减少很多对老年代对象的无效引用,由于上一个阶段是并发执行的未标记的变化对象只是标记成了Dirty对象,还没有处理, 就是来标记这些,这些受到影响的老年代对象所在的Card会被标记成Dirty,用于重新标记阶段扫描,老年代对象的Card被标记为Dirty的可能原因如下面绿线所示

常用新生代垃圾收集器

Parallel scavenge是一个新生代垃圾收集器,它是用复制算法的垃圾收集器,又是多线程并行的垃圾收集器,和ParNew类似.吞吐量优先的垃圾收集器,是Java1.8默认的新生代垃圾收集器.,Serial是单线程垃圾回收器,当需要执行垃圾回收时,程序会暂停一切工作,然后单线程执行垃圾回收.,会默认使用ParNew作为新生代收集器,是HotSpot在Client模式下默认的新生代垃圾收集器

JVM垃圾回收算法标记清除和复制算法

1.效率低下,需要遍历整个堆.进行GC的时候需要停止应用程序,程序运行时堆中对象的状态(默认为0未标记,1为标记过),假如堆内存的可用空间被消耗完,那么GC线程就会启动,停止掉应用程序,使用根可达性算法进行搜索标记.,当堆中的有效空间被耗尽时,JVM就会停止整个程序(也被称为stop the world),然后开始两项工作.一是: , 而是:,在程序运行期间,当堆中的可用内存被耗尽时,GC线程就会启动并停止程序,GC线程将存活的对象标记一遍,没有被标记的对象就是垃圾对象,最后这些垃圾对象会被清除掉,然后重新唤醒应用程序.

JVM判断对象是否存活

Java中没有使用引用计数法,堆中未发现 对象,说明JVM虚拟机未使用引用计数法来判断对象是否存活,堆中发现 对象

JAVA的对象访问定位

句柄访问和直接访问的特点,句柄访问,句柄访问,直接访问

JVM内存模型

区别在于 不在JVM虚拟机中,因此 的空间受本地内存制约,永久代是方法区的实现,引入了元数据区,什么是元空间

JVM程序计数器,虚拟机栈,本地方法栈

在同一时间内,CPU只会执行一个线程中的一个指令,为了每次切换回来都能到正确的执行位置,每个线程都会有一个独立的线程计数器,每个计数器不会相互影响,并且是线程私有的,在活动线程中,栈顶的栈帧才是有效的,与这个栈帧关联的方式是当前方法,执行引擎运行的所有字节码指令都只会作用于当前栈帧,java虚拟机栈描述的是Java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧,对于我们来说主要关注栈内存,也是方法内的局部变量,区别是:本地方法栈执行的是Native方法服务,而虚拟机栈执行的是java方法

JVM常量池

同时运行时常量池保存着class文件中描述的符号引用,在类的解析阶段会把这些符号引用转换成直接引用(实例对象的内存地址),翻译出来的直接引用也是存储在运行时常量池中,在编译期间就已经确定,会进入字符串常量池,但是字符串常量池只会保存一个引用,最终还是会在堆上创建一个 对象,字符串常量池是JVM维护的一个字符串实例引用表,在HotSpot VM中它是叫做一个StringTable的全局表,运行时常量池的作用是存储class文件常量池中的符号引用

Java虚拟机的发展历史

使得 Java 编译程序只需生成在 Java 虚拟机上运行的目标代码(字节码),Azul VM 是 Azul System 公司在 Sun HotSpot VM 基础上进行大量改进后的产品,Java 语言在不同平台上运行时不需要重新编译,Azul 在 2010 年发布了 Java 虚拟机 —-Zing VM

Java垃圾回收jconsole分析

与上面代码的区别我们 变量有成员变量变成了局部变量. 局部变量在栈上分配内存,当方法结束,栈空间消失,栈上的变量或者引用地址将失效,本案例中 对象是分配在堆内存上,栈空间的消失导致 对象无法被使用到,随后就会被垃圾回收掉. 所以本案例的堆内存变量将呈现出折线的效果.,由于我们使用的是成员变量,所以垃圾回收器一致不能回收内存,所以整个堆的内存趋势是一路上涨.,代码案例1:,代码案例2:

入门小站