自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 JVM---垃圾收集器(万字详解)

垃圾收集器万字详解垃圾回收器垃圾收集器万字详解前言垃圾收集器说明与发展史垃圾收集器简要说明垃圾收集器发展史GC 分类及性能指标垃圾收集器分类评估 GC 性能指标不同的垃圾收集器概述7款经典的垃圾收集器及组合关系如何查看默认的垃圾收集器Serial 回收器:串行回收ParNew 回收器:并行回收Parallel 回收器:吞吐量优先CMS 回收器:低延迟CMS 工作原理及分析CMS 的优点与弊端CMS 参数设置与总结G1 回收器:区域化分代式G1 GC 概述G1 回收器的优势G1 回收器的缺点G1 参数设置G

2021-04-20 20:25:40 297

原创 JVM---垃圾回收算法详解

垃圾回收相关算法文章目录垃圾回收相关算法标记阶段:引用计数算法标记阶段的目的引用计数算法标记阶段:可达性分析算法可达性分析实现思路GC Roots 可以是哪些元素?对象的 finalization 机制finalize() 方法机制生存还是死亡?具体过程JProfiler 的 GC Roots 溯源清除阶段:标记-清除算法清除阶段:复制算法清除阶段:标记-压缩算法垃圾回收算法小结分代收集算法增量收集算法和分区算法增量收集算法分区算法(主要针对 G1 收集器来说的)标记阶段:引用计数算法标记阶段的目的

2021-04-02 11:22:08 236

原创 JVM---堆(逃逸分析与代码优化)

堆—逃逸分析堆是分配对象的唯一选择么?在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃

2021-04-01 09:30:52 239

原创 JVM---堆(对象分配过程)

堆—对象分配过程堆中TLAB为对象分配内存堆—逃逸分析与代码优化概念为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片。下面几点说明:new的对象先放伊甸园区,此区有大小限制;当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器对伊甸园区进行垃圾回(MinorGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁,再加载新

2021-03-31 17:07:19 543

原创 JVM---垃圾回收概述及相关概念

垃圾回收概述及相关概念垃圾回收概述什么是垃圾回收 ?为什么需要 GC ?哪些内存需要回收 ?**垃圾回收相关概念System.gc() 的理解内存溢出与内存泄漏内存溢出内存泄漏Stop the World垃圾回收的并行与并发HotSpot的算法实现细节根节点枚举安全点与安全区域安全点(Safepoint)安全区域(Safe Region)记忆集与卡表引用概述强引用:不回收软引用:内存不足即回收弱引用:发现即回收虚引用:对象回收跟踪终结器引用(了解)大厂面试题垃圾回收概述什么是垃圾回收 ?垃圾回收(

2021-03-31 15:02:19 199

原创 基于JDK1.8---HashMap源码分析

基于JDK1.8—HashMap源码简要分析HashMap底层储存结构底层结构其实就是 数组+链表+红黑树 。HashMap类定义先来看看HashMap的定义:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {}从中我们可以了解到:HashMap<K,V>:HashMap 是以 key-val

2021-03-29 11:32:29 133

原创 JVM---StringTable(字符串常量池)

StringTable(字符串常量池)String的基本特性String:字符串,使用一对 " " 引起来表示。String s1 = "atguigu" ; // 字面量的定义方式String s2 = new String("hello"); // new 对象的方式String 被声明为 final 的,不可被继承。String 实现了 Serializable 接口:表示字符串是支持序列化的;实现了 Comparable 接口:表示 String 可以比较大

2021-03-25 10:50:27 542

原创 JVM---执行引擎

执行引擎执行引擎概述执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被

2021-03-13 10:23:21 258

原创 JVM---本地方法接口和本地方法栈

本地方法接口什么是本地方法简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个NativeMethod是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern“c” 告知c++编译器去调用一个c的函数。“A native method is a Java method whose implementation is provided bynon-java

2021-03-11 21:22:43 183

原创 JVM---直接内存

直接内存直接内存概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在 Java 堆外的、直接向系统申请的内存区间。来源于 NIO,通过存在堆中的 DirectByteBuffer 操作 Native 内存通常,访问直接内存的速度会优于 Java 堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java 的 NIO 库允许 Java 程序使用直接内存,用于数据缓冲区 。/** * IO

2021-03-11 10:54:30 103

原创 JVM---对象的实例化内存布局与访问定位

对象的实例化内存布局与访问定位面试题对象在JVM中是怎么存储的?对象头信息里面有哪些东西?Java对象头有什么?从对象创建的方式和步骤开始:对象创建的方式new:最常见的方式、单例类中调用 getInstance 的静态类方法,XXXFactory 的静态方法;Class 的 newInstance 方法:在 JDK9 里面被标记为过时的方法,因为只能调用空参构造器;Constructor 的 newInstance(XXX) :反射的方式,可以调用空参的,或者带参的构造器;使用

2021-03-11 10:28:44 147 1

原创 JVM运行时数据区---方法区(演变和垃圾回收)

方法区演进细节与垃圾回收方法区演进细节永久代演进过程:首先明确:只有 Hotspot 才有永久代。BEA JRockit、IBMJ9 等来说,是不存在永久代的概念的。原则上如何实现方法区属于虚拟机实现细节,不受《Java虚拟机规范》管束,并不要求统一。Hotspot 中方法区的变化如下图:JDK6 :方法区由永久代实现,使用 JVM 虚拟机内存(虚拟的内存)。JDK7 :方法区由永久代实现,使用 JVM 虚拟机内存。JDK8 :方法区由元空间实现,使用物理机本地内存。永久代为什么

2021-03-08 21:24:02 379 2

原创 JVM运行时数据区---方法区(内部结构)

方法区的内部结构方法区存储什么?《深入理解Java虚拟机》书中对方法区(Method Area)存储内容描述如下:它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。类型信息对每个加载的类型(类class、接口interface、枚举enum、注解annotation),JVM必须在方法区中存储以下类型信息:这个类型的完整有效名称(全名=包名.类名);这个类型直接父类的完整有效名(对于interface或是java.lang.Object,都没有父类);这个

2021-03-07 17:51:08 549 2

原创 JVM运行时数据区---方法区(前言)

运行时数据区—方法区前言方法区是运行时数据区的最后一个部分。从线程共享与否的角度来看:ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理栈、堆、方法区的交互关系下面涉及了对象的访问定位:Person 类的 .class 信息存放在方法区中;person 变量存放在 Java 栈的局部变量表中;真正的 person 对象存放在 Java 堆中;在 person 对象中,有个指针指向方法区中的 person 类型数据,表明这个 pe

2021-03-01 21:15:20 109

原创 JVM运行时数据区---堆(TLAB)

堆—TLAB为对象分配内存为什么要有 TLAB?堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据;由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的;为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度。什么是 TLAB?TLAB(Thread Local Allocation Buffer):从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域(栈中提到),它包含在Eden空间内;

2021-02-24 22:04:28 249

原创 JVM运行时数据区---堆(堆内存)

运行时数据区—堆堆的核心概念《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time data area from which memory for all class instances and arrays is allocated)。但从实际使用角度看,“几乎”所有的对象实例都在这里分配内存。因为还有一些对象是在栈上分配的,而数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中

2021-02-20 21:24:13 338 4

原创 JVM---虚拟机栈(局部变量表)

虚拟机栈—局部变量表局部变量表(Local Variables):被称之为局部变量数组或本地变量表。局部变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题。局部变量表所需的容量大小是在编译期就确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期

2021-02-16 19:30:55 398

原创 JVM---虚拟机栈(动态链接与方法返回地址)

虚拟机栈—动态链接动态链接、方法返回地址、附加信息 :有些地方被称为帧数据区;每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用,这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking),比如:invoke指令;Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(symbolic Reference)保存在class文件的常量池里。比如:一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的

2021-02-16 18:52:39 463 1

原创 JVM---虚拟机栈(操作数栈)

虚拟机栈—操作数栈概念操作数栈:Operand Stack每一个独立的栈帧除了包含局部变量表以外,还包含一个后进先出的操作数栈,也可以称之为 表达式栈(Expression Stack);操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)和 出栈(pop);某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用它们后再把结果压入栈,比如:执行复制、交换、求和等操作;操作数栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空

2021-02-16 17:47:17 584

原创 JVM---Java虚拟机栈

虚拟机栈虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。由于不同平台CPU架构不同,所以不能设计为基于寄存器的。 其优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。为什么不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?首先栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数

2021-02-02 17:49:06 174 2

原创 JVM---程序计数器

程序计数器介绍程序计数器(Program Counter Register)中的Register的命名源于CPU的寄存器,寄存器存储相关指令的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。程序计数器是一块很小的内存空间,几乎可以忽略不记,它也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自己的程序计数器,它是线程私有的,生命周期与线程的生命周期保持一致。任何时间的一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会

2021-02-01 19:03:58 538

原创 JVM---运行时数据区概述

运行时数据区概述运行时数据区,见下图,它是在类加载完成后的阶段。当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区。内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行,JVM规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。而

2021-01-26 19:36:01 190

原创 排序算法---冒泡排序(java版)

冒泡排序原理冒泡排序(Bubble Sort)是一种简单的排序算法,它通过依次比较两个相邻的的元素,看两个元素是否满足大小关系要求,如果不满足则交换两个元素。每一次冒泡会让至少一个元素移动到它应该在的位置上,这样 n 次冒泡就完成了 n 个数据的排序工作。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。算法过程描述比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;针对所有的元素

2021-01-26 14:12:50 150

原创 排序算法---选择排序(java版)

简单选择排序原理选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾。简单选择排序执行过程如下图代码实现public class SelectSort { public static void main(String[] args) { int arr[] = {34,1,139,101}; for (int i = 0; i < arr.l

2021-01-26 14:04:35 163

原创 排序算法---插入排序(java版)

直接插入排序原理直接插入排序(Insertion Sort)的原理是:将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。算法过程如下图所示算法描述如下:从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素

2021-01-26 13:50:12 102

原创 排序算法---希尔排序(java版)

希尔排序原理先将待排序表分割成若干相隔某个“增量”的记录组成一个子表,对各个子表分别进行直接插入,当整个表中的元素已成基本有序是,再对全体记录进行一次直接插入排序。希尔排序主要解决直接插入排序因表中元素基本有序,但是部分元素离自己位置较远而引起交换次数较多的问题。希尔排序的排序过程如图所示代码实现public class ShellSort { public static void main(String[] args) { shellSort(); }

2021-01-26 13:35:47 262

原创 排序算法---归并算法(java版)

归并排序原理归并排序(Merge Sort)的核心思想是,如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。归并排序使用的是分治思想。分治思想分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。分治思想一般都是用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突。而对于递归就是要找到递推公式及终止条件,所以写出归并排序的递推公式 merg

2021-01-26 13:04:33 127

原创 排序算法---快速排序(java版)

快速排序原理快速排序(Quick Sort)算法,简称快排,利用的也是分治的思想,快排的思路是:如果要对 m->n 之间的数列进行排序,我们选择 m->n 之间的任意一个元素数据作为分区点(Pivot),然后我们遍历 m->n 之间的所有元素,将小于 pivot 的元素放到左边,大于 pivot 的元素放到右边,pivot 放到中间,这样整个数列就被分成三部分了,m->k-1 之间的元素是小于 pivot 的,中间是 pivot,k+1->n 之间的元素是大于 pivot

2021-01-26 12:48:52 121

原创 常用排序算法对比(时间复杂度、稳定性)

常用排序算法对比

2021-01-26 12:31:02 117

原创 排序算法---计数排序(java版)

计数排序原理计数排序(Counting Sort) 使用了一个额外的数组 C,其中第 i 个元素是待排序数组A 中值等于 i 的元素的个数。然后根据数组 C 来将 A 中的元素排到正确的位置。其实计数排序其实是桶排序的一种特殊情况。计数排序实现原理创建数组C,找出待排序的数组中最大和最小的元素;统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项;对所有的计数累加(从 C 中的第一个元素开始,每一项和前一项相加);反向填充目标数组:将每个元素 i 放在新数组的第 C(i)项,

2021-01-26 12:25:41 148

原创 排序算法----桶排序(java版)

桶排序 原理 实现 时间复杂度

2021-01-26 11:04:44 963

原创 如何判断Java中两个Class对象是否相同

如何判断两个Class对象是否相同在JVM中表示两个class对象是否为同一个类存在两个必要条件:类的完整类名必须一致,包括包名。加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。换句话说,在JVM中,即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的。...

2021-01-19 19:12:55 5533

原创 简单的Java双亲委派机制

双亲委派机制Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。工作原理具体原理如下图如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;如果父类加载器可以完成类

2021-01-19 19:06:56 564

原创 类加载器的分类及关系

类加载器分类以及关系,自定义类加载器的实现等

2021-01-19 17:58:18 1273

原创 Java虚拟机中 类的加载过程

类的加载过程例如下面的一段简单的代码public class HelloWorld { public static void main(String[] args) { System.out.println("我已经被加载啦"); }}它的加载过程是怎么样的呢?完整的流程如下图所示:加载阶段通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Clas

2021-01-19 16:29:17 127

原创 JVM基本架构及生命周期

JVM基本架构及生命周期Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。JVM简单架构JVM完整架构Java虚拟机作用:Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在

2021-01-03 21:22:18 129

原创 替换空格---StringBuilder

问题:替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”限制:0 <= s 的长度 <= 10000

2020-12-16 10:31:38 253

原创 找出数组中重复的数字---多思路

问题:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000解题思路:1.利用HashSet,因为HashSet不允许集合中出现重复的元素,通过将数组元素添加到HashSet中,如果元素添加.

2020-12-15 16:28:56 1233

原创 Java常见数据结构以及特点、使用场景

Java常见数据结构以及特点Java中常见的数据结构,主要分为Collection和Map两种主要接口,程序中的数据结构是继承这些接口的数据结构类。Collection接口:List 接口继承:ArrayList、 Vector、 LinkedList等实现;Set 接口继承:HashSet、LinkedHashSet、TreeSet等实现。Map接口: HashMap、SortedMap继承,LinkedHashMap、TreeMap等实现。几个常用的类及其特点:ArrayLis

2020-12-15 11:36:44 1841

原创 数据结构与算法---队列

数据结构与算法—队列1. 队列的定义:队列(Queue )简称队,是一种操作受限制 的线性表 ,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队; 删除元素称为出队或离队。操作特性是先进先出(First In First Out,FIFO)。队头(Front):允许删除的一端;队尾(Rear):允许插入的一端。空队列:不含任何元素的空表。2. 队列的顺序存储:队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针front指向队

2020-11-24 21:35:36 229

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除