![](https://img-blog.csdnimg.cn/20201126141614339.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
jvm-宋红康老师笔记
文章平均质量分 92
此栏目来自b站宋红康老师的笔记,希望大家多多学习
孙小圣98
这个作者很懒,什么都没留下…
展开
-
第 15 章 垃圾回收相关算法
第 15 章 垃圾回收相关算法 1、标记阶段:引用计数器 1.1、标记阶段的目的 垃圾标记阶段:判断对象是否存活 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。 只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。 判断对象存活一般有两种方原创 2020-11-27 08:56:19 · 336 阅读 · 1 评论 -
第 16 章 垃圾回收相关概念
第 16 章 垃圾回收相关概念 1、System.gc() 的理解 1.1、System.gc() 方法 System.gc() 方法 在默认情况下,通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效) JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下原创 2020-11-27 08:54:58 · 256 阅读 · 1 评论 -
第 17 章 垃圾回收器
第 17 章 垃圾回收器 1、GC 分类与性能指标 1.1、垃圾回收器概述与分类 垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 Java不同版本新特性 语法层面:Lambda表达式、switch、自动拆箱装箱、enum API层面:Stream API、新的日期时间、Optional、String、集合框架原创 2020-11-27 08:53:00 · 430 阅读 · 0 评论 -
第 14 章 垃圾回收概述
第 14 章 垃圾回收概述 1、垃圾收集面试题 回顾 JVM 学习路线 关于垃圾收集 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候回收? 如何回收? 垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经原创 2020-11-27 08:51:16 · 198 阅读 · 0 评论 -
第 13 章 StringTable
第 13 章 StringTable 1、String 的基本特性 1.1、String 概述 String 的概述 String:字符串,使用一对 “” 引起来表示 String s1 = "mogublog" ; // 字面量的定义方式 String s2 = new String("moxi"); // new 对象的方式 12 String声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的。实现了Compar原创 2020-11-27 08:50:41 · 180 阅读 · 0 评论 -
第 12 章 执行引擎
第 12 章 执行引擎 1、执行引擎概述 执行引擎位置 执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器 1.1、执行引擎概述 执行引擎概述 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主原创 2020-11-27 08:45:23 · 203 阅读 · 0 评论 -
第 11 章 直接内存
第 11 章 直接内存 1、直接内存概述 直接内存 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。 Java的NIO库允许Java程序使用直接内存,用于数据缓冲区 代码示例 代码 /** * IO原创 2020-11-27 08:44:23 · 129 阅读 · 1 评论 -
第 10 章 对象的实例化内存布局与访问定位
第 10 章 对象的实例化内存布局与访问定位 1、对象的实例化 大厂面试题 美团: 对象在JVM中是怎么存储的? 对象头信息里面有哪些东西? 蚂蚁金服: 二面:java对象头里有什么 对象实例化 1.1、对象创建的方式 对象创建的方式 new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法 Class的newInstance方法:在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 public Constructor的原创 2020-11-26 14:59:39 · 128 阅读 · 0 评论 -
第 9 章 方法区
1、栈 堆 方法区的交互关系 从内存结构来看 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及独立会话管理 栈、堆、方法区的交互关系 下面就涉及了对象的访问定位 Person 类的 .class 信息存放在方法区中 person 变量存放在 Java 栈的局部变量表中 真正的 person 对象存放在 Java 堆中 在 person 对象中,有个指针指向方法区中的 perso原创 2020-11-26 14:58:21 · 261 阅读 · 0 评论 -
第 8 章 堆
目录1、堆的核心概述1.1、认识堆内存1.2、查看堆内存1.3、堆内存分区2、设置堆内存大小与 OOM2.1、设置堆内存2.2、OOM 举例3、年轻代与老年代3.1、Java 对象分类3.2、配置新老比例4、图解对象分配过程4.1、对象分配过程4.2、图解对象分配4.3、特殊情况说明4.4、常用调优工具5、GC 垃圾回收器5.1、分代收集思想5.2、Young GC5.3、Major/Full GC6、堆空间分代思想7、内存分配策略8、为对象分配内存8.1、为什么有 TLAB8.2、什么是 TLAB8.3、原创 2020-11-26 14:55:04 · 293 阅读 · 0 评论 -
第 7 章 本地方法栈
1、本地方法栈 本地方法栈的特点 Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态扩展的内存大小(在内存溢出方面和虚拟机栈相同) 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个stackoverflowError 异常。 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个原创 2020-11-26 14:48:26 · 124 阅读 · 1 评论 -
第 6 章 本地方法接口
1、本地方法 什么是本地方法? 简单地讲,一个Native Method是一个Java调用非Java代码的接囗 一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。 这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern 告知C++编译器去调用一个C的函数。 “A native method is a Java method whose implementation is provided by non-java c原创 2020-11-26 14:46:27 · 288 阅读 · 0 评论 -
第 5 章 虚拟机栈
1、虚拟机栈概述 1.1、虚拟机栈的出现背景 文档网址 https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 虚拟机栈出现的背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 内存中的栈与堆 首先栈是运行时的单位,而堆是存储的单位 栈解决程序的运行问题,即程序如何执行,或者原创 2020-11-26 14:44:52 · 441 阅读 · 1 评论 -
第 4 章 程序计数器
1、PC 寄存器概述 文档网址 https://docs.oracle.com/javase/specs/jvms/se8/html/index.html PC 寄存器介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。 这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的原创 2020-11-26 14:35:44 · 213 阅读 · 0 评论 -
第 3 章 运行时数据区概述及线程
目录1、前言2、运行时数据区结构2.1、运行时数据区与内存2.2、线程的内存空间3、线程3.1、JVM 线程3.2、JVM 系统线程 1、前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区 也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可原创 2020-11-26 14:34:05 · 133 阅读 · 0 评论 -
第 2 章 类加载子系统
目录1、内存结构概述2、类加载子系统3、类加载过程3.1、类加载过程概述3.2、加载阶段3.3、链接阶段3.3.1、验证(Verify)3.3.2、准备(Prepare)3.3.3、解析(Resolve)3.4、初始化阶段4、类加载器的分类4.1、类加载器概述4.2、虚拟机自带的加载器4.2.1、启动类加载器4.2.2、扩展类加载器4.2.3、系统类加载器4.3、用户自定义类加载器4.4、关于 ClassLoader5、双亲委派机制5.1、双亲委派机制原理5.2、双亲委派机制代码示例5.3、双亲委派机制优势原创 2020-11-26 14:32:15 · 238 阅读 · 0 评论 -
第 1 章 JVM 和 Java 体系架构
目录1、JVM 前言2、开发人员的病态3、架构师在想甚么4、为什么学习 JVM5、Java VS C++6、参考书籍7、课程章节8、TIOBE 排行榜9、Java 生态圈10、Java的跨平台性11、字节码12、多语言混合编程13、自己写个 JVM14、Java 重大事件15、虚拟机介绍15.1、虚拟机概念15.2、Java 虚拟机16、JVM 的位置17、Java 的整体结构18、Java 代码执行流程19、JVM 架构模型19.1、基于栈的指令集架构19.2、基于寄存器的指令级架构19.3、两种架构的举原创 2020-11-26 14:29:03 · 322 阅读 · 0 评论