![](https://img-blog.csdnimg.cn/20210108151754659.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java虚拟机
文章平均质量分 92
不局限于应用层开发, 着手于底层JVM, 更有利于自身的进步 !
white camel
星光不问赶路人, 时光不负有心人
展开
-
第 17 章 一 G1回收器(重点)、垃圾回收器总结(重要)、GC日志分析、垃圾回收器的新发展(了解)
由于篇幅, 无缝衔接上篇博客 !7、G1 回收器 (重重点):区域化分代式 (并行回收器) JDK9的默认垃圾回收器7.1、为什么还需要 G1在延迟可控的情况下, 尽可能获取高的吞吐量采用标记-压缩算法既然我们已经有了前面几个强大的 GC ,为什么还要发布 Garbage First(G1)GC?GC一直优化的原因就在于 应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行.原创 2021-02-21 08:40:37 · 1209 阅读 · 0 评论 -
第 16 章 一 垃圾回收器、七种经典垃圾回收器、CMS回收器(重点)
第 16 章 垃圾回收器1、GC 分类与性能指标1.1、垃圾回收器概述与分类垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。Java不同版本新特性语法层面:Lambda表达式、switch、自动拆箱装箱、enumAPI层面:Stream API、新的日期时间、Optional、String、集合框架原创 2021-02-17 21:39:42 · 684 阅读 · 1 评论 -
第 15 章 垃圾回收相关概念、System.gc()、内存溢出与内存泄漏、垃圾回收的并行与并发、强软弱虚引用
第 15 章 垃圾回收相关概念1、System.gc() 的理解1.1、System.gc() 方法System.gc() 方法在默认情况下,通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效)JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下原创 2021-02-12 17:04:08 · 527 阅读 · 0 评论 -
第 14 章 垃圾回收相关算法、标记-清除、复制、标记压缩、分代收集(重要)、增量收集、分区算法; 可达性分析
第 14 章 垃圾回收相关算法1、标记阶段:引用计数器1.1、标记阶段的目的垃圾标记阶段:判断对象是否存活在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方原创 2021-02-10 08:27:34 · 1395 阅读 · 0 评论 -
第 13 章 一 垃圾回收概述
第 13 章 垃圾回收概述1、垃圾收集面试题回顾 JVM 学习路线关于垃圾收集Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如原创 2021-02-05 22:37:14 · 363 阅读 · 0 评论 -
第 11 章 一 执行引擎概述、解释器、JIT编译器-热点代码优化
第 11 章 执行引擎Java到底是编译型语言还是解释型语言?编译程序基本原理1、执行引擎概述包含: 解释器、即时编译器、垃圾回收器作用: 执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。执行引擎位置执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器1.1、执行引擎概述执行引擎概述执行引擎是Java虚拟机核心的组成部分原创 2021-01-16 20:38:06 · 687 阅读 · 0 评论 -
第 12 章 字符串常量池 (String Table)、intern()方法、String的内存结构、相关面试题
第 12 章 StringTable1、String 的基本特性1.1、String 概述String 的概述String:字符串,使用一对 “” 引起来表示String s1 = "mogublog" ; // 字面量的定义方式String s2 = new String("moxi"); // new 对象的方式12String声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Compar原创 2021-01-16 22:20:56 · 1079 阅读 · 0 评论 -
第 10 章 一 直接内存 (向系统申请的内存)
第 10 章 直接内存1、直接内存概述直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区代码示例代码/** * IO原创 2021-01-15 19:37:32 · 371 阅读 · 0 评论 -
第 9 章 一 对象的实例化步骤、对象头信息(重点)、对象访问定位
第 9 章 对象的实例化内存布局与访问定位1、对象的实例化大厂面试题美团:对象在JVM中是怎么存储的?对象头信息里面有哪些东西?蚂蚁金服:二面:java对象头里有什么对象实例化1.1、对象创建的方式对象创建的方式new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法Class的newInstance方法:在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 publicConstructo原创 2021-01-14 14:31:08 · 498 阅读 · 0 评论 -
第 8 章 一 方法区的理解, 演变、方法区内部结构(运行时常量池)、方法区垃圾回收、运行时数据区总结
第 8 章 方法区1、栈 堆 方法区的交互关系从内存结构来看方法区的落地实现: JDK7称为永久代, JDK8称为元空间永久代的内存使用的是JVM虚拟机的内存元空间的内存使用的是本地内存(电脑的运行内存)主要用来存放类的类型信息 (Class信息)永久代的内存使用的是JVM虚拟机的内存这次所讲述的是运行时数据区的最后一个部分从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及独立会话管理栈原创 2021-01-09 15:26:24 · 852 阅读 · 0 评论 -
第 7 章 一 堆的概述、年轻代与老年代、分代收集、堆空间常用参数设置、对象分配过程、堆空间分代思想、栈上分配(逃逸分析、标量替换、同步省略)
第 8 章 堆1、堆的核心概述1.1、认识堆内存堆与进程堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM但是进程包含多个线程,他们是共享同一堆空间的对堆的认识一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,堆是JVM管理的最大一块内存空间,并且堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Ja原创 2021-01-08 11:06:49 · 1019 阅读 · 1 评论 -
第 6 章 一 本地方法接口 (Java Native Interface) 和 本地方法栈 (运行时数据区中的结构)
第 6 章 本地方法接口1、本地方法什么是本地方法?使用native修饰的方法, 没有方法体(实现体), 因为具体方法实现是由非Java代码实现的。作用: 融合不同的编程语言为Java所用简单地讲,一个Native Method是一个Java调用非Java代码的接囗一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C/C++。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern告知C++编译器去调用原创 2021-01-04 22:42:45 · 339 阅读 · 0 评论 -
第 5 章 一 虚拟机栈 (局部变量表、操作数栈、动态链接、早/晚期绑定)
第 5 章 虚拟机栈1、虚拟机栈概述-Xss512k 设置栈内存大小为512k1.1、虚拟机栈的出现背景文档网址https://docs.oracle.com/javase/specs/jvms/se8/html/index.html虚拟机栈出现的背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点: 跨平台,指令集小,编译器容易实现,缺点: 性能下降,实现同样的功能需要更多的指令。内存中的栈与堆首原创 2021-01-02 21:25:07 · 2396 阅读 · 2 评论 -
第 4 章 一 程序计数器、为什么使用程序计数器来记录当前线程的执行地址呢?
第 4 章 程序计数器 (PC寄存器)1、PC寄存器概述 (重点)文档网址https://docs.oracle.com/javase/specs/jvms/se8/html/index.htmlPC寄存器介绍线程私有, 运行速度最快的存储区域, 程序计数器会存储当前线程正在执行的Java方法的JVM指令地址PC寄存器不会出现OOM(OutofMemoryError), StackOverFlow字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令当CPU原创 2020-12-20 15:03:33 · 993 阅读 · 1 评论 -
第 3 章 一 运行时数据区概述及线程
第 3 章 运行时数据区概述及线程1、前言本文主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区也就是大厨做饭,我们把大厨后面的东西 (切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品 (执行引擎使用到运行时数据区的原创 2020-12-18 13:40:43 · 477 阅读 · 0 评论 -
第 2 章 一 类加载子系统 (类加载过程、类加载器的分类、双亲委派机制)
第 2 章 类加载子系统1、内存结构概述如果自己想写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎完整框图:2、类加载子系统 (重点)类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还原创 2020-12-15 14:33:32 · 944 阅读 · 1 评论 -
第 1 章 一 JVM 和 Java 体系架构 (虚拟机介绍、字节码、Java跨平台性)
第 1 章 JVM 和 Java 体系架构1、JVM 前言作为Java工程师, 你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就GG了每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼。2、开发人员的病态大部分Java开发人员,除了会在项目中使用到与Java平台相原创 2020-12-15 12:50:42 · 1566 阅读 · 0 评论 -
学习《Java虚拟机》目录索引 (持续更新中)
写在前面:此系列为本人学习宋红康《JVM从入门到精通》所整理的笔记 ! (参考内容 : 宋红康JVM课件、OneBy1314)不要局限于应用层开发, 更加深入理解JVM底层, 更有利于我们长久发展 !学习Java虚拟机一、内存与垃圾回收篇二、字节码与类的加载篇...原创 2020-12-15 10:50:24 · 3072 阅读 · 7 评论