JVM虚拟机
文章平均质量分 85
西瓜游侠
希望自己能够开心
展开
-
垃圾收集算法(理论)
分代收集理论一般至少会把Java堆划分为 新生代(Young Generation) 和 老年代(Old Generation) 两个区域。在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。在新生代用复制算法,在老年代用标记-清理或标记-整理算法。几个概念:新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集...原创 2020-02-02 16:16:41 · 229 阅读 · 0 评论 -
强引用、软引用、弱引用、虚引用
参考:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明 著在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为4种(引用强度依次减弱):强引用(Strongly Re-ference)软引用(Soft Reference)弱引用(Weak Reference)虚引用(PhantomReference)(1)强引用:是最传统的“引用”的定义,是指...原创 2020-02-02 00:40:33 · 130 阅读 · 0 评论 -
引用不可达的对象什么时候才会被真正回收?
参考:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明 著在可达性分析算法中判定为不可达的对象,也不是“非死不可”的,要真正宣告一个对象死亡,至少要 经历两次标记过程。第一次标记如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记。第二次标记经过第一次标记后的对象,根据 此对象是否有必要执行finalize()方法 进行筛选,随后...原创 2020-02-02 00:29:16 · 1268 阅读 · 0 评论 -
JVM如何判断Java对象是否存活,是否要被GC回收?
GC在对堆内存进行垃圾清理之前,需要判断哪些Java对象不再被使用,需要被回收。通常有两种算法:引用计数算法、可达性分析算法。引用计数算法(已被淘汰)引用计数算法:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。存在的问题:主流的Java虚拟机里面都没有选用引用计数算法来管理内存,因为单纯的引用计...原创 2020-02-02 00:11:23 · 1409 阅读 · 0 评论 -
对象的内存布局
对象的内存布局(1)对象头第一部分:Mark Word。用于存储自身的运行时数据,包括哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。第二部分:类型指针。即对象指向它的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。不过并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身。另外,如果对象是一个Java原创 2017-08-26 11:12:29 · 371 阅读 · 0 评论 -
Java内存模型
转载:http://www.cnblogs.com/leesf456/p/5291484.html Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model, JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。1、Java并发基础在并发编程中存在两个关键问题:(1) 线程之间如何通信;(2)线程之间如何同步转载 2017-07-31 10:11:07 · 369 阅读 · 0 评论 -
JVM知识点总结
1、JVM运行时内存划分原创 2017-07-29 10:51:22 · 815 阅读 · 0 评论 -
JVM中对象的访问定位方式(句柄、直接指针)
建立对象是为了使用对象,我们的Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位、访问堆中的对象的具体位置,所以对象访问方法也是取决于虚拟机的实现而决定的。目前主流的访问方式有使用句柄和直接指针两种。(1)通过句柄访问对象 优点:reference存储的是稳定的原创 2017-08-26 11:23:05 · 1097 阅读 · 0 评论 -
对象的创建过程(new 的过程)
在Java程序当中每时每刻都有对象被创建出来。在语言层面上,创建对象通常仅仅是使用一个new关键字而已,而在虚拟机中,对象(仅限于普通Java对象)的创建又是怎样一个过程呢?虚拟机遇到一条new指令时,首先将去检查这个指令的参数能否在常量池中定位到一个类的符号引用。并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,那就先执行类加载的过程(关于类加载过程在后面的博客中会进行介绍)。原创 2017-08-26 11:07:56 · 5945 阅读 · 1 评论 -
虚拟机内的锁优化(偏向锁,轻量级锁,自旋锁,重量级锁)
基础知识之一:锁的类型锁从宏观上分为:(1)乐观锁;(2)悲观锁。(1)乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取的方式是在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基本都是转载 2017-08-14 16:15:28 · 1941 阅读 · 1 评论 -
同步的三种方式:volatile、锁、final
转载:http://www.cnblogs.com/leesf456/p/5291484.html1、volatile1.1 介绍关键字volatile是Java虚拟机提供的最轻量级的同步机制。 当一个变量定义为volatile时,它将具备两种特性:(1)可见性;(2)禁止指令重排序。 可见性 当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即获得的,但是基于volati转载 2017-07-30 21:57:42 · 1676 阅读 · 0 评论 -
内存屏障
内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种CPU指令,用于控制特定条件下的重排序和内存可见性问题。Java编译器也会根据内存屏障的规则禁止重排序。内存屏障可以被分为以下几种类型:LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。S原创 2017-07-30 22:02:48 · 1109 阅读 · 0 评论 -
常见的垃圾收集器
转载:http://ginobefunny.com/post/jvm_interview_questions/这里讨论JDK 1.7 Update 14之后的HotSpot虚拟机,包含的虚拟机如下图所示(存在连线的表示可以搭配使用): 1、Serial收集器(单线程)最基本、发展历史最悠久,在JDK 1.3之前是新生代收集的唯一选择;是一个单线程(只会使用一个收集线程,且必须暂停所有工作线程)转载 2017-07-30 16:36:35 · 752 阅读 · 0 评论 -
类加载器、双亲委派模型
类加载器用于加载类。对于任意一个类,都需要由加载它的 类加载器 和这个 类 一同确立其在Java虚拟机中的唯一性。每一个类加载器,都有一个独立的类名称空间。由不同的类加载器加载的类必定不相等。1、类加载器从虚拟机角度看,只存在两种类加载器:1. 启动类加载器。2. 其他类加载器。 从开发人员角度看,包括如下类加载器:1. 启动类加载器。2. 扩展类加载器。3. 应用程序类加载器。4. 自定义类加载原创 2017-07-30 15:26:06 · 488 阅读 · 0 评论 -
JVM类加载机制
虚拟机把Class文件(描述类的数据)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是类加载机制。Java中,类显性的加载、连接、初始化都是在 运行期 完成。Class文件是一串二进制的字节流。1、类加载总体流程图类的整个生命周期分为以上七个阶段:加载、验证、准备、解析、初始化、使用、卸载。2、虚拟机规范规定了如下几种情况就必须要进行初始化遇到ne原创 2017-07-30 11:31:53 · 367 阅读 · 0 评论 -
JVM堆内存分配与回收策略
1、堆划分在JDK1.7以及之前的版本中,堆内存通常被分为三块区域:新生代、老年代、永久代。 新生代又分为:Eden区、From Survivor区(S0)、To Survivor区(S1)。默认8:1:1。 而在JDK1.8中情况发生了变化,把存放元数据中的永久内存从堆内存中移到了本地内存(native memory)中。 JDK1.8也提供了一个新的设置Matespace(元空间)内存大小原创 2017-07-29 16:39:55 · 790 阅读 · 0 评论 -
JVM运行时内存划分
在Java运行时的数据区里,由JVM管理的内存区域分为下图几个模块: 其中, 程序计数器、虚拟机栈、本地方法栈 是线程私有的,每个线程都有一份。 堆、方法区 是线程共享的。1、程序计数器(Program Counter Register)线程私有。程序计数器是一个较小的内存空间,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个原创 2017-07-29 15:10:28 · 732 阅读 · 0 评论