自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Kill OOM

OOM是每个程序员早晚都必须面对的问题,通常情况下,Java程序员所说的OOM是JVM OOM,即java.lang.OutOfMemoryError,是指Java程序在运行时申请内存超过JVM可用内存限制,导致JVM无法继续分配内存,从而导致程序无法正常执行,因此对于程序员来说,定位和解决OOM是非常重要的。OOM对程序的影响是重大的。如果是局部对象过大导致的OOM,相应的线程栈会被销毁,相应的局部对象也会被GC快速回收,JVM可以继续处理其他请求。

2023-08-05 17:55:43 247

原创 23种设计模式细解(下)

23种设计模式细解(下)十七、状态模式(详解版)17.1 定义​ 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。17.2 优点结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。将状态转换显示化,减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。状态类职责明确,有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换

2021-11-28 21:50:48 248

原创 23种设计模式细解(中)

23种设计模式细解(中)七、适配器模式(Adapter模式)详解7.1 定义​ 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。7.2 优点客户端通过适配器可以透明地调用目标接口。复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。将目标类和适配者类解耦,解决了目标类和适配者类接口不一

2021-09-05 22:09:09 213

原创 23种设计模式细解(上)

23种设计模式细解(上)一、前文​ 设计模式有两种分类方法,即根据模式的目的来分和根据模式的作用的范围来分,通常情况下,大家更喜欢根据目的来划分23种设计模式;​ 根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适

2021-08-22 21:19:00 208

原创 23种设计模式之七大设计原则

23种设计模式之七大设计原则一、前言1.1 产生背景​ 设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。​ 1995 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented So

2021-08-21 15:01:36 380

原创 学Java,你必须要学会的垃圾收集器

学Java,你必须要学会的垃圾收集器一、GC基础概念1.1概述​ 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。1.2. 垃圾收集器分类​ 按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。​ 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。和串行回收相反,并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用了“Stop-the-

2021-07-25 22:33:55 156 1

原创 你真的了解垃圾回收的这些周边概念吗

你真的了解垃圾回收的这些周边概念吗1.System.gc()的理解​ 在默认情况下,通过system.gc()或者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。​ 然而System.gc() 调用附带一个免责声明,无法保证对垃圾收集器的调用。(不能确保立即生效)。2.内存溢出​ Javadoc中对OutOfMemoryError的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。3.内

2021-07-24 22:15:33 80

原创 JVM中必须要搞懂得垃圾回收算法

JVM中必须要搞懂得垃圾回收算法​ 关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?一、垃圾回收概述1.1 什么是垃圾​ 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其它对象使用,甚至可能导致内存溢出。1.2 为什么需要GC​ 对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完。​

2021-07-24 21:01:19 71

原创 Java中不得不说的String

Java中不得不说的String一、String的基本特性String:字符串,使用一对""引起来表示;String声明为final的,不可被继承,字符串常量池是不会存储相同内容的字符串的;String实现了Serializable接口:表示字符串是支持序列化的;String实现了Comparable接口:表示string可以比较大小;String在jdk8及以前内部定义了final char[] value用于存储字符串数据。JDK9时改为byte[]。String再也不用

2021-07-21 21:50:22 104 1

原创 JVM之执行引擎

执行引擎一、执行引擎概述1.1 执行引擎属于JVM的下层,里面包括解释器、及时编译器、垃圾回收器​ 执行引擎是Java虚拟机核心的组成部分之一。​ 执行引擎属于JVM的下层,里面包括解释器、及时编译器、垃圾回收器。1.2 虚拟机和物理机的区别?​ “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能

2021-07-20 22:52:49 81

原创 JVM之对象实例化

JVM之对象实例化一、 对象实例化1.1 创建对象的方式new:最常见的方式、Xxx的静态方法,XxxBuilder/XxxFactory的静态方法Class的newInstance方法:反射的方式,只能调用空参的构造器,权限必须是publicConstructor的newInstance(XXX):反射的方式,可以调用空参、带参的构造器,权限没有要求使用clone():不调用任何的构造器,要求当前的类需要实现Cloneable接口,实现clone()使用序列化:从文件中、

2021-07-18 22:39:18 250

转载 JVM之方法区

方法区一、栈、堆、方法区的交互关系二、方法区的理解2.1 方法区在哪里​ 方法区看作是一块独立于Java堆的内存空间。2.2 方法区的基本理解方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java

2021-07-18 21:03:56 75

转载 JVM之堆

JVM之堆一、核心概述​ 堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。​ 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。​ Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。​ 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。《Java虚拟机规范》中

2021-07-18 16:30:52 108

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

本地方法接口和本地方法栈一、什么是本地方法?​ 简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。​ 本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。二、为什么使用Native Method?2.1 与Java环境的交互​ 有时Java应用需要与Java外面的环境交互,这是本地方法存在的主要原因。你可以想想Java需要与一些底层系统,

2021-07-11 22:13:38 69

转载 运行时数据区之虚拟机栈

运行时数据区之虚拟机栈一、虚拟机栈概述1.1 虚拟机栈出现的背景​ 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。​ 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。1.2 内存中的栈与堆​ 栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放哪里1.3 虚拟机栈基本内容1.3.1 Java

2021-07-11 21:21:49 98

转载 运行时数据区和PC寄存器

运行时数据区和PC寄存器前面已经简单介绍了JVM概述和类加载系统,传送门如下:https://blog.csdn.net/weixin_43823391/article/details/118637349、https://blog.csdn.net/weixin_43823391/article/details/118652235一、JVM运行时数据区1.1 运行时数据区​ 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会

2021-07-11 15:23:27 131

转载 JVM各组件详情介绍之类加载子系统和类的生命周期

JVM各组件详情介绍之类加载子系统和类的生命周期​ 上文已经简单介绍了JVM,本文主要介绍JVM各组件的功能。JVM结构图献上:​ 有需要的同学点击链接传送门:https://blog.csdn.net/weixin_43823391/article/details/118637349一、类的生命周期1.1 概述​ 在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。​ 按照Java虚拟机规范,从class文件到加载到内存中

2021-07-11 11:29:27 97

原创 JVM概述

JVM概述一、高级语言与计算器1.1 计算器​ 计算器是近代人发明的可以进行数字运算的机器。1.2 机器指令​ 机器指令(Machine Instructions)是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。1.3 汇编语言​ 汇编语言是直接在硬件之上工作的编程语言,是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬

2021-07-10 16:52:22 83

原创 java多线程锁优化

java多线程锁优化在JDK1.6之前,synchronized的实现才会直接调用ObjectMonitor的enter和exit,这种锁被称之为重量级锁。**高效并发是从JDK 1.5 到 JDK 1.6的一个重要改进,HotSpot虚拟机开发团队在这个版本中花费了很大的精力去对Java中的锁进行优化,如适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等,锁的获取判断次序是偏向锁->轻量级锁->重量级锁。这些技术都是为了在线程之间更高效的共享数据,以及解决竞争问题。本文要介绍的这几个概念,以

2021-03-01 13:09:04 127

原创 多线程之syncrinized 原理介绍

多线程之syncrinized 原理介绍(一)synchronized,是Java中用于解决并发情况下数据同步访问的一个很重要的关键字。当我们想要保证一个共享资源在同一时间只会被一个线程访问到时,我们可以在代码中使用synchronized关键字对类或者对象加锁。众所周知,在Java中,synchronized有两种使用形式,同步方法和同步代码块。1、区别对于同步方法,JVM采用ACC_SYNCHRONIZED标记符来实现同步。 对于同步代码块。JVM采用monitorenter、monitorex

2021-03-01 11:57:16 528

原创 多线程之volatile原理分析

多线程之volatile原理分析volatile与有序性volatile一个强大的功能,那就是他可以禁止指令重排优化。通过禁止指令重排优化,就可以保证代码程序会严格按照代码的先后顺序执行。那么volatile又是如何禁止指令重排的呢?先给出结论:volatile是通过内存屏障来来禁止指令重排的。**内存屏障(Memory Barrier)**是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。volatile通过

2021-03-01 11:53:50 114

原创 线程池之概念解析

线程池之概念及ThreadPoolExecutor解析​ 注意:因为常用线程池的构建本文讲解以JUC中的ThreadPoolExecutor为主,以该类为主还会夹杂线程池其他一些信息。一、概念1.1 概念​ 为了解决频繁请求创建线程,导致系统由于过度消耗内存或“切换过度”而导致系统资源不足的问题,就有了线程池的概念,线程池的核心逻辑是提前创建好若干个线程放在一个容器中。如果有任务需要处理,则将任务直接分配给线程池中的线程来执行就行,任务处理完以后这个线程不会被销毁,而是等待后续分配任务。1.

2021-03-01 11:49:15 227

原创 unsafe原理

unsafe原理与park和unpark使用Unsafe要注意以下几个问题:1、Unsafe有可能在未来的Jdk版本移除或者不允许Java应用代码使用,这一点可能导致使用了Unsafe的应用无法运行在高版本的Jdk。2、Unsafe的不少方法中必须提供原始地址(内存地址)和被替换对象的地址,偏移量要自己计算,一旦出现问题就是JVM崩溃级别的异常,会导致整个JVM实例崩溃,表现为应用程序直接crash掉。3、Unsafe提供的直接内存访问的方法中使用的内存不受JVM管理(无法被GC),需要手动管理,

2021-03-01 11:46:48 408 2

原创 cas 原理分析

CAS 原理分析1、了解java中锁的类型1.1 悲观锁(Pessimistic Lock)顾名思义,就是很悲观,假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。1.2 乐观锁(Optimistic Lock)顾名思义,就是很乐观,假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。每次拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,

2021-03-01 11:45:58 2900

原创 AQS之独占模式和共享模式

AQS之独占模式和共享模式由于ReentrantLock是一个独占锁,独占锁的知识可以参考AQS之理论知识(一)和AQS之公平锁和非公平锁(二) 两篇文章,本文重点讲解共享模式。并且本文共享模式的讲解以CountDownLatch为主。一、概念​ AQS提供了两种工作模式:独占(exclusive)模式和共享(shared)模式。它的所有子类中,要么实现并使用了它独占功能的 API,要么使用了共享功能的API,而不会同时使用两套 API,即便是它最有名的子类 ReentrantReadWriteLoc

2021-03-01 11:40:57 5976 8

原创 AQS之公平锁和非公平锁

AQS之公平锁和非公平锁(二)一、概念注意:因为ReentrantLock 类可以实现公平锁和非公平锁,所以本文的讲解以该类为主。1.1 公平锁​ 多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。1.2 非公平锁​ 多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。在这个过程中,会和队列中的线程竞争,得到锁的顺序并不一定是先到先得。1.3 ReentrantLock 类​ ReentrantL

2021-03-01 11:39:30 3022

原创 AQS之理论知识

AQS之理论知识(一)一、概念​ AQS全称为AbstractQueuedSynchronizer(后面都以AQS简称),翻译过来叫做抽象队列同步器,是一个抽象类,其实也是一个单机多线程基础同步框架,这个框架通过对同步状态的原子性管理,实现对多线程的管理。子类应该定义一个非公开的内部类继承AQS,并实现其中方法。此部分介绍以独占模式为主。​ 子类根据需要需要重写下面的方法:​ tryAcquire​ tryRelease​ tryReleaseShared​ isHeldExclusi

2021-03-01 11:38:15 689 1

原创 多线程基础

多线程基础一、概念1.1程序、进程与线程的概念和区别1.1.1 程序:​ 是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。1.1.2进程:​ 正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。进程作为资源分配的单位, 系统在运行时会为每个进程分配不同的内存区域。1.1.3线程:​ 进程可进一步细化为线程,是一个程序内部的一条执行路径,是任务分配的基本单元。若一个进程同一时间并行执行多个线程,就是支持多线程的1.2.并行和串行的区别

2021-03-01 11:35:44 191

原创 单例的几种实现方式

单例一、相关概念单例:是java23中常见的设计模式之一,属于创建型模式,保证一个类只有一个实例,并对外提供调用对象该实例的方法。意图:保证一个类在应用全局只有一个对象,减少对象的品频繁创建。何时使用:控制实例数量,减少对象的创建,优化系统资源。关键代码:1、构造函数私有;2、单例使用静态引用。二、实现方式从实例初始化的时机可以分为饿汉式、懒汉式。饿汉式:资源加载时实例就被初始化,一般是在借用类加载机制,在类加载的初始化单例对象,可以避免多线程同步问题,但是容易产生系统垃圾。懒汉式:第一次

2021-01-08 19:46:14 1438

原创 Java常用集合ArrayList源码分析

ArrayList作为日常开发工作中使用的高频集合,虽然自己已经熟练使用了该集合的某些API,但总是感觉欠点火候,近期静下心来,结合各方资料,自己阅读了一遍源码,记录一下自己的想法。 ArrayList源码相比于其他集合来说,比较简单,我从上往下阅读,争取一行一行解析。源码主体第一行表明:Arraylist是一个具体的实现类,实现了List<E>, RandomAccess, Cloneable, java.io.Serializable四个接口,RandomAccess, Cl...

2020-11-15 23:02:36 89

空空如也

空空如也

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

TA关注的人

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