![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java虚拟机
文章平均质量分 81
walkerkalr
学无止境,梦想不止
展开
-
1.Java运行时内存区域
Java运行时数据区域JVM虚拟机运行时数据区域包括程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。此外,java程序运行时也会经常用到本地内存。关于它们的内存分布图如下所示:下面具体介绍下上面提到的几块内存区域:程序计数器一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、...原创 2018-09-23 12:13:27 · 925 阅读 · 0 评论 -
Javac编译器与语法糖
Javac编译器与语法糖Javac编译过程大致分为3个过程:解析与填充符号表插入式注解器的注解处理过程分析与字节码生成过程###解析与填充符号表词法、语法分析:词法分析是将源代码的字符流转变为标记(Token)集合。 语法分析是根据Token序列来构造抽象语法树的过程。经过这个步骤后,编译器就基本不会再对源码文件进行操作了,后续的操作都建立在抽象语法树之上。填充符号表:符号表是...原创 2018-10-02 15:18:30 · 384 阅读 · 0 评论 -
方法调用
方法调用当方法调用时会产生一个栈帧,栈帧包含局部变量表,操作数栈,动态连接,方法返回地址和附件信息。每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。Class文件中的常量池中存在大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用作为参数。这些符号在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析。另外一部分...原创 2018-10-02 14:35:32 · 159 阅读 · 0 评论 -
类加载机制
类加载机制类的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。这7个阶段的发生顺序下图所示:类初始化时机Java规范对类加载时机没有做强制约束,但对类的初始化阶段,严格规定有且只有以下情况必须立即对类“初始化”(而加载等阶段自然需要在初始化之前开始)。1.当虚拟机启动时,初始化用户指定的主类(包含main...原创 2018-10-01 21:48:00 · 134 阅读 · 0 评论 -
Class类文件结构
Class类文件结构Class文件是一组8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结...原创 2018-10-01 16:51:02 · 223 阅读 · 0 评论 -
虚拟机性能监控与故障处理工具
虚拟机性能监控与故障处理工具jpsjps是jdk提供的一个查看当前java进程的小工具。常用命令:jps –l:输出主类或者jar的完全路径名jstack找出最耗时的java线程,据此分析代码步骤1.ps -ef | grep java(或者输入服务的名称)2.top -Hp pid1(pid1为需要分析的进程)3.找到pid1中最耗时的线程ID pid2;将pid2...原创 2018-10-01 10:38:38 · 152 阅读 · 0 评论 -
垃圾收集算法
垃圾收集算法垃圾回收的三种方式标记-清除标记—清除算法是最基础的收集算法,它分为“标记”和“清除”两个阶段:首先标记出所需回收的对象,在标记完成后统一回收掉所有被标记的对象,它的标记过程其实就是前面的可达性分析算法中判定垃圾对象的标记过程。标记—清除算法的执行情况如下图所示:缺点:1.造成内存碎片:标记清除后会产生大量不连续的内存碎片,导致当程序在运行过程中需要分配较大对象时无法找...原创 2018-10-01 09:51:36 · 517 阅读 · 0 评论 -
4.高效安全地发起垃圾收集
高效安全地发起垃圾收集可达性分析安全性和效率问题虽然可达性分析的算法本身很简明,但是在实践中还是有不少其他问题需要解决的。第一个问题便是在多线程环境下,会出现分析过程中对象引用关系还在不断变化的情况。比如垃圾回收器可能回收事实上仍被引用的对象内存,一旦从原引用访问已经被回收了的对象,则很有可能会直接导致 Java 虚拟机崩溃。这样无法保证安全性。另外一个问题是GCRoot节点主要在全局性引...原创 2018-09-24 19:30:20 · 155 阅读 · 0 评论 -
3.判断Java对象存活还是死亡
判断Java对象存活还是死亡由于Java运行时数据区域中的程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着入栈和出栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。因此,垃圾收集器...原创 2018-09-24 16:44:37 · 200 阅读 · 0 评论 -
2.Java内存溢出程序举例
Java内存溢出程序举例OutOfMemoryError: Java heap spaceimport java.util.ArrayList;import java.util.List;/**-Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError**/public class JVMTest { static class OOM{}...原创 2018-09-23 20:07:41 · 266 阅读 · 0 评论 -
即时编译与优化技术
即时编译与优化技术Java程序最初是仅仅通过解释器解释执行的,即对字节码逐条解释执行,这种方式的执行速度相对会比较慢,尤其当某个方法或代码块运行的特别频繁时,这种方式的执行效率就显得很低。于是后来在虚拟机中引入了JIT编译器(即时编译器),当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为“Hot Spot Code”(热点代码),为了提高热点代码的执行效率,在运行时,虚拟机将会把...原创 2018-10-02 16:47:05 · 782 阅读 · 0 评论