
阶段6:编程思想
文章平均质量分 91
设计模式
数据结构与算法
jvm等
1.01^1000
记录一些给自己看的笔记,不断的总结积累
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[6-01-01].第12节:字节码文件内容 - 属性表集合
【代码】[6-01-01].第12节:字节码文件内容 - 属性表集合。原创 2025-06-05 18:26:59 · 316 阅读 · 0 评论 -
[6-01-01].第05节:初识字节码文件 - 解读字节码文件指令
【代码】[6-01-01].第05节:初识字节码文件 - 解读字节码文件指令。原创 2025-06-05 17:29:42 · 939 阅读 · 0 评论 -
[6-04-03].第03节:并发编程 - 线程中常见方法
原创 2024-08-22 22:57:20 · 542 阅读 · 0 评论 -
[6-04-04].第04节:并发编程 - 线程的生命周期
【代码】[6-04-04].第04节:并发编程 - 线程的生命周期。原创 2024-09-12 22:27:45 · 356 阅读 · 0 评论 -
[6-04-02].第02节:并发编程 - 线程的创建
1.Java语言的JVM允许程序运行多个线程,使用 java.lang.Thread类代表线程所有的线程对象都必须是Thread类或其子类的实例2.Thread类的特性每个线程都是通过某个特定Thread对象的run()方法来完成操作的,因此把run()方法体称为线程执行体通过该Thread对象的start()方法来启动这个线程,而非直接调用run()要想实现多线程,必须在主线程中创建新的线程对象//1. 创建一个继承于Thread类的子类。原创 2024-09-12 22:46:51 · 781 阅读 · 0 评论 -
[6-04-01].第01节:并发编程 - 进程与线程
程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)一个进程之内可以分为一到多个线程。原创 2022-01-28 11:06:10 · 129 阅读 · 0 评论 -
[6-01-03].共享模型之管程 - 共享问题
【代码】[6-01-03].共享模型之管程 - 共享问题。原创 2025-04-13 08:53:45 · 722 阅读 · 0 评论 -
[6-01-01].第01章:JVM虚拟机
1.Java是面向对象的语言,我们在创建对象的时候,肯定会涉及到方法区、堆、栈;然后我们new出来的这个对象肯定是放在堆空间的,对象所属的类型信息是放在方法区的,方法中的局部变量放在栈中;本节的逻辑是new出对象后,如何将栈、堆、方法区这三块粘合在一起工作的;原创 2024-05-17 16:05:19 · 883 阅读 · 0 评论 -
[6-01-02].第02章:设计模式
Java API中涉及到的设计模式:Spring框架中涉及到的API:SpringMVC中使用到的设计模式:SpringBoot中使用的设计模式:原创 2024-04-22 21:47:35 · 927 阅读 · 0 评论 -
[011-11].第11章:直接内存
1.直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存方式存在的问题:也可能导致outofMemoryError异常。4.通常,访问直接内存的速度会优于Java堆。2.直接内存是在Java堆外的、直接向系统申请的内存区间。3.来源于NIO,通过存在堆中的。操作Native内存。原创 2024-06-07 15:12:59 · 277 阅读 · 0 评论 -
[6-01-25].第25节:运行时数据区-虚拟机栈
1.由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。2.根据栈来设计的优点是跨平台,指令集小,编译器容易实现3.根据栈来设计的缺点是性能下降,实现同样的功能需要更多的指令1.栈是运行时的单位,而堆是存储的单位2.栈解决程序的运行问题,即程序如何执行,或者说如何处理数据3.堆解决的是数据存储的问题,即数据怎么放,放哪里1.局部变量表也被称之为局部变量数组或本地变量表2.局部变量表定义为一个数字数组,主要用于。原创 2024-06-07 14:45:25 · 688 阅读 · 0 评论 -
[6-01-11].第11节:字节码文件中的指令集 - 指令集概述
1.Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令2.Java虚拟机的指令由 一个字节长度的,代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成3.由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以多数的指令都不包含操作数,只有一个操作码4.下图中粉红色标记的那部分就是字节码文件中的字节码指令,然后我们在Idea中使用插件看到的字节码指令是白色图样式,这些可以叫做助记符。原创 2024-06-19 10:57:26 · 487 阅读 · 0 评论 -
# 10. 同步指令
组成java虚拟机支持两种同步结构:方法级的同步和方法内部一段指令序列的同步,这两种同步都是使用monitor来支持的。方法级的同步:是隐式的,即无须通过字节码指令来控制,它实现在方法调用和返回操作之中。虚拟机可以从方法常量池的方法表结构中的 ACC_SYNCHRONIZED 访问标志得知一个方法是否声明为同步方法;当调用方法时,调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否设置。如果设置了,执行线程将先持有同步锁,然后执行方法。原创 2024-11-11 18:02:29 · 1081 阅读 · 0 评论 -
方法调用与返回指令及 操作数栈管理指令
因此dup_x1插入位置:1+1=2,即栈顶2个slot下面dup_x2插入位置:1+2=3,即栈顶3个slot下面dup2_x1插入位置:2+1=3,即栈顶3个slot下面. dup2_x2插入位置:2+2=4,即栈顶4个S1ot下面。对于带_x的复制插入指令,只要将指令的dup和x的系数相加,结果即为需要插入的位置。通过ineturn指令,将当前函数操作数栈的顶层元素弹出,并将这个元素压入调用者函数的操作数栈中(因为调用者非常关心函数的返回值),所有在当前函数操作数栈中的其他元素都会被丢弃。原创 2024-11-11 17:59:21 · 919 阅读 · 0 评论 -
[6-01-04].第04节:基础信息
【代码】[6-01-04].第04节:基础信息。原创 2024-06-13 23:56:00 · 858 阅读 · 0 评论 -
[6-01-07].第07节:类索引、父类索引、接口索引
1.在访问标记后,会指定该类的类别、父类类别以及实现的接口,格式如下:长度含义u2this_classu2u2u2。原创 2024-11-11 16:40:36 · 303 阅读 · 0 评论 -
[6-01-06].第06节:访问表示符(访问标志、访问标记、access_flag)
标志名称标志值含义ACC_PUBLIC0x0001标志为public类型ACC_FINAL0x0010标志被声明为final,只有类可以设置ACC_SUPER0x0020标志允许使用invokespecial字节码指令的新语义,JDK1.0.2之后编译出来的类的这个标志默认为真。(使用增强的方法调用父类方法)0x0200标志这是一个接口0x0400是否为abstract类型,对于接口或者抽象类来说,次标志值为真,其他类型为假0x1000。原创 2024-11-11 16:38:54 · 565 阅读 · 0 评论 -
[0309].第09节.组合模式
1.组合模式又称为部分整体模式又名部分整体模式,是用于把一组相似的对象当成一个单一的对象2.组合模式依据树形结构来组合对象,用来表示“整体-部分”的层次关系。它创建了对象组的树形结构3.组合模式使得用户对单个对象和组合对象的访问具有一致性,(即组合能让客户端以一致的方式处理个别对象以及组合对象。原创 2024-04-25 15:52:11 · 504 阅读 · 0 评论 -
[0310].第10节.装饰器模式
动态的将新功能附加到对象上,在对象功能扩展方面,它比继承更有弹性装饰者模式也体现了开闭原则(ocp)原创 2024-04-25 15:34:13 · 911 阅读 · 0 评论 -
[0320].第20节.迭代器模式[重点掌握]
提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。原创 2024-06-21 17:06:58 · 946 阅读 · 0 评论 -
[0324].第24节.备忘录模式
1.备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。原创 2024-04-24 13:53:58 · 272 阅读 · 0 评论 -
[0307].第07节.适配器模式
1.适配器模式是将某个类的接口转换成客户端期望的另一个接口表示,主要是兼容性,使得原本因接口不匹配不能一起工作的两个类可以协同工作。其别名是包装器(Wrapper)类适配器模式、对象适配器模式、接口适配器模式3.类适配器模式中类之间的耦合度比对象适配器模式高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些4.对象适配器模式是最常用的模式1.适配者(Adaptee)类:电源 220V:System.out.println("电压" + 220 + "伏");原创 2024-04-25 15:44:00 · 701 阅读 · 0 评论 -
[0304].第04节.工厂模式
1.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。定义了一个创建对象的工厂类,由这个工厂类来封装实例化对象的代码。2.在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式,属于创建型模式定义一个创建对象的抽象方法,由子类工厂决定要实例化的类。工厂方法模式将对象的实例化推迟到子类1.有的人喜欢吃肯德基的披萨,有的人喜欢吃麦当劳的披萨为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。原创 2024-04-24 10:20:31 · 938 阅读 · 0 评论 -
[0316].第16节.观察者模式
1.又被称为发布-订阅(Publish/Subscribe)模式,它定义了对象之间一对多的依赖关系,让多个观察者对象同时监听某一个主题对象2.当这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。原创 2024-04-24 14:27:48 · 898 阅读 · 0 评论 -
[4-02-03].第03节.创建型模式 - 单例模式
1.单例模式提供了一种创建对象的最佳方式,单例模式就是采取一定的方法保证在整个的软件系统中,某一个类只能存在一个对象实例,且该类只提供一个取得其对象实例的方法(静态方法),可以直接访问,不需要实例化该类的对象2.单例模式它主要用于资源管理,避免资源冲突,保证全局唯一的场景,比如 Hibernate 的 SessionFactory,它充当数据存储源的代理,并负责创建 Session 对象。SessionFactory 并不是轻量级的,一般情况下,原创 2024-04-24 12:28:02 · 780 阅读 · 0 评论 -
[0240-20].第18节:代理模式
1.Java中提供了一个动态代理类Proxy,Proxy并不是我们上述所说的代理对象的类,而是提供了一个创建代理对象的静态方法(newProxyInstance方法)来获取代理对象,使用Proxy.newProxyInstance()方式来获取代理对象1.如果没有定义SellTickets接口,只定义了TrainStation(火车站类)。很显然JDK代理是无法使用了,因为JDK动态代理要求必须定义接口,对接口进行代理2.CGLIB是一个功能强大,高性能的代码生成包。原创 2024-05-20 14:49:41 · 610 阅读 · 0 评论 -
[0308].第08节.桥接模式
1.将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变2.桥接模式基于类的最小设计原则(类的最小设计原则意思就是:让新增的类尽量的少),通过使用封装、聚合、继承等行为让不同的类承担不同的职责3.它的主要特点是把抽象与行为实现分离开,从而可以保持各部分的独立性以及功能扩展1.假设现在有一个类Something,当想在Something中增加新功能时(想增加一个具体方法时),会编写一个Something类的子类(派生类),如SomethingGood类。这样就构成了一个小小的类层次结构。原创 2024-04-24 10:57:54 · 855 阅读 · 0 评论 -
[0323].第23节.中介者模式
1.又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,中介者使各个对象不需要显式地相互引用,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互2.在中介者模式中,团队组员之间不再互相沟通并私自做出决定,而是发生任何事情都向中介者报告,中介者站在整个团队的角度上对组员上报的事情做出决定。当中介者下达指示时,团队组员立即执行2.比如 MVC 模式,C(Controller 控制器)是 M(Model 模型)和 V(View 视图)的中介者,在前后端交互时起到了中间人的作用。原创 2024-04-24 14:02:06 · 890 阅读 · 0 评论 -
[0317].第17节.职责链模式[重点掌握]
1.职责链模式(Chain of Responsibility Pattern),又叫责任链模式,为了避免请求发送者与多个请求处理者耦合在一起,可以将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止2.职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者。原创 2023-10-07 17:15:36 · 86 阅读 · 0 评论 -
[0722].第22节.访问者模式
1.访问者模式(Visitor)是一种操作一组对象的操作,它的目的是不改变对象的定义,但允许新增不同的访问者,来定义新的操作。比如基于访问者模式的一个简单示例在线购物车:假设您有不同的商品,如书籍、电子产品和服装。每件商品都可以接受执行诸如计算总价或应用折扣等操作的访客。这样,您可以在不更改商品类别的情况下添加新功能,从而使系统更易于维护和更新。2.访问者模式主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题在被访问的类里面加一个对外提供接待访问者的接口。原创 2024-06-21 17:06:29 · 928 阅读 · 0 评论 -
[4-02-19]. 第19节.对象行为模式 - 状态模式[特殊字符]
1.上面的实现方式中,由具体状态类来实际调用方法切换到另一个状态,如DayState类的doClock方法,这种方式既有优点又有缺点:优点:当我们想知道“什么时候从DayState的类变化为其他状态”,只需要查看DayState类即可缺点:每个ConcreteState角色都需要知道其他ConcreteState角色的方法,各个类之间的依赖关系较强,如果删除了一个ConcreteState类,就需要修改其他的ConcreteState类。原创 2024-04-24 12:47:08 · 907 阅读 · 0 评论 -
[0305].第05节.建造者模式[重点掌握]
1.通俗的讲,比如你想盖一个房子,需要修地基,砌墙,封顶,它们的地基深度,砌墙高度,封顶宽带不一样,最终的房子天差地别。2.而这样的根据相同的过程,不同的组装所产生出的具体的内容,就是建造者模式的具体实现,也就是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。原创 2024-04-24 13:30:34 · 937 阅读 · 0 评论 -
[0355].第7-04节:垃圾回收器
1.垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现2.由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本3.从不同角度分析垃圾收集器,可以将GC分为不同的类型1.有了虚拟机,就一定需要收集垃圾的机制,这就是,对应的产品我们称为Garbage Collector。1999年随JDK1.3.1一起来的是串行方式的serialGc,它是第一款GC。ParNew垃圾收集器是Serial收集器的多线程版本。原创 2024-06-07 14:58:09 · 610 阅读 · 0 评论 -
[0355].第7-03节:垃圾回收相关概念
1.内存溢出相对于内存泄漏来说,内存溢出也是引发程序崩溃的罪魁祸首之一2.由于GC一直在发展,一般情况下不太容易出现ooM的情况,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度3.大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的Fu11GC操作,这时候会回收大量的内存,供应用程序继续使用没有空闲内存,并且垃圾收集器也无法提供更多内存1.内存泄漏也称作“存储渗漏”。只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。原创 2024-06-07 14:59:31 · 881 阅读 · 0 评论 -
[6-01-01].第39节:垃圾回收相关算法
垃圾标记阶段:主要是为了判断对象是否存活1.在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段2.当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡引用计数算法和可达性分析算法1.引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。原创 2024-06-07 15:00:46 · 668 阅读 · 0 评论 -
[6-01-01].第38节:啥是垃圾回收机制
1.GC是垃圾回收的简称在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。原创 2024-04-09 21:46:05 · 680 阅读 · 0 评论 -
[0354].第6-01节:执行引擎
1.执行引擎是Java虚拟机核心的组成部分之一2.“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是:物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式3.字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。原创 2024-03-17 23:15:07 · 744 阅读 · 0 评论 -
[0350].第5-1节:对象的实例化
根据字节码指令来分析:new指令的话,先去判断方法区中是否已经加载该类,类加载器进行加载,然后,加载完成后就去创建对象,堆空间开辟出一块内存,然后进行默认初始化后;dup就是复制操作,再栈中把变量的引用复制一份,其中一份是压入栈底,进行赋值操作,另一份一般用来引用操作。然后就是invoke操作,就是调用的init方法,对应的就是调用的类中构造器,堆属性进行初始化。astore_1指令是把变量从操作数栈中取出然后放在局部变量表中。原创 2024-06-07 15:12:02 · 698 阅读 · 0 评论 -
[0349].第4-7节:运行时数据区-方法区
对于HotSpotJVM而言,方法区有一个别名叫做Non-Heap(非堆),目的就是要和堆分开,所以方法区看作是一块独立于Java堆的内存空间1.方法区主要存放的是 Class,而堆中主要存放的是 实例化的对象2.方法区(Method Area)与Java堆一样,是各个线程共享的内存区域3.方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的4.方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。或者加载大量的第三方的jar包可能OOM。原创 2024-06-07 15:10:26 · 913 阅读 · 0 评论 -
[0348].第4-6节:运行时数据区-堆
1.堆也是Java内存管理的核心区域,堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一个堆空间的2.Java堆区在JVM启动的时候即被创建,其空间大小也就确定了堆是JVM管理的最大一块内存空间堆内存的大小是可以调节的3.《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的4.所有的线程共享Java堆,在这里还可以划分。原创 2024-06-07 15:09:06 · 910 阅读 · 0 评论