深入理解JVM垃圾回收机制,带你一步步思考理解,告别死记硬背!
深入理解JVM垃圾回收机制,带你一步步思考理解,告别死记硬背!今天来专门聊一聊JVM中的垃圾回收机制。
垃圾回收主要针对的是JVM的堆内存,它分为新生代和老年代。
首先需要先对堆有一个大致的认识,堆分为新生代和老年代,在Jdk1.7以前还有一个永久代,它在方法区里,里面存储了我们的class信息、静态变量、常量池等。不过从JDK1.8开始,方法区的实现发生了该改变,取消了永久代的概念,并且在内存上与老年代不再是物理上连续的。方法区包含在元空间中,并直接存储在机器内存中,这么做的目的是使内存溢出的可能性进一步减小,它的空间大小更容易进一步扩展。同时,方法区也将一部分变量转移了出去,比如类的静态变量、字符串常量池都放到了堆内存当中。
如下图所示:
在堆内存中,从垃圾回收的范围上说,一般分为两种:针对新生代的 minorGC(也叫YoungGC) 和 针对老年代的 majorGC(也叫fullGC)。
下来来说明一下GC中一些常见的搜索算法和回收算法。
首先,我们肯定要先标记出回收的对象,也就是哪些是”垃圾”,大概有两种方法:
引用计数法
每个对象有一个引用计数器,每当有一个引用指向它 ...
由浅入深带你快速理解Mysql内部机制!(带面试题补充)
由浅入深带你快速理解Mysql内部机制!(带面试题补充)基础MySQL的执行流程是怎么样子的
连接器:建立连接,管理连接、校验用户身份
查询缓存:查询语句如果命中查询缓存则直接返回,否则继续向下执行。MySQL8.0已删除该模块
解析SQL:通过解析器对SQL查询语句进行词汇分析、语法分析,然后构建语法树,方便后续模块读取表明、字段、语句类型
执行SQL:
预处理阶段:检查表或字段是否存在;将select *中的*符号扩展为表上所有的列。
优化阶段:基于查询成本的考虑,选择查询成本最小的执行计划
执行计划:根据执行计划执行SQL语句,从存储引擎读取记录,返回给客户端
索引为什么MySQL使用B+树作为索引?1. 高效磁盘读写:
B+树节点大小通常等于磁盘页大小,减少磁盘I/O次数。
非叶子节点仅存索引,叶子节点存数据,提高存储密度。
2. 范围查询性能高:
叶子节点双向链表****相连,顺序遍历高效,适合范围查询(如BETWEEN语句)。
3. 结构稳定且自平衡:
B+树自动平衡树高,查找、插入、删除的时间复杂度为 **O(**log **n)**。
更新操作简单, ...
JUC详解(万字带你彻底搞懂JUC)框架建立+面试题理解
JUC详解(万字带你彻底搞懂JUC)框架建立+面试题理解创建线程的三种方式
实现Runnable接口
创建一个类实现 Runnable 接口,并重写 run 方法。
Runnable 是一个函数式接口,只有一个抽象方法run。
使用示例:
12345public class MyThroad implements Runnable { @Override public void run(){ }}
继承Thread 类
Thread本身也是实现了Runnable接口:
12345678public class Thread implements Runnable { private Runnable target; public void run() { if (target != null) { target.run(); } }}
通过构造函数,Thread 可以接受一个 Runnable ...
JVM知识点整理
JVM知识点整理
JVM的组成?
类加载子系统 Class Loader
运行时数据区 Runtime Data Area
方法区 Metthod Area
堆 Heap
虚拟机栈 Stack
本地方法栈 Native Method
程序计数器 PC Register
执行引擎 Execution Engine
本地方法接口 Native Interface
什么是类加载?类加载就是JMVM将.class文件加载到内存中,经过验证和准备,并最终生成对应的class对象(即类的元信息)
类加载的整个具体过程是什么样的?类加载的流程为:加载(类加载器负责),链接和初始化(JVM完成)
链接还可以拆分为:验证、准备、解析
加载:将二进制流读入内存中,生成一个Class对象
具体流程: 1. 通过类的全限定名读取类的二进制流
2. 将字节流所代表的类转化后存在方法区(类的元数据信息) 特别说明:存在方法区中我们称之为“永久代”,而在JDK8之后为“元空间”,使用的是本地内存而不是JVM内存
3. 在堆区创建一个 java.lang.clas ...
HashMap总结
HashMap总结基本原理类1. 数据结构类1.1 HAshMap的结构是什么?JDK1.7是数组+链表
JDK1.8是数组+链表+红黑树
1.2 为什么要使用红黑树,什么时候转化为红黑树?链表过长导致性能问题
在JDK1.8之前,HashMap采用数组加链表的结构。当多个键的哈希值存储到同一个桶中时,这些键值对会以链表的形式存储。
如表链表过长,会严重影响查询,插入和删除的性能,时间复杂度从O(1)到O(n)。
特别是在哈希严重冲突的情况下,链表的性能问题尤为明显。
红黑树的优势
红黑树是一种自平衡的二叉搜索树,它的查询,插入和删除的时间复杂度都是O(logn)。
当链表的长度超过一定的阈值(默认是8),HashMap会将链表转化为红黑树
这种优化在哈希冲突严重的情况下,可以显著提升性能。
链表转红黑树的阈值: 默认是8
红黑树退化为链表的阈值: 默认是6
2. 容量&Hash冲突2.1 什么时候会扩容当当前存储的键值对数量(size)超过了负载因子(load Factory)和 当前数组桶的数量(capacity)的乘积
扩容条件: size > loadFac ...
计算机网络
计算机网络基础TCP/IP有那几层应用层:我们电脑或手机使用的应用软件都是在应用层实现。当两个不同设备的应用需要通信时,就要把数据传输给下一层,也就是传输层。
应用层只需要专注于喂用户提供应用功能,比如HTTP,FTP,DNS,Telnet等
传输层:应用层的数据回传给传输层,传输层是为应用层提供网络支持的。
在传输层有两个协议,分别是TCP和UDP
UDP:只负责发送数据包,不保证能否抵达对方,但它时效性更高,传输效率也高
TCP:全称是控制传输协议,比UDP多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据数据包能够可靠地传输对方。
应用层需要传输的数据可能会非常大,如果直接传输就不好控制。因此当传输层的数据包大小超过MSS(TCP最大报文长度),就要将数据包分块,这样技师中途有一个分块丢失或损坏了只需要发送损失的分块。我们把这个分块称为一个TCP段。
网络层:网络层负责将数据从一个设备传输到另一个设备,帮助实现应用到应用的通信,而实际的传输功能就交给下一层
网络层最常使用的协议是IP协议,IP协议会将传输层的保温作为数据部分,再加上IP包头组装成IP ...
mysql基础
mysql基础基础使用操作数据库
创建数据库
1CREATE DATABASE [IF NOT EXISTS] 数据库名;
删除数据库
1DROP DATABASE [IF EXIST] 数据库名字;
使用数据库
1use 数据库名;
查看数据库
1show 数据库名;
数据库的列类型数值:
数据类型
描述
大小
tinyint
十分小的数据
1个字节
smallint
较小的数据
2个字节
mediumint
中等大小的数据
3个字节
int
标准的整数
4个字节
bigint
较大的数据
8个字节
float
浮点数
4个字节
double
浮点数
8个字节
decimal
字符串形式的浮点数,一般用于金融计算
字符串
数据类型
描述
大小
char
字符串固定大小
0~255
varchar
可变字符串
0~65535
tinytext
微型文本
2^8-1
text
文本串
2^16-1
时间日期
数据类型
描述
格式
date
日期格式
YYYY-MM-DD
time
时间格式
HH ...
springboot基础详解
springboot基础详解循环依赖什么是循环依赖?AB两个Bean之间相互注入
spring如何解决循环依赖关键是提前暴露未完全创建的Bean
在spring中主要使用了三级缓存来解决循环依赖
一级缓存:用于存储完全实例化完成的Bean
二级缓存:用于存储尚未完全初始化,但已实例化的Bean,用于提前暴露对象,解决循环依赖
三级缓存:用于存储对象工厂,当需要时,可以通过工厂创建早期的Bean
解决步骤:
Spring首先创建Bean实例,并存入三级缓存中
当一个Bean依赖另一个未初始化的Bean时,Spring会从三级缓存中获取Bean的工厂,并生成改Bean的代理对象
代理对象存入二级缓存,解决循环依赖
一旦所有依赖Bean被完全初始化,Bean将转移到一级缓存
解决循环依赖的流程如下:
实例化A对象,并创建ObjectFactory存入三级缓存。
A在初始化时需要B对象,开始B的创建逻辑。
B实例化完成,也创建ObjectFactory存入三级缓存。
B需要注入A,通过三级缓存获取ObjectFactory生成A对象,存入二级缓存。
B通过二级缓存获得A对象后,B创建 ...
java基础详解
java基础详解概念基础框架建立
对象实例在堆内存中
java中堆栈的区别栈:主要存储局部变量和方法的调用信息(如返回地址参数等)。在方法执行期间,局部变量被创建在栈上,并在方法结束时销毁。
堆:用于存储对象实例和数组。每次用new关键字创建对象时,JVM都会在堆上为该对象分配内存空间
面向对象基础构造方法的特点
名称与类名相同
没有返回值
自动执行
不能被重写(override),可以被重载
面向对象的三大特征1.封装:
封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息
2.继承:
子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有
子类可以拥有自己属性和方法,即子类可以对父类进行扩展
3.多态
表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例
StringString、StringBuffer、StringBuilder的区别
安全性:
String不可变,也就可以理解为常量,线程安全。
StringBuilder 与 StringBuffer都继承自 Abs ...
java多线程
java多线程多线程基础在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。
某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。
一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法内部,我们又可以启动多个线程。此外,JVM还有负责垃圾回收的其他工作线程
Java多线程编程的特点又在于:
多线程模型是Java程序最基本的并发模型;
后续读写网络、数据库、Web开发等都依赖Java多线程模型。
创建新进程创建一个新线程非常容易,我们需要实例化一个Thread实例,然后调用它的start()方法:
12Thread t = new Thread();t.start(); // 启动新线程
Thread内部有一个run()方法,start()方法会在内部自动调用实例的run()方法
1Thread t = new Thread(new MyRunnable( ...