jvm
子房为之奈何
一名程序员,热爱编程,乐于助人,希望使用代码改变生活方式。
展开
-
聊聊JVM垃圾回收算法
文章目录JVM垃圾回收算法判断对象存活的两种方式:引用计数算法可达性分析算法(java中使用)三种垃圾收集算法标记-清除算法标记-整理算法复制算法三个算法总结一个对象被垃圾回收之前,要判断它是否是垃圾对象(不再使用的对象)。JVM垃圾回收算法判断对象存活的两种方式:引用计数算法原理:为每个对象保存一个整型的引用计数器属性,记录对象被引用的情况,如果被引用着,那么它即为存活对象。优点:实现简单,便于识别,回收没有延迟性。缺点:额外内存开销;更新技术器增加时间开销;无法处理循环引用问题。什么原创 2020-09-08 22:11:09 · 125 阅读 · 0 评论 -
JVM垃圾回收器之G1(Garbage First)(一)
前面介绍了Serial GC、CMS、Parallel GC。这些垃圾回收器相较于G1,还是稍显逊色。G1在大内存的情况下优势十分明显。G1设定的目标:延迟可控的情况下获得尽可能高的吞吐量。强大的G1垃圾回收器我们知道,在G1垃圾回收器之前,前面的垃圾回收器都是将内存划分为新生代与老年代,并且它们的内存区域是连续的。而G1则不同,虽然它依旧有新生代、老年代,但是它用一个一个的region来表示。原来的内存结构G1使用的内存结构G1将内存划分为一个一个的region,内存回收就是以.原创 2020-09-03 21:38:01 · 519 阅读 · 0 评论 -
低延迟的CMS(Concurrent-Mark-Sweep)垃圾回收器
CMS垃圾回收器JDK1.5,HotSpot推出了一款在强交互应用中几乎可以认为有划时代意义的垃圾收集器: CMS(Concurrent-Mark-Sweep)。特点:真正意义上的并发收集,垃圾回收线程能够与用户线程同时工作!垃圾收集时,用户线程停顿时间(STW)很短。老年代垃圾回收器,采用标记-清除算法。工作原理清理过程:初始标记(STW)-> 并发标记(同用户线程一起)->重新标记(STW)->并发清理(同用户线程一起)->重置线程(同用户线程一起)原创 2020-09-01 21:50:12 · 249 阅读 · 0 评论 -
JVM复习之垃圾回收器(Serial ParNew Parallel)
Java和C++最大的区别就是,C++自己管理内存,Java有自动的垃圾回收功能,提供了各种各样的垃圾回收器。垃圾回收器分类对于年轻代和老年代,所用的垃圾回收器不同。如上图中Serial GC、ParNew GC、 Parallel GC是针对于年轻代的垃圾回收器。而Serial Old GC、CMS、 Parallel Old GC是针对于老年代的垃圾回收器。G1垃圾回收器采用了新的内存划分方式,所以既用于年轻代又用于老年代。Serial GC串行垃圾回收器,采用复制算法,STW的方式原创 2020-08-31 16:15:47 · 326 阅读 · 0 评论 -
JVM复习之对象的实例化、内存布局和访问定位
对象的实例化java是一门完全面向对象的语言,所以我们需要熟悉对象实例化的方式及过程。对象实例化的几种方式通过new关键词创建。Person p = new Person()通过Class类的newInstance()方式。Class clazz = Person.classPerson p = (Person)clazz.newInstance();通过Constructor的newInstance(Xxx)方法Class clazz = Person.class;原创 2020-08-29 22:17:24 · 96 阅读 · 0 评论 -
JVM复习之虚拟机栈之栈帧之动态链接和方法调用
上一小结提到了局部变量表和操作数栈,这一节接着总结栈针中的动态链接和方法的调用及方法返回地址动态连接每一个栈帧内部都包含一个指向运行时常量池中的该栈帧所属方法的引用。而包含这个引用就是为了支持当前方法的代码能够实现动态链接。在字节码文件中,所有变量和方法的引用都作为符号引用,保存在class文件的常量池。动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。为什么需要常量池?提供一些符号和常量,便于指令的识别。一个字节码文件里面如果代码量比较少,但是它包含的信息加载进内存后并不原创 2020-08-27 21:27:56 · 546 阅读 · 0 评论 -
JVM复习之虚拟机栈之栈帧之局部变量表、操作数栈
虚拟机栈出现背景由于跨平台的设计,Java指令都是根据栈来设计,不同CPU架构不同,所以不能设计为基于寄存器的。优点:指令集小,编译器容易实现缺点:性能下降,实现同样操作需要更多指令。为什么Java开发人员一提到Java内存结构,就会将内存区理解为堆和栈?栈是运行的单位。堆是存储的单位Java虚拟机栈是什么?Java Virtual Machine Stack,每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈针,对应着一次一次的方法调用。声明周期和线程生命周期一起原创 2020-08-25 21:24:41 · 385 阅读 · 0 评论 -
JVM复习之运行时数据区概述及程序计数器
运行时数据区是什么?数据运行的区域。什么样?注意:以上各区比例并非实际比例运行时数据区,有一部分会随虚拟机启动而创建,退出而销毁。有一部分会与线程对应,随线程开始而创建,结束而销毁。堆和方法区线程共享程序计数器、栈、本地栈线程独占。程序计数器也叫PC寄存器作用存放指向下一条指令的地址。就是将要执行的指令代码。由执行引擎去读取。特点内存小,几乎可忽略,运行速度最快。每个线程都有自己的程序计数器,线程私有。生命周期即线程的声明周期。唯一一个在JAVA虚拟机原创 2020-08-24 21:12:58 · 120 阅读 · 0 评论 -
JVM复习之类加载子系统
类加载子系统所处JVM中的位置类加载子系统图类加载子系统的作用类加载子系统负责从文件系统或网络中加载Class文件,class文件在开头有特定的文件标识(CAFE BABY)ClassLoader只负责class文件的加载,至于运行与否,取决于执行引擎。加载的类信息存放在方法区的内存空间中。其中除了保存类信息外,还会存放运行时常量池信息,字符串字面量和数字常量等。链接阶段验证:确保Class文件中字节流包含信息符合虚拟机要求。包括四种验证:文件格式、元数据、字符码、符号引用。原创 2020-08-24 20:46:05 · 105 阅读 · 0 评论