合集-深入理解Java虚拟机
摘要:概述 上一章我们学习了Class文件存储格式的具体细节,在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。而虚拟机如何加载这些Class文件,Class文件中的信息进入到虚拟机后会发生什么变化,这些都是本章将要讲解的内容。 Java虚拟机把描述类的数据从Class文件加
阅读全文
摘要:类加载器 Java虚拟机设计团队有意把类加载阶段中的通过一个类的全限定名来获取描述该类的二进制字节流这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动 作的代码被称为类加载器(Class Loader)。 类加载器可以说是Java语言的一项创新,它是早期Jav
阅读全文
摘要:说起垃圾收集(Garbage Collection,下文简称GC),有不少人把这项技术当作Java语言的伴生产物。事实上,垃圾收集的历史远远比Java久远,在1960年诞生于麻省理工学院的Lisp是第一门开始使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,其作者John McCart
阅读全文
摘要:HotSpot的算法细节实现 3.2、3.3节从理论原理上介绍了常见的对象存活判定算法和垃圾收集算法,Java虚拟机实现这些算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。本章设置这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果读者对这部分内容感到枯燥或者疑惑,不妨
阅读全文
摘要:垃圾收集器 Serial ParNew Parallel Scavenge Serial Old Parallel Old CMS G1 收集区域 面向全堆 面向全堆 面向新生代 面向老年代 面向老年代 面向老年代 面向回收集 在新生代上 标记加复制 标记加复制 标记加复制 标记加整理 在老年代上
阅读全文
摘要:Java内存模型 概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了。在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统(磁盘io和网络io)的速度差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据
阅读全文
摘要:线程安全与锁优化 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解决问题,被称为面向过程的编程思想。与此相对,面向对象的编程思想则站在现实世界的角度去抽象
阅读全文
摘要:状态转换 Java语言定义了6种线程状态,在任意一个时间点中,一个线程只能有且只有其中的一种状态,并且可以通过特定的方法在不同状态之间转换。这6种状态分别是: 新建(New):创建后尚未启动的线程处于这种状态, 运行(Runnable):包括操作系统线程状态中的Running和Ready,也就是处于
阅读全文
摘要:对象的创建 Java是一门面向对象的编程语言,Java程序运行过程中时时刻刻都有对象被创建出来。在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢? 当Java虚
阅读全文
摘要:OutOfMemoryError异常
阅读全文
摘要:[深入理解Java虚拟机]class文件
阅读全文
摘要:原子性、可见性与有序性 Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立的,我们逐个来看一下哪些操作实现了这三个特性。 原子性(Atomicity) 由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write这六
阅读全文
摘要:Java与协程 在Java时代的早期,Java语言抽象出来隐藏了各种操作系统线程差异性的统一线程接口,这曾经是它区别于其他编程语言的一大优势。在此基础上,涌现过无数多线程的应用与框架,譬如在网页访问时,HTTP请求可以直接与Servlet API中的一条处理线程绑定在一起,以“一对一服务”的方式处理
阅读全文
