摘要: 一、解释器与编译器 当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码” 。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT 编译器)。 即时编译器并不是虚拟机必需的部分 阅读全文
posted @ 2018-07-29 14:32 湮天霸神666 阅读(349) 评论(0) 推荐(0) 编辑
摘要: Java 语言的 “编译期”其实可以分为3类编译过程: 前端编译器:把*.java文件转变成*.class文件的过程。 后端运行期编译器(JIT编译器):把字节码转变成机器码的过程。 静态提前编译器(AOT编译器):直接把*.java文件编译成本地机器代码的过程。 Javac这类编译器对代码的运行效 阅读全文
posted @ 2018-07-29 14:31 湮天霸神666 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 以下是从网上整理出的资料,不同作者对某些具体描述有略微差别,有的具体描述可能会存在不准确的情况,但结论是一致的。 一、String equals比较值,==比较引用,我们主要关注引用的比较。 1、两种方式创建String的过程 对于 String s1="abc"; 这种方式,如果常量池中已经存在字 阅读全文
posted @ 2018-07-29 14:30 湮天霸神666 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 一、类变量、成员变量、局部变量的内存分布 结合前文,对类变量、成员变量、局部变量三种变量的内存分布进行总结 1)类变量:方法区。静态变量随类加载到方法区中。方法区中存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。线程共享。 2)成员变量:堆。从父类继承下来或在子类中定义的 阅读全文
posted @ 2018-07-29 14:29 湮天霸神666 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 一、类与类加载器 允许类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作可以让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载 阅读全文
posted @ 2018-07-29 14:28 湮天霸神666 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 前文已经讲了Class文件的存储格式、方法的调用过程、字节码的执行过程。但是虚拟机是如何加载这些Class文件的呢?Class文件中的信息进入到虚拟机后会发生什么变化? 虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这 阅读全文
posted @ 2018-07-29 14:27 湮天霸神666 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 本文主要总结虚拟机调用方法的过程是怎样的,JAVA虚拟机里面提供了5条方法调用的字节码指令。分别如下: invokestatic:调用静态方法 invokespecial:调用实例构造器<init>方法、私有方法和父类方法。 invokevirtual:调用所有的虚方法。 invokeinterfa 阅读全文
posted @ 2018-07-29 14:25 湮天霸神666 阅读(208) 评论(0) 推荐(1) 编辑
摘要: 一、栈帧结构 讲栈帧结构有必要回顾一下前文Class文件中的Code属性结构,如下图。 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机栈的栈元素。每一个方法从调用开始到执行完成,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法 阅读全文
posted @ 2018-07-29 14:23 湮天霸神666 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 回顾一下前文,知道了属性表的Code属性存着Java程序方法体的代码经过Javac编译器处理后,最终变为字节码指令。还知道了Code属性表中的code是一个u1类型的单字节,取值范围是0x00~0xFF,也就是一共最多能表达256条指令。 由于Java虚拟机采用面向操作数栈而并非寄存器的架构,所以大 阅读全文
posted @ 2018-07-29 14:22 湮天霸神666 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 各种不同平台的虚拟机,与所有平台都统一使用的程序存储格式——字节码,是构成平台无关性与语言无关性的基石。 Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联。Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 阅读全文
posted @ 2018-07-29 14:21 湮天霸神666 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 一、类文件结构 1、class类文件结构 1)魔数与Class文件的版本 2)常量池 3)类或接口层次的访问标志 4)类索引、父类索引、接口索引集合,通过这三项数据来确定这个类的继承关系 5)字段表,包括类级变量、实例级变量,是不包括方法内部声明的局部变量的,不会列出从父类或父接口中继承的字段 6) 阅读全文
posted @ 2018-07-29 14:20 湮天霸神666 阅读(120) 评论(0) 推荐(0) 编辑
摘要: JVM的GC日志的主要参数包括如下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形 阅读全文
posted @ 2018-07-29 14:14 湮天霸神666 阅读(592) 评论(0) 推荐(0) 编辑
摘要: 掌握三种垃圾算法,七种垃圾收集器,了解每种垃圾收集器使用的是哪种垃圾收集算法,以及关于SafePoint的知识点。 垃圾收集算法 1、标记-清除算法(Mark-Sweep) 先标记(如可达性算法)出所有需要回收的对象,标记完后再统一回收所有被标记的对象。 缺点:标记和清除过程的效率都不高,且清除后会 阅读全文
posted @ 2018-07-29 14:13 湮天霸神666 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 讲到垃圾回收,首先就要先知道哪些对象是可以回收的。 可达性算法 这里有必要先了解一下可达性算法,以“GC Roots”的对象作为起始点,若从“GC Roots”到某对象不可达时,此对象会被判定为可回收对象。 可作为GC Roots的对象包括下面几种: 1、虚拟机栈(栈帧中的本地变量表)中引用的对象。 阅读全文
posted @ 2018-07-29 14:12 湮天霸神666 阅读(276) 评论(0) 推荐(0) 编辑
摘要: Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存。 对象的分配可能有以下几种方式: 1、JIT编译后被拆散为标量类型并间接地栈上分配 2、对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配 3、 阅读全文
posted @ 2018-07-29 14:11 湮天霸神666 阅读(971) 评论(0) 推荐(1) 编辑
摘要: Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存。 一、内存分配策略 要了解堆空间内又分有哪几个内存区域(年轻代:eden、s1、s2,老年代),创建对象时按什么规则分配到堆。 1)对象优先在Eden分配,当Eden区没有足够空间进行分 阅读全文
posted @ 2018-07-29 14:10 湮天霸神666 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM )异常的可能。 1、Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在 阅读全文
posted @ 2018-07-29 14:09 湮天霸神666 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 一、对象的创建 1、当虚拟机遇到一条new指令时,会先检查常量池中能否定位到这个类的符号引用,然后检查这个符号引用代表的类是否被加载、解析、初始化过。 2、如果类还未加载过,要先执行类加载过程,静态变量此时会有一个系统初始值。 3、类加载检查通过后,为新生对象在堆中分配内存,对象所需内存大小在类加载 阅读全文
posted @ 2018-07-29 14:07 湮天霸神666 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 一、JVM内存模型 1、程序计数器 线程私有,当前线程所执行的字节码的行号指示器,通过计数器来选取下条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都依赖此功能,唯一没有规定OutOfMemoryError的区域,若执行的是Native方法,计数器值为空。 2、Java虚拟机栈 ( 阅读全文
posted @ 2018-07-29 14:05 湮天霸神666 阅读(276) 评论(0) 推荐(0) 编辑