为什么Java程序需要运行在虚拟机上 因为Java在设计之初的跨平台特性,我们知道Java程序是运行在Java虚拟机上的.如果你要问为什么Java程序要运行在虚拟机上,我可以反问你几个问题. 为什么买来的电器插上电就能直接使用?你可能会说,因为电是基础设施.电源有统一的标准,电器有统一的标准,所以买来的电器插上电就能用. 不同的电器需要的电源标准不同(台灯和电饭煲的功率),为什么我们不能给不同的电器配置不同的电源呢?因为太麻烦了,虽然这样我们能让每个电器都达到最适应的效率,但是代价未免太大了些.…
JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私有的,即每个线程各自都有自己的一份.绿色部分是各个线程共享的. 1.PC寄存器(The pc Register) (1)每一个Java线程都有一个PC寄存器. (2)PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息. (3)此内存区域是唯一一个在JV…
运行时数据区域 相对于c,c++.程序设计时,java并不需要手动释放或者创建内存用于存放程序,这的确使得java开发变得容易和轻松,一旦有一天出现了内存泄漏或者内存溢出的问题,如果不了解JVM虚拟机是怎么使用内存的,这将会变成一个棘手的问题.下面就来看看JVM是怎么使用内存的吧^-^ 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的行…
1. 概述 1) GC的历史比Java久远 2) GC需要完成的三件事: | 哪些内存需要回收 | 什么时候回收 | 如何回收 3) Java内存运行时区域各个部分: | Java虚拟机栈.计数器.本地方法栈随线程而生,随线程而灭,不需要考虑太多问题,因为方法的结束或者线程结束时,内存自然就回收了 | Java堆和方法区只有在运行时才知道需要的内存,分配和回收都是动态的,垃圾收集器所关注的是这部分内存 2. 对象已死吗? 1) 引用计数算法(Reference Counting) | 思路: 给…
内存回收与分配重点关注的是堆内存和方法区内存(程序计数器占用小,虚拟机栈和本地方法栈随线程有相同的生命周期). 一.判断对象是否存活? 1. 引用计数算法 优势:实现简单,效率高. 致命缺陷:无法解决对象相互引用的问题--会导致对象的引用虽然存在,但是已经不可能再被使用,却无法被回收. 2. 可达性分析算法 对象到GC Roots没有引用链,则回收. GC Roots包括: (1)Java虚拟机栈中引用的对象. (2)方法区中类静态属性引用的对象. (3)方法去中常量引用的对象. (4)本地方法…
垃圾收集器 上文说到了垃圾收集算法,这次我们聊一下HotSpot的具体垃圾收集器的实现,以JDK1.7为例,其包含的可选垃圾收集器如下图: 不同收集器之间的连线,代表它们可以搭配使用,收集器所属的区域代表它们属于新生代收集器还是老年代收集器,下面总结一下每个收集器的特点: Serial 收集器 Serial 字面意思为串行,这与它的工作方式是有关系的,因为它是一个单线程收集器,他在新生代工作,采取的是复制算法,在单CPU的机器上可以高效的完成收集工作,其对于运行在Client模式下的虚拟机是一个…
JVM学习笔记二之GC GC即垃圾回收,在C++中垃圾回收由程序员自己来做,例如可以用free和delete来回收对象.而在Java中,JVM替程序员来执行垃圾回收的工作,下面看看GC的详细原理和执行过程. 1.对象已死? 1.1 引用计数法 Java GC不采用引用计数法是因为无法解决对象互相引用导致无法回收的问题. 1.2 可达性分析法 从GC ROOT开始搜索,搜索不到的并且经过第一次标记.清理后未复活的对象. GC ROOT包括: 虚拟机栈中引用的对象 方法区中静态属性引用的对象 方法区…
JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 → 解析)→ 初始化 → 使用 →  卸载. 1 加载 1.1 加载阶段要做的3件事情 通过一个类的全限定名来获取该类对应的二进制字节流. 将这个字节流所代表的静态存储结构转化为方法区的数据结构. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口…
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制. 两个约定: 后文直接对"类型"的描述都同时蕴含着类和接口的可能性 本章所提到的"Class文件"也并非特指某个存在于具体磁盘中的文件,而应当是一串二进制字节流. 7.2 类加载的时机 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整…
承接上文 (完结撒花1-52系列)[JVM技术指南]「JVM总结笔记」Java虚拟机垃圾回收认知和调优的"思南(司南)"[上部] 并行收集器 并行收集器(也称为吞吐量收集器)是类似于串行收集器的分代收集器. 串行和并行收集器之间的主要区别是,并行收集器有多个线程,用于加速垃圾回收. 通过命令行选项 -XX:+UseParallelGC 启用并行收集器. 默认情况下,使用此选项,次要(minor)和主要(Major GC)都将并行运行,以进一步减少垃圾回收开销. 并行垃圾收集器线程数 可…