自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 生产者消费者模型

生产者和消费者问题是线程模型中老生常谈的问题,也是面试中经常遇到的问题。今天我们就盘它!!!一、生产者消费者模型何为生产者消费者模型呢?生产者消费者模型是由两类线程构成:生产者线程:“生产”产品,并把产品放到一个缓冲区里;消费者线程:“消费”产品。如图所示:小贴士:生产者持续生产,直到缓冲区满,满时阻塞;缓冲区不满后,继续生产;如果缓冲区里的产品从无到有,生产者就得通知一下消费者,告诉它可以来消费了;消费者持续消费,直到缓冲区空,空时阻塞;缓冲区不空后,继续消费;如果缓冲区里

2021-12-18 18:40:28 609 1

原创 两个线程交替打印

题目:起两个线程交替打印0~100的奇偶数这个问题大家可能在面试的时候遇到过,虽然学过多线程相关的知识,可能当时一时半会还写不出来,现在就让我带大家写一遍吧!方法一首先,我们可以观察到打印的是奇数和偶数,那么我们就可以通过这个特点去写代码。假如我们有一个全局变量 count,当 count 等于偶数的时候,我们就让线程1打印,当 count 等于奇数的时候,我们就让线程2打印。那如何实现呢?这里我们就可以用到锁了,来保证同一时刻只有一个线程在执行。但是如果同一个线程一直抢到锁,而另一个线程一直没有拿到

2021-12-18 18:39:57 1887

原创 手撕 LRU

相信大家对 LRU 算法一点都不陌生,今天我们就来手撕它!LRU 算法描述:首先要接收一个 capacity 参数作为缓存的最大容量,然后实现两个 API,一个是 put(key, val) 方法存入键值对,另一个是 get(key) 方法获取 key 对应的 val,如果 key 不存在则返回 -1。小贴士:get 和 put 方法必须都是 O(1) 的时间复杂度LRU 算法设计:分析上面的操作过程,要让 put 和 get 方法的时间复杂度为 O(1),我们可以总结出 cache 这个.

2021-12-18 18:39:19 302

原创 设计模式五大原则

单一职责原则(SRP)如何理解单一职责原则单一职责原则:Single Responsibility Principle, 缩写SRP。意思:一个类或模块只负责完成一个职责(或者功能)。单一职责原则是为了实现代码高内聚、低耦合,提高代码的复用性、可读性、可维护性。如何判断一个类的职责是否足够单一不同的应用场景、不同阶段的需求背景、不同的业务层面,对同一个类的职责是否单一,可能会有不同的判定结果。实际上,一些侧面的判断指标更具有指导意义和可执行性,比如,出现下面这些情况就有可能说明这类的设计不满

2021-12-17 22:44:58 671

原创 常见设计模式

????单例????饿汉式饿汉式的实现方式比较简单。在类加载的时候,instance 静态实例就已经创建并初始化好了,所以,instance 实例的创建过程是线程安全的。不过,这样的实现方式不支持延迟加载(在真正用到 IdGenerator 的时候,再创建实例)如果初始化耗时长,那我们最好不要等到真正要用它的时候,才去执行这个耗时长的初始化过程,这会影响到系统的性能(比如,在响应客户端接口请求的时候,做这个初始化操作,会导致此请求的响应时间变长,甚至超时)。采用饿汉式实现方式,将耗时的初始化操

2021-12-17 22:44:30 361

原创 HTTP 协议的前世今生

1、HTTP 的基本概念HTTP 是超文本传输协议(HyperText Transfer Protocol),下面具体解释一下:协议:HTTP 是一个用在计算机世界里的协议,它使用计算机能够理解的语言确立了一种计算机之间交流通信的方式(两个及以上的参与者),以及相关的各种控制和错误处理方式(行为约定和范)。传输:HTTP 是一个双向协议,比如 A 浏览器访问 B 服务器,使用 HTTP 协议来通信,数据就在 A 和 B 之间传输,但是中间允许有中转或接力。HTTP 是一个在计算机世界里专门用来在两

2021-12-16 23:11:27 157

原创 常见的网络攻击

XSS 攻击跨站脚本攻击(Cross Site Scripting),就是攻击者在web页面插入恶意的script代码(这个代码可以是JS脚本、CSS样式或者其他意料之外的代码),当用户浏览该页面之时,嵌入其中的script代码会被执行,从而达到恶意攻击用户的目的。比如读取cookie,session,tokens,或者网站其他敏感的网站信息,对用户进行钓鱼欺诈等。常见的 XSS 攻击有反射型和持久型。反射型可以使用 http-only 让恶意脚本获取不到cookie,或者用一些转义字符,比如&l

2021-12-16 23:10:22 159

原创 TCP 可靠传输

前置芝士在讲解 TCP 可靠传输之前,我们先搞清楚什么是 TCP 可靠传输?TCP 可靠传输就是保证接收方收到的字节流和发送方发出的字节流是完全一样的。那为什么需要 TCP 的可靠传输呢?由于网络层是没有可靠传输机制的,尽自己最大的努力进行交付。而传输层使用 TCP 实现可靠传输,TCP 保证可靠传输的机制有如下几种:1)校验和2)序列号和确认应答机制3)重传机制4)滑动窗口5)流量控制6)拥塞控制校验和所谓 TCP 的校验和(Checksum)就是说:由发送端计算待发送 TCP 报

2021-12-16 23:09:46 3292

原创 TCP 协议

前置芝士在讲解 TCP 三次握手和四次挥手之前,我们先来简单的讲解 TPC 的基础知识,这样更有助于我们后面的理解。首先我们得知道什么是 TCP ?TCP 是面向连接的、可靠的、基于字节流的传输层通信协议,中文叫传输控制协议。下面简单的解释一下:面向连接:一定是一对一才能连接,不能像 UDP 协议 可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的。可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端。字节流:消息是没有边界的,所以无论我们消息

2021-12-15 21:58:08 453

原创 IP 协议

IP 协议的基本认知IP(Internet Protocol)协议,中文叫网际协议 ,是位于网络层的一个协议。它用于屏蔽下层物理网络的差异,为上层提供统一的 IP 数据报。就像下面这样:IP 协议的特点:IP 协议提供无连接的、不可靠的、尽力的数据报投递服务:无连接的投递服务:发送端可于任何时候自由发送数据,而接收端永远不知道自己会在何时从哪里接收到数据。每个 IP 数据报独立处理和传输, 一台主机发出的数据报序列,可能会走不同的路径, 甚至有可能其中的一部分数据报会在传输过程中丢失。不可靠的投

2021-12-15 21:57:40 1490

原创 HTTPS 看这篇就够了

我们之前讲解过了 HTTP,如果面看过的建议先去看看 HTTP(传送门),我们知道 HTTP 有三大缺点:通信使用明文、不验证通信方的身份、无法证明报文的完整性。今天,我就来带你看看 HTTPS 相比 HTTP 有哪些优点,是如何解决这些问题的,话不多说,直接开干。不安全的 HTTP在上篇文章中我们只是简单的介绍了 HTTP 不安全的几点,并没有详细分析,今天我们就来详细的分析 HTTP 在不安全方面的三个缺点,如下所示:通信使用明文( 不加密) , 内容可能会被窃听不验证通信方的身份, 因此有可

2021-12-14 19:33:39 261

原创 DNS 域名解析协议

我们知道,当我们访问一个服务器上的资源时,是需要 IP 地址的,但是在我们平常使用浏览器的时候,却并没有输入那一长串的 IP 地址,而是在地址栏输入了一串网址,那为啥输入网址就能请求到服务器上的资源了呢?这就离不开域名解析协议(DNS)的功劳了,今天我就带你看看 DNS 是怎么工作的????????????。什么是 DNS 协议在介绍 DNS 协议之前,我们先得知道 IP地址和域名的概念:IP 地址:一长串能够唯一地标记网络上的计算机的数字。域名:又称网域,是由一串用点分隔的名字组成的 Inter

2021-12-14 19:33:03 807

原创 一致性哈希

为什么要有一致性哈希算法我们首先想象一个这样的场景,如果我们有3台缓存服务器用于缓存图片,为这3台服务器编号为0号、1号、2号、现在有3万张图片需要缓存在这3台服务器上,我们肯定希望这些图片被均匀的分散到这3台服务器上,以便能够分摊缓存的压力。那么我们应该怎么做呢?如果我们随意的将这3万张图片缓存在这3台服务器上,可以满足我们的需求吗?可以,但是如果这样做,当我们需要访问某个缓存项时,则需要遍历3台缓存服务器,从3万张缓存图片中找到我们需要访问的那张图片,遍历的过程效率太低,时间太长,当我们找到需要访问

2021-12-13 21:40:46 127

原创 负载均衡算法

一、随机法(Random)完全随机:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。代码实现:public class Servers { public List<String> list = new ArrayList<>() { { add("192.168.1.

2021-12-13 21:40:05 205

原创 内存页面置换算法

前面我们说过了进程的调度算法,今天我们继续来盘内存页面的置换算法,给你整的明明白白的????????????。内存页面置换算法主要有下面这么几种:最佳页面置换算法(OPT)先进先出置换算法(FIFO)最近最久未使用的置换算法(LRU)时钟页面置换算法(Lock)最不常用置换算法(LFU)最佳页面置换算法(OPT)最佳页面置换算法基本思路是,置换在「未来」最长时间不访问的页面。所以,该算法实现需要计算内存中每个逻辑页面的「下一次」访问时间,然后比较,选择未来最长时间不访问的页面。我们举

2021-12-13 21:39:09 2480

原创 操作系统死锁

一、死锁的概念1、死锁的定义如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件发生,那么该组进程是死锁的2、死锁产生的必要条件产生死锁必须同时满足一下四个条件,只要其中任一条件不成立,死锁就不会发生互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。请求和保持条件:进程

2021-12-12 12:20:09 372

原创 进程间通信

前置知识说到进程通信,我们首先得知道怎么是线程通信吧,那什么是线程通信呢?顾名思义,进程通信( InterProcess Communication,IPC)就是指进程之间的信息交换。我们知道进程是分配系统资源的单位,包括内存地址空间(什么!你竟然不知道,等我????????????),因此各进程拥有的内存地址空间相互独立。为了保证安全,一个进程不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须实现的。我们发现操作系统的内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。下面我

2021-12-12 12:19:37 120

原创 进程调度算法

前言进程调度算法也称 CPU 调度算法,当 CPU 空闲时,操作系统就从就绪队列中按照一定的算法选择某个就绪状态的进程,并给其分配 CPU。通常以下几种情况会发生进程的调度:当进程从运行状态转到等待状态;当进程从运行状态转到就绪状态;当进程从等待状态转到就绪状态;当进程从运行状态转到终止状态;其中 1 和 4 称为非抢占式调度,2 和 3 称为抢占式调度。非抢占式调度就是当进程正在运行时,它就会一直运行,直到该进程完成或发生某个事件而被阻塞时,才会把 CPU 让给其他进程;抢占式调度就是进程

2021-12-11 08:48:01 5650

原创 进程基础扫盲

进程的概念试想一下这样的场景:我们编写好的代码是怎么运行起来的呢?我们编写好的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着 CPU 会执行程序中的每一条指令,那么这个运行中的程序,就被称为「进程」。那进程的定义就是:进程是程序在某个数据集合上的运行过程,也是操作系统进行资源分配和调度的基本单位。简单来说,进程是程序的一次执行过程,它和程序的区别如下:程序是静态的,它作为系统中的一种资源是永远存在的进程是动态的,它是动态

2021-12-11 08:47:25 333

原创 MySQL 一条SQL语句的执行过程

前言在平常的开发中,可能很多人都是 CRUD,对 SQL 语句的语法很熟练,但是说起一条 SQL 语句在 MySQL 中是怎么执行的却浑然不知,今天我就由浅入深,带大家一点点剖析一条 SQL 语句在 MySQL 中是怎么执行的,吊打面试官。本文主要从两个方面,查询语句和更新语句来解析。一条 SQL 查询语句如何执行的比如你执行下面这个 SQL 语句时,我们看到的只是输入一条语句,返回一个结果,却不知道 MySQL 内部的执行过程:mysql> select * from T where ID=

2021-12-10 07:47:45 758 2

原创 深入理解MySQL锁

深入理解MySQL锁对于锁大家应该都不陌生吧,今天我们就来讲讲 MySQL 中的各种锁一、简单介绍一下锁结构吧谈到锁,我们都知道锁的作用,但是我们先来简单讲讲锁的结构吧????????????其实锁就是内存中的一个结构,在我们执行一个事务之前,MySQL表中的记录本来是没有锁的,也就是说一开始是没有锁结构和这条锁记录相关联的,如图所示:但是当一个事务想要对这条记录做改动时,它先到内存中查看有没有与这条记录相关联的锁,如果没有这个锁,就会在内存中生成一个锁结构与这条记录关联,如图:图中表示

2021-12-10 07:47:12 126

原创 MySQL BufferPool

我们都知道,MySQL 是基于磁盘存储的数据库,那我们每次查询一个页的记录时都得从磁盘加载整个页进内存然后读取呢,那这样既不是很慢。所以 MySQL 实现了一种叫做 Buffer Pool 的玩意,那 Buffer Pool 是啥玩意呢,我们接着往下看 ????????????一、Buffer Pool其实,Buffer Pool 是 MySQL 服务器向操作系统申请的一片连续的内存区域,我们可以通过 innodb_buffer_pool_size 设置 Buffer Pool 的大小小贴士:inn

2021-12-09 22:53:09 347

原创 你还没有搞懂MVCC吗

在讲解 MVCC 之前,我们先简单来复习一下事务的四大特性(ACID):原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响今天,我们讲解的就是隔离性 ????????????

2021-12-09 10:20:29 203

原创 你还不会使用MySQL索引吗

上次我们讲了 MySQL 索引的底层原理,现在我们讲讲如何使用 MySQL 索引吧一、索引的代价空间上的代价每建立一个索引都要为它建立一棵 B+ 树,每一棵 B+ 树的每一个节点都是一个数据页,一个页默认会占用 16KB 的存储空间,一棵很大的 B+ 树由许多数据页组 成,那可是很大的一片存储空间呢,我们可是节约资源的好小孩呢 ????????????时间上的代价每次对表中的数据进行增、删、改操作时,都需要去修改各个 B+ 树索引。而且我们讲过, B+ 树每层节点都是按照索引列的值从小到大的顺序

2021-12-09 10:18:35 87

原创 深入浅出 MySQL 索引底层原理

吊打面试官之深入浅出 MySQL 索引底层原理1、前置知识在了解 MySQL 索引的底层原理之前,我们需要知道 MySQL 中数据页的相关知识,知道各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。页和记录的关系示意图如下:页a、页b、页c … 页n可以不在物理结构上相连,只要通

2021-12-08 22:56:46 179

原创 Mysql undolog

一、事务回滚的需求我们说过事务需要保证原子性 ,也就是事务中的操作要么全部完成,要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况,比如:情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误。情况二:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前的事务的执行。这两种情况都会导致事务执行到一半就结束,但是事务执行过程中可能已经修改了很多东西,为了保证事务的原子性,我们需要把东西改回原先的样子,这个过程就称之为 回滚 (英文

2021-12-08 22:56:10 169

原创 MySQL redolog

不知道大家是否还记得事务的四大特性,现在我们回忆一下吧,持久性、一致性、隔离性、原子性。没错,我们今天讲的就是持久性。一、啥是 redo log我们想象有这么一个生产环境,就是如果我们只在内存的 Buffer Pool 中修改了页面,事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交了的事务对数据库中所做的更改也就跟着丢失了,这你能忍?反正我是不能忍。???????????? 这就是持久性遭到了破坏,那我们如何保证持久性呢? 有同学可能说每次事务提交之前把该事务所修改的所有页面都刷

2021-12-08 12:57:21 447

原创 MySQL事务

废话不多说,今天我们来讲解 MySQL 的事务吧 ????????????一、事务的概念那到底何为事务呢?我们把需要保证 原子性 、隔离性、 一致性 和 持久性 的一个或多个数据库操作称之为一个事务它大致分为如下几个状态:活动的(active)事务对应的数据库操作正在执行过程中时,我们就说该事务处在 活动的 状态。部分提交的(partially committed)当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在 部分提交的 状态

2021-12-08 12:55:59 176

原创 MySQL 笔记

一、数据库驱动二、sql 语句执行过程三、InnoDB 储存引擎的架构设计redo(重做日志)日志刷盘策略的选择建议 :建议的设置为1,也就是说,提交事务的时候,redo 日志必须是刷入磁盘文件的,这样可以严格保证提交事务之后,数据是绝对不会丢失的,因为有 redo 日志在磁盘文件里可以恢复你做的所有修改如果要是选择 0 的话,可能你提交事务之后,MySQL 宕机,那么此时 redo 日志没有刷盘,导致内存里的 redo 日志丢失,你提交的事务更新的数据就丢失了;如果要是选择 2的话

2021-12-07 15:11:56 112

原创 Linux常用命令

一、文件管理ls 命令ls 命令为英文单词 list 的缩写,正如英文单词 list 的意思,其功能是列出指定目录下的内容及其相关属性信息ls [参数] [文件] //如果不指定文件,则以所在目录作为文件默认情况下 ls 命令会列出当前目录的内容,不过不包括隐藏文件参数功能-a显示所有文件及目录 (包括以“.”开头的隐藏文件)-l使用长格式列出文件及目录信息-r将文件以相反次序显示(默认依英文字母次序)-t根据最后的修改时间排序-A同 -a

2021-12-07 12:52:01 423

原创 JVM 执行引擎

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

2021-12-06 09:21:30 155

原创 JVM 虚拟机栈

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

2021-12-06 09:19:07 224

原创 JVM 破坏双亲委派模型

双亲委派模型并不是一个具有强制性约束的模型,而是Java设计者推荐给开发者们的类加载器实现方式。在 Java的世界中大部分的类加载器都遵循这个模型,但也有例外的情况,直到Java模块化出现为止,双亲委派模型主要出现过3次较大规模“被破坏”的情况。一、在双亲委派出现之前双亲委派模型的第一次“被破坏”其实发生在双亲委派模型出现之前——即JDK 1.2面世以前的“远古”时代。由于双亲委派模型在JDK 1.2之后才被引入,但是类加载器的概念和抽象类 java.lang.ClassLoader 则在 Java 的

2021-12-05 23:29:20 364

原创 JVM 类加载子系统

类加载子系统一、内存结构概述二、类加载器与类的加载过程一、类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。CLassLoader只负责class文件的加载,至于他是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分信息是 Class 文件中常量池部分的内存映射)。二、类加载器Cla

2021-12-05 23:27:01 76

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

学过 JVM 的同学都知道,垃圾回收可以说是 JVM 的一个非常重要的知识点了,在我们讲解垃圾回收算法和垃圾回收器之前, 我们先来讲解有关垃圾回收相关的概念吧 ????????????一、垃圾回收概述1、什么是垃圾所谓垃圾回收,那在 JVM 中啥才是垃圾呢?其实,在 JVM 中垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存进行垃圾清理,那么,这些垃圾所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用,甚至可能导致内存溢出,也就是常说的

2021-12-04 09:06:14 251

原创 JVM 垃圾回收算法

一、垃圾标记阶段的算法之引用计数算法一、垃圾标记阶段:对象存活判断在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象,只有被标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。那么JVM中究竟是如何标记一个死亡对象的呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活的方式一般有两种方式:引用计数算法和 可达性分析算法。二、

2021-12-04 09:05:14 102

原创 JVM 垃圾回收器

一、GC分类与性能指标一、垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的产商、不同版本的JVM来实现。由于JDK的版本处于高速迭代的过程中,因此Java发展至今已经衍生出了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。二、垃圾回收器分类按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,才是工作线程被暂停,直至垃圾收集工作结束。在诸如单CPU处理器或者较小的引用内存等硬件

2021-12-03 12:55:11 85

原创 JVM 方法区

一、栈、堆、方法区的交互关系二、方法区的理解一、方法区在哪里?《Java虚拟机规范》中明确说明:”尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾回收或者进行压缩。“但对于 HotSpot JVM 而言,方法区还有一个别名叫做 Non-Heap(非堆),目的就是要和堆分开。所以,方法区看做是一块独立于 Java 堆的内存空间。二、方法区的基本理解方法区(Method Area)与 Java 堆一样,是各个线程共享的内存区域。方法区在 JVM 启动的时候被

2021-12-03 12:54:36 1015

原创 JVM 堆

咋废话少说,直接进入重点 ????????????一、堆1、堆(Heap)的核心概述一、堆的核心概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处理物理上不连续的内存空间中,但在逻辑上它应该被视为连续的所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buf

2021-12-02 09:28:07 219

原创 JVM 程序计数器

一、PC Register介绍JVM中的程序计数器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。作用:PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条

2021-12-02 09:27:34 123

空空如也

空空如也

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

TA关注的人

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