Java虚拟机学习笔记
Tyella
喜欢一切新奇好玩的事物
展开
-
Java内存模型
一、为什么会出现内存模型        计算机的处理器速度快,存储设备速度慢,处理器和存储设备的速度之间有几个数量级的差距。为了更充分的利用计算机处理器的效能,现代计算机系统中加入了一层读写速度尽可能接近处理器速度的高速缓存来作为处理器和内存之间的缓冲:将运算需要的数据复制到缓存中使得运算能快速进行,当运算结束后再从缓冲同步到内原创 2018-12-21 12:40:14 · 972 阅读 · 0 评论 -
Java内存模型中的happen-before
一、Java内存模型中的happen-before是什么 Happen-before关系,是Java内存模型中保证多线程操作可见性的基础。具体表现为: 线程内执行的每个操作,都保证happen-before后面的操作。这就保证了基本的程序执行顺序,是开发者在书写程序时的基本约定。 对于volatile变量,对于它的写操作,保证happen-before在随后对该变量的读取操作 对于一个锁的...原创 2019-02-23 20:07:20 · 238 阅读 · 0 评论 -
Java常见的垃圾收集器有哪些
一、Java常见的垃圾收集器 Serial GC,它是最古老的垃圾收集器,采用复制算法,收集新生代垃圾。“Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入“Stop-The-World”状态。当然,其单线程也意味着精简的GC实现,无需维护复杂的数据结构,初始化也简单,所以一直是Client模式下JVM的默认选项。 Serial Old,Serial Old是Seria...原创 2019-02-23 19:39:38 · 849 阅读 · 0 评论 -
诊断和监控JVM堆内和堆外内存使用
一、如何诊断和监控JVM堆内核堆外内存使用 可以使用综合性的图形化工具,如JConsole 可以使用命令行工具进行运行时查询,如 jstat 和 jmap ,可以查看堆,方法区等使用数据。 可以使用jmap等提供的命令,生成堆转储(Heap Dump)文件,然后利用 jhat 等堆转储分析工具进行详细分析 二、堆内部结构 对于堆内存,最常见的是新生代和老生代的划分。随着JVM的发展和新的G...原创 2019-02-23 15:01:19 · 1057 阅读 · 0 评论 -
JVM内存区域的划分,哪些区域可能产生OutOfMemory
一、JVM内存区域划分 通常可以把JVM内存区域划分为程序计数器,虚拟机栈,本地方法栈,堆,方法区,运行时常量池。其中,有的区域是以线程为单位,有的区域则是整个JVM进程唯一的。 程序计数器。程序计数器是一块比较小的内存区域,可以看做当前线程执行的字节码的行号指示器。在JVM规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行。 Java虚拟机栈。每个线程在创建时...原创 2019-02-23 13:54:36 · 741 阅读 · 0 评论 -
虚拟机字节码执行引擎
       “虚拟机”是一个相对于“物理机”的概念。,其区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行指定指令集与执行引擎的结构体系,并且能够执行哪些不被硬件直接支持的指令集结构。 一、运行时栈帧结构 &n原创 2018-12-18 21:18:50 · 81 阅读 · 0 评论 -
虚拟机类加载机制
       虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 与那些在编译时需要进行连接工作的语言不同,在Java语言中,类型的加载、连接和初始化都是在程序运行期间完成的。(Java里天生可以扩展的动态语言特性就是依赖于运原创 2018-12-17 21:35:17 · 918 阅读 · 0 评论 -
Class文件结构
Class文件格式只有两种数据类型:无符号数和表。 1.魔数与Class 文件的版本 每个Class文件的头4个字节称为魔数,它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是此版本号,第7和第8个字节是主版本号。 2.常量池 紧接着主次版本号后面的是常量池入口,常量池可以理解为Class文件之中的资源仓库。它...原创 2018-12-17 20:47:30 · 83 阅读 · 0 评论 -
垃圾回收与内存分配
一、判断对象是否存活 1.引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,引用计数器就加1;当引用失效时,引用计数器就减一;任何时刻引用计数器为0的对象就是不可能在被使用的。 缺点:很难解决循环引用的问题。 2.可达性分析算法(HotSpot使用此方法) 通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路程称为“引用链”。当一个对象到“GC...原创 2018-12-16 21:43:39 · 958 阅读 · 0 评论 -
Java内存区域划分
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的内存区域。包括以下部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区 1.程序计数器:通过改变程序计数器的值选择下一条需要执行的字节码指令。Java中每个线程都有一条独立的程序计数器。(线程私有) 2.Java虚拟机栈(VM Stack ,线程私有):描述的是Java方法执行的内存模型,每个Java方法在执行时都会创建一个...原创 2018-12-16 19:39:43 · 184 阅读 · 0 评论 -
类加载机制
一、类加载过程 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就是类加载机制。Java的类加载过程主要分为三个步骤:加载、链接、初始化。 首先是加载阶段。它是Java将字节码数据从不同的数据源加载到JVM中,并映射为JVM认可的数据结构(Class对象),数据源可能是jar文件,class文件,网络数据流...原创 2019-02-23 21:42:26 · 185 阅读 · 0 评论