![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM学习
文章平均质量分 90
SKTT1丶faker
好好学习,天天向上
展开
-
垃圾收集器(Garbage Collection)与内存分配策略
程序计数器和栈区域随线程而生,随线程而灭,栈中的栈帧随方法的进入退出执行出栈和入栈操作,每一个栈帧分配的内存是在编译期可知的,在线程结束时,内存随之回收。堆和方法区的内存只有在运行期才能确定,这部分内存分配和回收是动态的,所以只讨论这部分内存。判断对象是否已死可达性分析算法(Reachability Analysis)可达性分析的基本思路是通过一系列的称为“GC Roots”的...原创 2018-08-17 22:20:39 · 1828 阅读 · 0 评论 -
虚拟机字节码执行引擎
概述执行引擎是Java虚拟机最核心的组成部分之一,虚拟机可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。执行引擎在执行代码时,可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两者兼备,甚至包含几个不同级别的编译器执行引擎。但从外观来看,所有Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字...原创 2018-08-21 21:28:25 · 168 阅读 · 0 评论 -
Java内存模型与线程
Java内存模型Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model, JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在JDK1.5以后,Java内存模型就已经成熟和完善起来了。主内存与工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存...原创 2018-08-24 16:54:48 · 117 阅读 · 0 评论 -
Java虚拟机晚期(运行期)优化
概述Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个代码或代码块的运行特别频繁时,就会把这些代码认定为热点代码(Hot Spot Code),在运行时,虚拟机会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT)。HotSpot虚拟机内的即时编译器解释器与编译器解释器与编译器两者各有优势:当程序需要迅速启动和...原创 2018-08-23 23:07:47 · 302 阅读 · 0 评论 -
虚拟机类加载机制
概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类型的加载、连接和初始化过程都是在程序运行期间完成的,基于这个特点,Java可以扩展动态语言,如Applet、JSP和OSGi等。类加载的时机类的生命周期如下图所示: 其中,加载、验证、准备、初始化、卸载的顺序是确定...原创 2018-08-20 21:53:55 · 113 阅读 · 0 评论 -
Java虚拟机早期(编译期)优化
概述Java的编译期可能是一个前端编译器把.java变成.class的过程,也可能是虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转换成机器码的过程。还可能是使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把.java文件编译成本地机器代码的过程。本文的编译期和编译期都指第一类编译期。Javac这类编译器对代...原创 2018-08-23 03:04:59 · 140 阅读 · 0 评论 -
Class文件
无关性不同平台的Java虚拟机与所有平台都使用统一的程序存储格式字节码(ByteCode)来实现Java的平台无关性。此外,在Java虚拟机上也开发出了许多语言,包括Clojure、Groovy、JRuby、Jython、Scala等。Java虚拟机不和包括Java在内的任何语言绑定,它只与Class文件关联,Class文件中包含了Java虚拟机指令集和符号表以及其他辅助信息,虚拟机并不关心C...原创 2018-08-19 19:21:10 · 4566 阅读 · 0 评论 -
OutOfMemoryError异常
在虚拟机规范中,除了程序计数器,其他区域都有OutOfMemoryError异常的能,下面就实践一下这些异常。Java堆溢出Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除对象,那么在对象数量达到最大堆的容量限制后就会产生内存溢出异常。这是一个堆内存溢出的例子:package outofmemoryerror;...原创 2018-08-17 01:50:06 · 146 阅读 · 0 评论 -
类加载及执行子系统的案例分析
概述在Class文件格式与执行引擎这部分中,用户的程序能影响的内容并不太多,能通过程序进行操作的,主要是字节码生成与类加载器这两部分的功能。案例分析Tomcat:正统的类加载架构主流的Java Web服务器如Tomcat、Jetty、WebLogic、WebSphere都实现了自己的类加载器。一个功能健全的服务器,要解决如下几个问题:部署在同一个服务器上的两个Web应...原创 2018-08-22 03:36:45 · 173 阅读 · 0 评论 -
JAVA内存区域
运行时数据区域运行时数据区如图所示: 程序计数器(Program Counter Register)程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。为了线程切换后能恢复到正确的执行位置,每条线程都需要有...原创 2018-08-16 03:50:05 · 122 阅读 · 0 评论 -
虚拟机性能监控与故障处理工具
JDK监控和故障处理工具JDK的bin目录下有许多命令行工具,他们大多数是在tools类库实现的,借助这些工具,我们可以直接在应用程序中实现功能强大的监控分析功能。监控和故障处理工具如下表所示: 名称 主要作用 jps JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。 jsat JVM Statisti...原创 2018-08-18 02:24:08 · 186 阅读 · 0 评论 -
线程安全与锁优化
线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。Java语言中的线程安全按线程的安全程度由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。...原创 2018-08-25 01:55:58 · 123 阅读 · 0 评论