java虚拟机(jvm高级特性)
通过不同方面来更加深入了解java虚拟机,同时也能记录自己的学习过程
张xiao张
分享自己学习心得
展开
-
复习整理篇-volatile关键字
volatile关键字浅析1.volatile关键字的两层含义 一旦一个变量(类成员变量、类的静态成员变量)被volatile修饰之后,就具备了两层含义: ①保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其它线程来说是立即可见的。 ②禁止进行指令重排序2.volatile保证原子性吗? volatile关键字保证了操作的可见性,不能保证对变量的任何操作都是原子性的。3.volatile保证有序性吗? volatile在一定程度上保证有序性。 vol原创 2020-11-03 15:57:26 · 344 阅读 · 0 评论 -
复习整理篇-Synchronized关键字
原子性:一个操作/一系列操作可见性:当一个线程修改了共享属性的值后,其它线程能立刻看到共享属性值的更改。有序性:程序的运行顺序看起来和我们编写逻辑的顺序一致,但计算机在实际执行中却不一定。Synchronized关键字一.作用 保证同一时刻最多只有1个线程执行被Synchronized修饰的方法/代码; 其它线程必须等待当前线程执行完该方法/代码块后才能执行该方法/代码块。二.应用场景 保证线程安全,解决多线程中的并发同步问题(实现的是阻塞型并发) a.修饰实例方法/代码块时,(同原创 2020-11-02 17:33:34 · 133 阅读 · 0 评论 -
复习整理篇-类加载
一.类加载机制 JVM把class文件加载到内存,并对数据进行校验、准备、解析、初始化,最终形成JVM可以直接使用的Java类型的过程。图片引用:https://baijiahao.baidu.com/s?id=1636309817155065432&wfr=spider&for=pc1.加载 将class字节码文件加载到内存中,并将这些数据转换成方法区中的运行时数据(静态变量、静态代码库、常量池等),在堆中生成一个class类对象代表这个类(反射原理),作为方法区类数据的转载 2020-10-31 16:50:47 · 434 阅读 · 3 评论 -
复习整理篇-线程安全与锁优化
一.线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。 1.Java语言中的线程安全 根据线程安全的安全强度由强到弱来排序,我们可以把Java语言中各种操作共享的数据分为以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。 (1)不可变:不可变的对象一定是线程安全的;Java语言中,如果共享数据是一个基本数据类型,那原创 2020-10-30 14:41:06 · 104 阅读 · 1 评论 -
复习整理篇-常量池
了解 常量池可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在Class文件中第一个出现的表类型数据项目。 由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值,这个容量计数是从1而不是从0开始的。正文开始————常量池常量池分为:静态常量池、运行时常量池 静态常量池存在于Class文件中,比如经常用的javap-verbose中; 运行原创 2020-10-29 16:19:07 · 595 阅读 · 6 评论 -
复习整理篇-对象已“死”吗?
对象“死”了吗?(对象是否存活)在堆里存放着Java世界中几乎所有的对象实例,垃圾回收器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象)。引用计数算法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。可达性分析算法通过可达性分析来判定对象是否存活的:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索原创 2020-10-25 14:59:28 · 79 阅读 · 0 评论 -
复习整理篇-Java虚拟机内存区域
JVM内存区域图片来自:https://blog.csdn.net/cb_lcl/article/details/810350271.程序计数器内存空间小,线程私有。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空。此内存区域是唯一一个在Java虚拟原创 2020-10-24 15:51:40 · 84 阅读 · 0 评论 -
复习整理篇-JVM垃圾回收器
垃圾回收器新生代收集器:Serial、ParNew、Parallel Scavenge老年代收集器:CMS、Serial Old、Parallel Old整堆收集器:G1图片来自:https://www.cnblogs.com/chenpt/p/9803298.html1.Serial收集器使用复制算法Serial收集器是最基本、发展历史最悠久的收集器。特点:单线程、简单高效(与其他收集器的单线程相比),对于对于限定CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃原创 2020-10-23 20:15:31 · 89 阅读 · 0 评论 -
复习整理篇-java垃圾回收算法
一.常用的垃圾回收算法1.标记-清除算法标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段,在标记阶段首先通过根节点,标记所有从根节点开始的对象,未被标记的对象就是未被引用垃圾对象。然后在清除阶段,清除所有未被标记的对象。这个算法带来的一个问题就是会存在大量的空间碎片,因为回收的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc。Full GC触发条件:①老年代被写满②持久代被写满③System.gc()被显示调用④上一次GC之后Heap的各个域分配策略动态变化-缺原创 2020-10-22 23:25:37 · 100 阅读 · 0 评论