摘要: 4. GC日志分析 4.1 日志分析 通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表-XX:+PrintGC:输出GC日志。类似-verbose: gc -XX: +PrintGCDetails输出GC的详细日志 -XX:+ PrintGCTimeSt 阅读全文
posted @ 2020-07-02 20:14 秋华 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 3. 回收器 3.1 Serial回收器:串行回收 3.1.1 概述 Serial收集器是最基本、历史最悠久的垃圾收集器了。JDK1.3之前回收新生代唯一的选择。 Serial收集器作为Hotspot中Client模式下的默认新生代垃圾收集器。 Serial收集器采用复制算法、串行回收和"stop- 阅读全文
posted @ 2020-07-02 20:13 秋华 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 1. GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经产生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。 1.1 GC分类 按线程数(垃圾回收的线程)分可以分为串行 阅读全文
posted @ 2020-07-02 20:12 秋华 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 1. System.gc()的理解 在默认情況下,通过System.gc()或者Runtime. getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调 阅读全文
posted @ 2020-07-02 20:09 秋华 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 1. 标记阶段 1.1 引用计数算法 1.1.1 对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GCオ会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶 阅读全文
posted @ 2020-07-02 20:07 秋华 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 1. 什么是垃圾 1.1 C++与Java 1.2 概述 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题 哪些内存需要回收? 什么时候回收? 如何回收? 垃圾收集机制是Java的招牌能力,极大地提高了开发 阅读全文
posted @ 2020-07-02 20:06 秋华 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 1. String的基本特性 String:字符串,使用一对""引起来表示。 String声明为final的,不可被继承。 String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小。 String在jdk8及以前内部定义了 阅读全文
posted @ 2020-07-02 19:57 秋华 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 1. 执行引擎概述 1.1 执行引擎 1.2 概述 执行引擎是Java虚拟机的核心组成部分之一。 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制 阅读全文
posted @ 2020-07-02 19:53 秋华 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 1. 本地方法接口 2. 什么是本地方法? 简单来讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你 阅读全文
posted @ 2020-07-02 19:40 秋华 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 1. 直接内存 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存。 IO:阻塞式 NIO:非阻塞式 通常,访问直接内存的速度会优于Ja 阅读全文
posted @ 2020-07-02 19:38 秋华 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 1. 对象的实例化 1.1 创建对象的方式 new 最常见的方式 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public Constructor的newInsta 阅读全文
posted @ 2020-07-02 19:37 秋华 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 1. 栈、堆、方法区关系交互 运行时数据区结构图: 从线程共享与否的角度来看: 2. 方法区的理解 2.1 方法区在哪里? 《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言,方法区还有 阅读全文
posted @ 2020-07-02 19:34 秋华 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈。 一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域 | 配置jvm及查看jvm进程 Java堆区在JVM启动的时候即 阅读全文
posted @ 2020-07-02 19:24 秋华 阅读(417) 评论(0) 推荐(0) 编辑
摘要: 1. 本地方法栈 2. 什么是本地方法栈? Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态拓展的内存大小。(在内存溢出方面是相同的) | 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将 阅读全文
posted @ 2020-07-02 19:19 秋华 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 2.虚拟机栈 1. 概述 1.1 虚拟机栈出现背景 由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令 1.2 内存中的堆与栈 栈是运行时的单位,而堆是存储的 阅读全文
posted @ 2020-07-02 19:17 秋华 阅读(332) 评论(0) 推荐(0) 编辑
摘要: 1.程序计数器 1. 什么是PC寄存器(程序计数器)? JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器并不是广义上所指的物理寄存器,是 阅读全文
posted @ 2020-07-02 19:11 秋华 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 1. 运行时数据区架构图 2. 内存 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspo 阅读全文
posted @ 2020-07-02 19:10 秋华 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 3. 补充内容 3.1 在jvm中表示两个class对象是否为同一个类的两个必要条件 类的完整类名必须一致,包括包名。 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同 | 换句话说,在jvm中,即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机 阅读全文
posted @ 2020-07-02 19:02 秋华 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 2. 双亲委派机制 2.1 双亲委派机制工作原理 2.1.1 原理 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存,生成class对象。 加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种 阅读全文
posted @ 2020-07-02 19:01 秋华 阅读(360) 评论(0) 推荐(0) 编辑
摘要: 类装载器子系统 1.1 什么是类装载子系统? 类装载器子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识(魔数)。 类装载器子系统(ClassLoader)只负责Class文件的加载,至于它是否可以运行,则由Execution Engine决定。 | 你妈妈[ 阅读全文
posted @ 2020-07-02 18:59 秋华 阅读(356) 评论(0) 推荐(0) 编辑