JVM垃圾回收器G1和CMS 因为在学习JVM的垃圾回收器的过程中,发现CMS这个垃圾回收器在JDK版本中几乎没有出场,取而代之的是类似于CMS的G1收集器,这篇笔记记录下这两者的异同,以及CMS退居幕后的原因。 CMS收集器 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。这是因为CMS收集器工作时,GC工作线程与用户线程可以并发执行,以此来达到降低收集停......
什么是可伸缩性? 当硬件性能提升,如cpu提升、内存提升、IO性能提升时,应用程序的处理能力是否会跟随硬件有相应的增加。 如何对可伸缩性进行优化的基准 开发中需要针对具体需求进行定制,如何以以测试为基准进行优化。 多线程的可伸缩性的限制 在所有的并发程度中都会有一部分的串行化的任务,如I/O阻塞、对阻塞队列进行读取和写入等 JVM对锁的优化 锁消除,基于逃逸分析可以把没有逃逸出栈的对象中的锁消除。 锁粗化,将......
之前在看JVM的锁优化中看到JVM中对synchronized实现中,在不同的情况下会对锁进行优化,其中有几种不同的锁实现,此篇做一个笔记,在这个月的月度分享中会将这篇分享到部门同事,共同进步~ JVM锁类型 对象头模型: 轻量级锁 轻量级锁的“轻”是对比重量级锁来的,因为重量级锁需要对互斥量进行更新,操作更加消耗性能,而轻量级锁则是在此基础上继续优化,轻量级锁锁定不会去更新互斥量,而是会在调用这个对象的栈帧......
上次学习了JVM的类加载过程,之前学习过的双亲委派模型变得生疏了,这篇笔记用于重新学习和以后复习~ JVM双亲委派模型 什么是双亲委派模型? 在加载一个类之前,先使用父加载器加载,若返回null才进行加载。 引入双亲委派模型是为了解决一些核心类,只能由某个加载器进行加载,避免有全限名一样但类加载器不一样的情况。 类的唯一标识是什么? 加载类的类加载器+类全限名 双亲委派模型的破坏 jdk1.2,双亲委派模型出......
JVM类加载过程 什么是类加载? 在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验、转换解析、初始化,使这些数据最终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做JVM的类加载机制。 类加载过程分别是什么? Class类文件加载 首先类加载器通过一个类的全限定名获取......
指定堆大小 12345//指定堆最大-XX:Xmx1024m//指定堆初始大小-XX:Xms1024m Java方法栈 指定线程的栈最大空间 12//默认256K-XX:Xss128K 影响GC因素: 局部变量表槽位复用 在方法体中声明的变量都会在局部变量表中,如果超过其作用域,则会被之后声明的变量复用,如果是引用类型,则会失去引用,被GC。但如果只是超过作用域但是没有被其他变量复用,则不会失去引用。 栈内分配......
Java的线程安全和锁优化 线程安全 在Java中或者说在Jvm实现中,线程安全是一个相对的概念,某个对象在单独使用某个操作时是线程安全的,但在某些操作顺序却不是线程安全,需要额外的同步。该节将介绍线程安全的概念和在Java中的实现。 Java语言中的线程安全 不可变 final类型的基本类型,在初始化时,如果没有发生this引用逃逸正确地初始化,在以后的使用中值不会变更,是线程安全的;对象行为不会对自身状态变......
Java与线程模型 线程的实现 内核线程实现 定义:内核线程(Kernel-Level Thread,KLT):直接由操作系统内核支持的线程,由内核来完成线程切换 优势:实现依赖内核,实现简单 劣势:部分操作需要从用户态切换到内核态,开销较大 用户线程实现 定义 广义:一个线程不是内核线程,就可以认为是用户线程,在这个定义上讲,轻量级进程也是用户线程,但是轻量级进程的实现是建立在内核之上的......
Jvm调优的目的 为使得jvm虚拟机在不同硬件配置的机器上获取更好的性能,以及更好的稳定性,调整默认的jvm可以使得我们的程序在性能上有所提升。如: 如项目中有大量的新对象的寿命很短,可以适当把新生代的大小调整到合适的大小。 调整新生代进入老年代的阈值,使得避免新生代多次复制GC一些大概率会进入老年代的对象。 注意:JVM调优需要针对当前项目的特点进行调整,最好在调优前使用分析插件分析程序在运行时的内存......