内存泄漏与SWAP
内存泄漏如何发生没正确回收分配后的内存,导致了泄漏。 访问的是已分配内存边界外的地址,导致程序异常退出 用户空间内存包括多个不同的内存段,比如只读 段、数据段、堆、栈以及文件映射段等。这些内存段正是应用程序使用内存的基本方式。 只读段、数据段、栈不会泄漏在程序中定义了一个局部变量,比如一个**整数数组 int data[64]** ,就定义了 一个可以**存储 64 个整数的内存段。由于这是一个局部变量,它会从内存空间的栈中分配内存。栈内存由系统自动分配和管理。一旦程序运行超出了这个局部变量的作用域,栈内存就会被 系统自动回收,所以不会产生内存泄漏的问题。** 只读段,包括程序的代码和常量,由于是只读的,不会再去分配新的内存,所以也不会产 生内存泄漏。 数据段,包括全局变量和静态变量,这些变量在定义时就已经确定了大小,所以也不会产 生内存泄漏。 堆和文件映射可能会泄漏事先并不知道数据大小,所以你就要用到标准库函数** malloc() ,在程序中动态分配内存。这时候,系统就会从内存空间的堆中分配内存。堆内存由应用程序自己来分配和管理。除非程序退出,这些堆内存并不会被系统自动释放,...
单例模式完全版
应用资源管理器 属性管理器 多例是为了存储数据的,单例是为了共享可以减少资源消耗 饿汉式–JVM保证线程安全(简单推荐)因为JVM可以保证每个类只加载一次,所以设置为static就可以保证对象只会被new一次,static是在加载链接初始化中的初始化就会赋值的,只执行一次。 多线程都没关系 但是用到与否,类加载就已经实例化 12345678910111213141516171819202122232425262728package com.deltaqin.designPattern.d01_singleton;/** * @author deltaqin * @date 2021/3/26 1:39 下午 */public class Single01 { private static final Single01 INSTANCE = new Single01(); public static Single01 getInstance() { return INSTANCE; } public void m(...
命令模式
解耦:通过命令对象解耦,而不是直接操作想要操作的对象。 这样的好处就是在修改被操作的对象的方法的时候,只需修改中间的调用者这一个地方,而不是把之前的所有的调用者都修改一遍 增加命令的时候只需增加命令类即可,命令类就是对编辑器操作的包装,基础功能早就在上面写好了。命令类就是起到了解耦,增加命令(组合命令)方便 将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。 命令模式适合用在需要将请求调用者和请求的执行者进行解耦的场景。 需要请求的撤销操作时也是可以使用命令模式的。 1.优点:命令模式可以将请求的调用者和请求的执行者进行解耦。(调用者可能是键盘鼠标一个按钮,他们都要和receiver对线) 2.缺点:命令模式因为需要将命令封装成对象,所以每有一个命令就需要创建一个对象,这样造成命令对象这些小类特别多。 编辑器设计 有些命令会改变编辑器的状态 (例如剪切和粘贴),很多操作对应的是同一个命令,所以直接封装为对象,调用对象就好,而不是直接操作Editor,不然的话Editor有个...
内存知识总结
虚拟内存与多级页表对普通进程来说,能看到的其实是内核提供的虚拟内存,这些虚拟内存还需要通过页表,由系统映射为物理内存。 当进程通过 malloc() 申请虚拟内存后,系统并不会立即为其分配物理内存,而是在首次访 问时,才通过缺页异常陷入内核中分配内存。 内存缓存为了协调 CPU 与磁盘间的性能差异,Linux 还会使用 Cache 和 Buffer ,分别把文件和磁 盘读写的数据缓存到内存中。 内存回收一旦发现内存紧张,系统会通 过三种方式回收内存: 基于 LRU(Least Recently Used)算法,回收缓存; 基于 Swap 机制,回收不常访问的匿名页; 基于 OOM(Out of Memory)机制,杀掉占用大量内存的进程。 直接内存回收:缓存回收和 Swap 回收实际上都是基于 LRU 算法,也就是优先回收不常访 问的内存。LRU 回收算法,实际上维护着 active 和 inactive 两个双向链表,其中: active 记录活跃的内存页; inactive 记录非活跃的内存页。 越接近链表尾部,就表示内存页越不常访问。这样,在回收内存时,系统就...
原型、克隆Prototype模式
复制已有对象, 而又无需使代码依赖它们所属的类。 下面不是规范的克隆,这是复制浅克隆(新属性指向原对象),深克隆 java自带,需要实现标记接口,重写clone方法。一个对象属性多指定起来麻烦会使用,不会比new有多的好处, JDK 中的原型克隆注意字符串不需要,因为intern得到是常量池里面的同一个字符串,克隆修改只会使得变量指向其他的常量 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758package com.deltaqin.designPattern.d16_prototype;/** * 深克隆 * * @author deltaqin * @date 2021/3/27 3:20 下午 */public class CloneDemo { public static void main(String[] args) throws Exception { Per...
中介者、调停者Intermediary模式
调节互相直接的关系 该模式让你将对象间的所有关系抽取成为一个单独的类, 以使对于特定组件的修改工作独立于其他组件。 抽象中介者接口声明了一个能让组件将各种事件通知给中介者的方法。中介者可对这些事件做出响应并将执行工作传递给其他组件。 具体中介者类可解开各组件之间相互交叉的连接关系并将其转移到中介者中。 创建所有组件对象并将当前中介者传递给其构造函数以建立连接。 当组件中有事件发生时,它会通知中介者。中介者接收到通知后可自行处理,也可将请求传递给另一个组件。 抽象组件会使用中介者接口与中介者进行交互。因此只需将它们与不同的中介者连接起来,你就能在其他情境中使用这些组件了。 具体组件之间无法进行交流。它们只有一个交流渠道,那就是向中介者发送通知。 应用消息中间件
可供选择的体系结构
之前发现大多数时间只有20%的指令会使用,所以不使用复杂的扩展指令集,而是使用RISC,目前大多数体系结构采用RISC内核实现CISC架构 RISC设备RISC是一种设计方法,比CISC指令集规模更小的指令集。 复杂指令集最初是为了解决存储器成本高,CISC(功能强大,密集,变长)占用的空间小执行时间长,随着存储器成本下降,RISC占用的空间大执行的时间短开始主流。 提高CPU性能: 减少指令提升CISC性能 最小化每条指令的时钟周期数提升RISC性能 CISC设备依靠微代码来执行指令,变长指令译码为微代码耗时 RISC指令大多可以在一个时钟周期内完成,微程序被硬连线取代,对于复杂指令的处理,从指令集 转移给 编译器 在CISC里面的乘法在RISC使用循环加法实现的,但是总的时钟周期RISC小于CISC 包含多少个寄存器组,每一组包含多少个寄存器,不同进程使用不同的寄存器组,程序员的角度只可以看到寄存器组内部的寄存器。每一个寄存器组内部可以分为若干不同寄存器集合:输入、局部、输出。 寄存器窗口精确重叠之后可以参数传递更加方便 Flynn分类法一种极端及体系结构的分...
备忘录模式memento
序列化反序列使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列化提供了一个标准机制 在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。 案例Gender类,是一个枚举类型,表示性别 123public enum Gender { MALE, FEMALE } 每个枚举类型都会默认继承类java.lang.Enum,而该类实现了Serializable接口,所以枚举类型对象都是默认可以被序列化的。 123456789101112131415161718192021222324252627282930313233343536public class Person implements Serializable...
工厂方法+抽象工厂设计模式
基本的多态的使用 简单工厂随便一个东西,简单create方法就是简单工厂 单例可以看做是简单的工厂 可扩展性不好。每次添加都要新的方法 工厂方法模式 Factory 接口:工厂方法模式的核心接口之一。使用方会依赖 Factory 接口创建 Product 对象实例。 Factory 实现类( FactoryImpl 1 和 FactoryImpl 2):用于创建 Product 对象。不同的 Factory 实现会根据需求创建不同的 Product 实现类。 Product 接口:用于定义业务类的核心功能。Factory 接口创建出来的所有对象都需要实现 Product 接口。使用方依赖 Product 接口编写其他业务实现,所以使用方关心的是 Product 接口这个抽象,而不是其中的具体实现逻辑。 Product 实现类( ProductImpl 1 和 ProductImpl 2):实现了 Product 接口中定义的方法,完成了具体的业务逻辑。 灵活的方式指定不同的 族系 基于多态 抽象工厂:(电脑公司)定义抽象方法。方法返回值是抽象产品 存在意义:调用者可以有...
大数据概述
大数据( Big Data):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决海量数据的额存储和分析计算 特点:大量,高速,多样,低价值密度, 应用场景:物流仓储,分析用户零售,智慧旅游,广告推荐,保险预测,人工智能 大数据生态 1)Sqoop:Sqoop是一款开源的工具,主要用于在Hadoop、Hive与传统的数据库(MySql)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 2)Flume:Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据; 3)Kafka:Kafka是一种高吞吐量的分布式发布订阅消息系统; 4)Storm:Storm用于“连续计算”,对数据流做连续查询,在计算时就将结果以流的形式输出给用户。 5)Spark:Spark是当前最流...