![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 86
JVM虚拟机知识
依晴无旧
专注大数据、Java后端、软件测试、Linux端的技术研究
展开
-
JVM原理(二四):JVM虚拟机锁优化
高效并发是从JDK 5升级到JDK 6后一项重要的改进项,HotSpot虛 拟机开发团队在这个版本上花费了大量的资源去实现各种锁优化技术,如适应性自旋( Adaptive Spinning)、锁消除( Lock Elimination)、锁膨胀(Lock Coarsening)、轻量级锁(Lightweight Locking)、偏向锁( Biased Locking)等,这些技术都是为了在线程之间更高效地共享数据及解决竞争问题,从而提高程序的执行效率。原创 2024-07-09 21:51:01 · 891 阅读 · 1 评论 -
JVM原理(二三):JVM虚拟机线程安全的实现方法
互斥同步(MutualExclusion&Synchronization)是一种最常见也是最主要的并发正确性保障手段。。,临界区(Critical Section)、互斥量(Mutex)和信号量( Semaphore)都是常见的互斥实现方式。因此在“互斥同步”这四个字里面,其他名称:阻塞同步、悲观锁。面临的问题主要是进行线程阻塞和唤醒所带来的性能开销。在Java里面,最基本的互斥同步手段就是synchronized关键字,这是一种块结构(Block Structured)的同步语法。原创 2024-07-09 21:48:48 · 624 阅读 · 0 评论 -
JVM原理(二二):JVM虚拟机线程调度与状态转换
线程调度是指系统为线程分配处理器使用权的过程,调度主要方式有两种,分别是和。:如果使用协同式调度的多线程系统,线程的执行时间由线程本身来控制,线程把自己的工作执行完了之后,要主动通知系统切换到另外一个线程上去。:实现简单,而且由于线程要把自己的事情淦完后才会进行线程切换,切换操作对线程自己是可知的,所以一般没有什么线程同步的问题。:线程执行时间不可控制,甚至如果一个线程的代码编写有问题,一直不告知系统进行线程切换,那么程序就会一直阻塞在那里。:每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定。原创 2024-07-08 07:54:46 · 338 阅读 · 0 评论 -
JVM原理(二一):JVM虚拟机线程的实现
线程是比进程更轻量级地调度执行单位,线程地引入,可以把一个进程地资源分配和执行调度分开,各个线程即可以共享进程资源,又可以独立调用。Thread这个特别的类所有方法都用Native声明。实现线程的三种方式:使用内核线程实现(1:1实现)使用用户线程实现(1:N实现)使用用户线程加轻量级进程混合实现(N:M实现)原创 2024-07-08 07:52:27 · 437 阅读 · 0 评论 -
JVM原理(二十):JVM虚拟机内存的三特性详解
先行发生是Java内存模型中定义的两项操作之间的偏序关系,比如说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B观察到,“影响”包括修改了内存中共享变量的值、发送了消息、调用了方法等。:被final修饰的字段在构造器中---旦被初始化完成,并且构造器没有把“this"的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),那么在其他线程中就能看见final字段的值。这里必须强调的是“同一个锁”,而“后面”是指时间上的先后。原创 2024-07-07 08:19:37 · 756 阅读 · 0 评论 -
JVM原理(十九):JVM虚拟机内存模型
数据不安全的原因:缓存一致性的问题:在多路处理器系统中,每个处理器都有自己的高速缓存,而他们又共享同一主内存。除了增加高速缓存之外,为了使处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果是一致的,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证。原创 2024-07-07 06:06:21 · 1019 阅读 · 0 评论 -
JVM原理(十八):JVM虚拟机的编译器优化技术
在一般应用中,完全不会逃逸的局部对象和不会逃逸出线程的对象所占的比例是很大的,如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,垃圾收集子系统的压力将会下降很多。在未发生方法调用之前,内联缓存状态为空,当第一次调用发生后,缓存记录下方法接收者的版本信息,并且每次进行方法调用时都比较接收者的版本。线程同步本身是一个相对耗时的过程,如果逃逸分析能够确定一个变量不会逃逸出线程,无法被其他线程访问,那么这个变量的读写肯定就不会有竞争,对这个变量实施的同步措施也就可以安全地消除掉。原创 2024-07-06 07:49:12 · 668 阅读 · 0 评论 -
JVM原理(十七):JVM虚拟机即时编译器详解
编译器无论在何时、在何种状态下把Class文件转换成与本地基础设施相关的二进制机器码,他都可以视为整个编译过程的后端。后端编译器编译性能的好坏、代码优化质量的高低却是衡量一款商用虛拟机优秀与否的关键指标之一。原创 2024-07-06 07:45:13 · 764 阅读 · 0 评论 -
JVM原理(十六):JVM虚拟机类型擦除与泛型发展
泛型的本质是或者的应用,即可以将操作的数据类型指定为方法签名中的一种特殊参数,这种参数类型能够用在类、接口和方法的创建中,分别构成泛型类、泛型接口和泛型方法。泛型让程序员能够以针对泛化的数据类型编写相同的算法,这极大地增强了编程语言的类型系统及抽象能力。原创 2024-07-05 07:14:49 · 852 阅读 · 0 评论 -
JVM原理(十五):JVM虚拟机静态分配与动态分配
本节讲解的分派调用过程将会揭示多态性特征的一-些最基本的体现,如“重载”和“重写”在Java虚拟机之中是如何实现的。原创 2024-07-05 07:04:00 · 673 阅读 · 0 评论 -
JVM原理(十四):JVM虚拟机运行时栈帧结构
由于局部变量表是建立在线程堆栈中的,属于线程私有的数据,无论读写两个连续的变量槽是否为原子操作,都不会引起数据竞争和线程安全问题。当一个方法被调用时,Java虚拟机会使用局部变量表来完成参数值到参数变量列表的传递过程,即实参到形参的传递。如果执行的是实例方法(没有被static修饰的方法),那局部变量表中第0位索引的变量槽默认是用于传递方法所属对象实例的引用,在方法中可以通过关键字“this”来访问到这个隐含的参数。原创 2024-07-04 07:49:53 · 885 阅读 · 0 评论 -
JVM原理(十三):JVM虚拟机类类加载器与双亲委派模型
Java虛拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都有一个独立的类名空间。原创 2024-07-04 07:46:05 · 1205 阅读 · 0 评论 -
JVM原理(十二):JVM虚拟机类加载过程
加载阶段与连接阶段的部分动作(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的一部分,这两个阶段的开始时间仍然保持着固定的先后顺序。原创 2024-07-03 19:20:04 · 806 阅读 · 0 评论 -
JVM原理(十一):JVM虚拟机六种必需对类进行初始化的情况
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。Java天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态链接这个特点实现的。原创 2024-07-03 19:13:37 · 604 阅读 · 0 评论 -
JVM原理(十):JVM虚拟机调优分析与实战
这是笔者很久之前处理过的一个案例,但今天仍然具有代表性。一个15万PV/日左右的在线文档类型网站最近更换了硬件系统,服务器的硬件为四路志强处理器、16GB物理内存,操作系统为64位CentOS5.4,Resin作为Web服务器。整个服务器暂时没有部署别的应用,所有硬件资源都可以提供给这访问量并不算太大的文档网站使用。软件版本选用的是64位的JDK5,管理员启用了一个虛拟机实例,使用-Xmx和-Xms参数将Java堆大小固定在12GB。原创 2024-07-02 06:45:03 · 915 阅读 · 0 评论 -
JVM原理(九):JVM虚拟机工具之可视化故障处理工具
JHSDB是一款基于服务性代理实现的进程外调试工具。服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言实现的API集合。原创 2024-07-02 06:40:46 · 355 阅读 · 0 评论 -
JVM原理(八):JVM虚拟机工具之基础故障工具
jstack命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以获知没有响应的线程到底在后台做些什么事情,或者等待着什么资源。JD提功jhat命令与jmap搭配使用,来分析jmap生成的堆转储快照。interval 查询间隔时间。count 查询次数。原创 2024-07-01 07:42:09 · 488 阅读 · 0 评论 -
JVM原理(七):JVM虚拟机的内存分配与回收策略
Java技术体系的自动内存管理,最根本的目标是自动化解决两个问题:自动给对象分配内存和 自动回收分配给对象的内存原创 2024-07-01 07:36:50 · 1005 阅读 · 0 评论 -
JVM原理(三):JVM对象回收判定机制与回收算法
finalize方法是对象逃脱死亡命运的最后一次机会,如果这时候该对象和GC Root上的引用链连接上了,那么就可以逃脱被回收的命运,不然就会被回收。通过“GC Roots”的跟对象作为起始节点集,从这些结点开始,根据应用关系向下搜索,搜索过程中走过的路径叫做引用链,如果某个对象(或某个对象链)不在引用链上,会被标记为可回收对象(关于是否可以真正回收可以查看3.2.4)。这是一种判断方式,相应的方法就是:如果一个对象被引用,那将被引用的对象中的一个计数器加一,引用失效就减一。原创 2024-06-29 08:13:42 · 923 阅读 · 1 评论 -
JVM原理(四):JVM垃圾收集算法与分代收集理论
从如何判定消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”和“追踪式垃圾收集”两大类。本文主要介绍的是。原创 2024-06-29 10:42:06 · 678 阅读 · 0 评论 -
JVM原理(二):JVM之HotSpot虚拟机中对象的创建寻位与定位整体流程
遇到new指令时当Java虚拟机遇到一个字节码new指令时。首先会去,并且检查这个符号引用代表的类是否被加载、解析和初始化过。如果没有,那么必须执行类的加载过程(加载、检查、准备、解析、初始化)类加载后?类加载检查通过后,接下来虚拟机会为新生对象分配内存。。如果Java堆中内存是绝对规整的,那么只需一个指针作为分界点的指示器,对象需要多少内存,就移出多少内存。我们称这种方式为。原创 2024-06-28 19:32:33 · 727 阅读 · 0 评论 -
JVM原理(五):JVM发展至今的七款垃圾收集器
上图展示了七种作用于不同分代的收集器,。图中收集器所在的区域,则表示它是属于。原创 2024-06-30 09:00:00 · 825 阅读 · 0 评论 -
JVM原理(六):JVM虚拟机未来最具发展力的两款垃圾收集器
衡量垃圾收集器的三项最重要的指标:内存占用、吞吐量、延迟。目前处于实验状态的垃圾收集器:Shenandoah、ZGC可以在任意可管理的对容量下,实现停顿不超过十毫秒这种天方夜谭的话。背景故事:RedHat开发的,被排挤。目标:实现一种能在任何堆内存大小下都可以吧垃圾收集的停顿时间限制在十毫秒以内的垃圾收集器。结构:Shenandoah的结构和G1的结构基本相同。但有三个不同之处:支持与用户线程一起并发的整理算法。默认不使用分代。用“链接矩阵”的全局数据结构替代记忆表来记录跨Region的引用关系,降低伪共享原创 2024-06-30 12:00:00 · 893 阅读 · 0 评论 -
JVM原理(一):JVM运行时数据区域的分析
程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虛拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序等基础功能都需要依赖这个计数器来完成。原创 2024-06-28 19:29:43 · 729 阅读 · 0 评论