![](https://img-blog.csdnimg.cn/9a4ff97940d941ceb58b2f328aebf0a4.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM上篇
文章平均质量分 87
JVM上篇部分
鲨瓜2号
更多笔记:yzgc.top
展开
-
JVM目录
硅谷2020最新版宋红康JVM教程。原创 2022-11-23 22:43:35 · 162 阅读 · 0 评论 -
第十七章:垃圾回收器
垃圾收集机制是Java的招牌能力,极大地提高了开发效率。这当然也是面试的热点。那么,Java常见的垃圾收集器有哪些?GC垃圾收集器是和JVM一脉相承的,它是和JVM进行搭配使用,在不同的使用场景对应的收集器也是有区别截止JDK1.8,一共有7款不同的垃圾收集器。每一款的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。GC发展阶段:Seria l=> Parallel(并行)=> CMS(并发)=> G1 => ZGC不同厂商、不同版本的虚拟机实现差距比较大。原创 2022-11-22 22:20:12 · 169 阅读 · 0 评论 -
第十六章:垃圾回收相关概念
强引用可以直接访问目标对象。强引用所指向的对象在任何时候都不会被系统回收,虚拟机宁愿抛出OOM异常,也不会回收强引用所指向对象。强引用可能导致内存泄漏。原创 2022-11-22 22:18:57 · 112 阅读 · 0 评论 -
第十五章:垃圾回收相关算法
总结一句话就是,除了堆空间外的一些结构,比如 虚拟机栈、本地方法栈、方法区、字符串常量池 等地方对堆空间进行引用的,都可以作为GC Roots进行可达性分析除了这些固定的GC Roots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象“临时性”地加入,共同构成完整GC Roots集合。分代收集和局部回收(PartialGC)。原创 2022-11-22 22:16:38 · 152 阅读 · 0 评论 -
第十四章:垃圾回收概述
在提到什么是垃圾之前,我们先看下面一张图从上图我们可以很明确的知道,Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。原创 2022-11-22 22:15:14 · 97 阅读 · 0 评论 -
第十三章:StringTable
总结string的 intern()的使用:JDK1.6中,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址JDK1.7起,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址。原创 2022-11-22 22:14:14 · 82 阅读 · 0 评论 -
第十二章: 执行引擎
执行引擎属于JVM的下层,里面包括 解释器、及时编译器、垃圾回收器执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。原创 2022-11-22 22:11:15 · 92 阅读 · 0 评论 -
第十一章:直接内存
直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存IO 阻塞式IO,NIO:非阻塞式 IO通常,访问直接内存的速度会优于Java堆。即读写性能高。原创 2022-11-21 20:57:26 · 79 阅读 · 0 评论 -
第十章:对象实例化内存布局
如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader + 包名 + 类名为key进行查找对应的 .class文件,如果没有找到文件,则抛出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的Class对象。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。直接指针是局部变量表中的引用,直接指向堆中的实例,在对象实例中有类型指针,指向的是方法区中的对象类型数据。如果是数组,还需要记录数组的长度。原创 2022-11-21 20:56:05 · 91 阅读 · 0 评论 -
第九章:方法区
这次所讲述的是运行时数据区的最后一个部分从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理百度三面:说一下JVM内存模型吧,有哪些区?分别干什么的?见上图PC 寄存器: 保存即将执行的字节码指令。本地方法栈: 管理调用的本地方法虚拟机栈:保存方法的局部变量、部分结果,并参与方法的返回 局部变量表: 保存方法的参数,以及方法内部的局部变量 操作数栈: 保存计算的中间结果,以及临时变量。原创 2022-11-21 20:55:07 · 165 阅读 · 0 评论 -
第八章:堆
针对幸存者s0,s1区的总结:复制之后有交换,谁空谁是to关于垃圾回收:频繁在新生区收集,很少在老年代收集,几乎不再永久代和元空间进行收集新生代采用复制算法的目的:是为了减少内碎片从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分**,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。**多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为快速分配策略。原创 2022-11-21 20:54:02 · 113 阅读 · 0 评论 -
第七章:本地方法栈
因为Java虚拟机规范并没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈。它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限。在Hotspot JVM中,直接将本地方法栈和虚拟机栈合二为一。本地方法栈,也是线程私有的。本地方法是使用C语言实现的。原创 2022-11-21 20:51:45 · 83 阅读 · 0 评论 -
第六章:本地方法接口
简单地讲,一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “c” 告知c++编译器去调用一个c的函数。原创 2022-11-21 20:50:43 · 88 阅读 · 0 评论 -
第五章:虚拟机栈
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?为什么?首先栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放哪里。原创 2022-11-21 20:50:07 · 104 阅读 · 0 评论 -
第四章: 程序计数器
JVM中的程序计数寄存器(Program Counter Register)中,Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。原创 2022-11-21 20:48:54 · 119 阅读 · 0 评论 -
第三章: 运行时数据区概述及线程
本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品。原创 2022-11-21 20:37:15 · 99 阅读 · 0 评论 -
第二章: 类加载子系统
完整图如下如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。为什么要自定义类加载器?隔离加载类修改类加载的方式扩展加载源防止源码泄漏用户自定义类加载器实现步骤开发人员可以通过继承抽象类 java.lang.ClassLoader 类的方式,实现自己的类加载器,以满足一些特殊的需求。原创 2022-11-21 18:50:23 · 114 阅读 · 0 评论 -
第一章 : JVM与体系结构
作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题?运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就JJ了每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼。大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。原创 2022-11-20 22:13:17 · 311 阅读 · 0 评论