FQueue

02-01-01、JVM基础知识

試著忘記壹切 提交于 2020-02-27 13:28:20
1、JVM JVM即java虚拟机(Java Virtual Machine),是java语言的运行平台,java代码编译成符合 jvm规范 的 字节码文件 ,然后由 jvm加载并执行 。 2、JVM是如何进行类加载的?类加载有哪些步骤?类的生命周期是什么样的? 类从被加载到JVM内存开始,到卸载出内存为止,其生命周期包括: 加载(Loading) :通过类的全限定名获取定义此类的 二进制字节流 ,这个二进制流可以任意从哪里获取,可以从文件、网络、数据库、jsp文件、运行时动态生成都可以;将这个字节流所代表的静态存储结构转化为 方法区的运行时数据结构 ;在Java堆中生成代表这个类的Class对象,作为方法区这些数据的访问接口。 验证(Verification) :检查二进制字节流是否符合JVM规范,以免危害虚拟机的执行; 准备(Preparation) : 为类变量(即static修饰的变量)分配内存 并设置类变量的初始值,这些内存都将 在方法区中进行分配 ; 解析(Resolution) :将常量池内的符号引用转换为直接引用; 初始化(Initialization) :就是执行类的构造方法; 使用(Using) : 卸载(Unloading) :使用完后实例被回收 3、JVM有哪些类型的类加载器?如何自定义类加载器?自定义类加载器使用在哪些场景? 启动类加载器

可达性算法

旧街凉风 提交于 2020-02-26 13:55:53
一、可达性分析算法 在Java中,是通过可达性分析(Reachability Analysis)来判定对象是否存活的。该算法的基本思路就是通过一些被称为引用链(GC Roots)的对象作为起点,从这些节点开始向下搜索,搜索走过的路径被称为(Reference Chain),当一个对象到GC Roots没有任何引用链相连时(即从GC Roots节点到该节点不可达),则证明该对象是不可用的。 可达性分析算法判断对象是否可以回收 如上图所示,object1~object4对GC Root都是可达的,说明不可被回收,object5和object6对GC Root节点不可达,说明其可以被回收。 在Java中,可作为GC Root的对象包括以下几种: 虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中类静态属性引用的对象 方法区中常量引用的对象 本地方法栈中JNI(即一般说的Native方法)引用的对象 二、finalize()方法最终判定对象是否存活 即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历再次标记过程。 标记的前提是对象在进行可达性分析后发现没有与GC Roots相连接的引用链。 1. 第一次标记并进行一次筛选。 筛选的条件是此对象是否有必要执行finalize()方法。

由浅入深了解GC原理

故事扮演 提交于 2020-01-07 02:51:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> GC ( Garbage Collection )很大程度上帮助 Java 程序员解决了内存释放的问题,有了 GC ,就不需要再手动的去控制内存的释放。 在阅读之前需要了解的相关概念: Java 堆内存分为新生代和老年代,新生代中又分为 1 个 Eden 区域 和 2 个 Survivor 区域。 一、什么是GC(Garbage Collection) GC 垃圾收集, Java 提供的 GC 可以自动监测对象是否超过作用域从而达到自动回收内存的目的。 每个程序员都遇到过内存溢出的情况,程序运行时,内存空间是有限的,那么如何及时的把不再使用的对象清除将内存释放出来,这就是GC要做的事。 需要 GC 的内存区域 JVM 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 JAVA 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。 注意: 对于 Java8 , HotSpots 取消了永久代,那么是不是也就没有方法区了呢?当然不是,方法区是一个规范,规范没变,它就一直在。那么取代永久代的就是元空间。它可永久代有什么不同的?存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的

【JVM学习】3.深入解析强引用、软引用、弱引用、幻象引用

限于喜欢 提交于 2019-11-30 07:10:01
来源:公众号:猿人谷 关于强引用、软引用、弱引用、幻象引用的区别,在很多公司的面试题中经常出现,可能有些小伙伴觉得这个知识点比较冷门,但其实大家在开发中经常用到,如new一个对象的时候就是强引用的应用。 在java语言中,除了原始数据类型(boolean、byte、short、char、int、float、double、long)的变量,其他所有都是所谓的引用类型,指向各种不同的对象。理解这些引用的区别,对于掌握java对象生命周期和JVM内部相关机制非常有帮助。也有助于更深刻的理解底层对象生命周期、垃圾收集机制等,对设计可靠的缓存框架、诊断应用OOM等问题也大有裨益。 这四种应用主要的区别体现在对象不同的可达性状态和对垃圾收集的影响,他们之间的可达性状态可以参看下图: 1.强引用(strong reference) 强引用就是我们最常见的普通对象引用(如new 一个对象),只要还有强引用指向一个对象,就表明此对象还“活着”。在强引用面前,即使JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),让程序异常终止,也不会靠回收强引用对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为null,就意味着此对象可以被垃圾收集了。但要注意的是,并不是赋值为null后就立马被垃圾回收

虚拟机学习之三:虚拟机性能监控与故障处理工具

烂漫一生 提交于 2019-11-27 17:11:07
1.JDK的命令行工具 jvm在jdk的bin目录下试下了很多监控分析jvm运行情况的命令行工具,这些工具都很小,大多数都是jdk/lib/tools.jar类库的薄封装。 1.1 jps -> 虚拟机进程状况工具 jps:虚拟机进程状态工具( JVM Process Status Tool) jps命令格式:jps [options] [hostid] jps执行样例: jps -q 只输出本地虚拟机线程ID C:\Users\Administrator>jps -q 5268 6052 1452 jps -m 输出虚拟机进程启动时传递给主类main()函数的参数。 C:\Users\Administrator>jps -m 5268 PretenureSizeThresholdTest 6052 3404 Jps -m jps -l 输出主类的全名,如果进程执行的是jar包,输出jar包路径 C:\Users\Administrator>jps -l 5268 com.sean.esapi.client.PretenureSizeThresholdTest 6052 6476 sun.tools.jps.Jps jps -v 输出虚拟机启动时jvm参数 C:\Users\Administrator>jps -v 6928 Jps -Denv.class.path=.;C: