𝓝𝓮𝓶𝓸&博客

摘要: 垃圾回收器 GC 分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的 JVM 来实现。 由于 JDK 的版本处于高速迭代过程中,因此 Java 发展至今已经衍生了众多的 GC 版本。 从不同角度分析垃圾收集器,可以将 GC 分为不同的类型。 Java 不同版本新特性 阅读全文
posted @ 2020-07-21 13:57 Nemo& 阅读(718) 评论(0) 推荐(0)
摘要: 垃圾回收相关概念 System.gc() 的理解 在默认情况下,通过 System.gc() 或者 Runtime.getRuntime().gc() 的调用,会显式触发 FullGC,同时对新生代、老年代和方法区进行回收,尝试释放被丢弃对象占用的内存。 然而 System.gc() 调用附带一个免 阅读全文
posted @ 2020-07-21 13:54 Nemo& 阅读(237) 评论(0) 推荐(0)
摘要: 垃圾回收相关算法 标记阶段:引用计数算法 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC 才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在 阅读全文
posted @ 2020-07-21 13:47 Nemo& 阅读(245) 评论(0) 推荐(0)
摘要: 垃圾回收概述 概念 这次我们主要关注的是黄色部分,内存的分配与回收 垃圾收集 垃圾收集,不是 Java 语言的伴生产物。早在 1960 年,第一门开始使用内存动态分配和垃圾收集技术的 Lisp 语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候回收? 如何回收? 垃圾收集机制是 阅读全文
posted @ 2020-07-21 13:46 Nemo& 阅读(224) 评论(0) 推荐(0)
摘要: StringTable String的基本特性 String:字符串,使用一对 "" 引起来表示 String s1 = "Nemo"; // 字面量的定义方式 String s2 = new String("Nemo"); String 声明为 final 的,不可被继承 String 实现了 S 阅读全文
posted @ 2020-07-21 13:20 Nemo& 阅读(909) 评论(0) 推荐(0)
摘要: 执行引擎 执行引擎概述 执行引擎属于 JVM 的下层,里面包括 解释器、及时编译器、垃圾回收器 执行引擎是 Java 虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的 阅读全文
posted @ 2020-07-21 12:09 Nemo& 阅读(296) 评论(0) 推荐(0)
摘要: 直接内存 Direct Memory 不是虚拟机运行时数据区的一部分,也不是《Java 虚拟机规范》中定义的内存区域。 直接内存是在 Java 堆外的、直接向系统申请的内存区间。 来源于 NIO,通过存在堆中的 DirectByteBuffer 操作 Native 内存 类型 传输类型 基于 备注 阅读全文
posted @ 2020-07-20 20:00 Nemo& 阅读(709) 评论(0) 推荐(0)
摘要: 对象实例化内存布局与访问定位 从各自具体的内存分配上来讲 new 的对象放在堆中 对象所属的类型信息是放在方法区的 方法当中的局部变量放在栈空间 这 new 的对象怎么把三块粘合到一起 就是这章的内容了 对象实例化 面试题 美团: 对象在 JVM 中是怎么存储的? 对象头信息里面有哪些东西? **蚂 阅读全文
posted @ 2020-07-20 19:59 Nemo& 阅读(373) 评论(0) 推荐(0)
摘要: 为什么要进行单元测试? 单元测试的目的就在于, 当你修改了项目中的其中一部分代码A,可能会影响到其他代码B的逻辑,所以我们在写完代码后需要在每一个代码逻辑上都加上单元测试断言,这样就可以提前判断其他代码的逻辑运行是否符合预期,如果不符合预期,就代表你的修改影响了其他代码的逻辑,不能上传,得保证其他代 阅读全文
posted @ 2020-07-20 18:30 Nemo& 阅读(779) 评论(0) 推荐(0)
摘要: 方法区 前言 这次所讲述的是运行时数据区的最后一个部分 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及会话管理 栈、堆、方法区的交互关系 下面就涉及了对象的访问定位 Person:存放在元空间,也可以说方法区 person:存 阅读全文
posted @ 2020-07-20 14:00 Nemo& 阅读(1705) 评论(1) 推荐(2)
摘要: 堆 堆的核心概念 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM,但是进程包含多个线程,他们是共享同一堆空间的。 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的核心区域。 Java 堆区在 JVM 启动的时候即被创建,其空间大小也就确定了。是 JVM 管理的最 阅读全文
posted @ 2020-07-20 12:56 Nemo& 阅读(804) 评论(0) 推荐(0)
摘要: 本地方法栈 Java 虚拟机栈于管理 Java 方法的调用,而本地方法栈用于管理本地方法的调用。 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态扩展的内存大小。(在内存溢出方面是相同的) 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java 虚拟机将会抛出一个 StackOve 阅读全文
posted @ 2020-07-20 12:54 Nemo& 阅读(395) 评论(0) 推荐(0)
摘要: 本地方法接口 什么是本地方法 简单地讲,**一个 Native Method 是一个 Java 调用非 Java 代码的接囗。**一个 Native Method 是这样一个 Java 方法:该方法的实现由非 Java 语言实现,比如 C。这个特征并非 Java 所特有,很多其它的编程语言都有这一机 阅读全文
posted @ 2020-07-20 12:52 Nemo& 阅读(312) 评论(0) 推荐(0)
摘要: 虚拟机栈 虚拟机栈概述 由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 有不少 Java 开发人员一提到 Java 内存结构,就会非常粗粒度地将 阅读全文
posted @ 2020-07-20 11:47 Nemo& 阅读(997) 评论(0) 推荐(0)
摘要: 程序计数器 介绍 JVM 中的程序计数寄存器(Program Counter Register)中,Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的现场信息。CPU 只有把数据装载到寄存器才能够运行。 这里,并非是广义上所指的物理寄存器,或许将其翻译为 PC 计数器(或指令计数器 阅读全文
posted @ 2020-07-20 11:29 Nemo& 阅读(321) 评论(0) 推荐(0)
摘要: 运行时数据区概述及线程 前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 首先栈、堆与方法区都是在内存中的,都是属于运行时数据区,读入了内存才能被称作运行时。 栈是运行时的单位,而堆是存储的单位。 类似于CPU寄存器和内存的关系,而CPU的架构难以统一,为了跨平台,所以栈 阅读全文
posted @ 2020-07-20 10:55 Nemo& 阅读(234) 评论(0) 推荐(0)
摘要: 类加载子系统 概述 完整图如下: 如果自己想手写一个 Java 虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件,Class 文件在文件开头有特定的文件标识(CAFE BABE)。 ClassLoader 只负责 阅读全文
posted @ 2020-07-19 22:09 Nemo& 阅读(536) 评论(0) 推荐(1)
摘要: JVM与Java体系结构 前言 作为 Java 工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接 OOM(out of memory)! 想解决线上 JVM GC 问题,但却无从下手。 新项目上线,对各种 JVM 参数设置一脸茫然,直接默认吧然后就 阅读全文
posted @ 2020-07-17 13:33 Nemo& 阅读(630) 评论(2) 推荐(1)
摘要: 导言:生产环境下开发不再是一个项目一个工程,而是每一个模块创建一个工程,而多个模块整合在一起就需要使用到像 Maven 这样的构建工具。 1 Why? 1.1 真的需要吗? Maven 是干什么用的?这是很多同学在刚开始接触 Maven 时最大的问题。之所以会提出这个问题,是因为即使不使用 Mave 阅读全文
posted @ 2020-07-14 13:02 Nemo& 阅读(360) 评论(1) 推荐(0)
摘要: 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它 阅读全文
posted @ 2020-07-09 17:39 Nemo& 阅读(566) 评论(0) 推荐(0)
摘要: 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 基本介绍 **意图:**定义一 阅读全文
posted @ 2020-07-09 17:38 Nemo& 阅读(331) 评论(0) 推荐(1)
摘要: 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 基本介绍 **意图:**允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的 阅读全文
posted @ 2020-07-09 17:37 Nemo& 阅读(392) 评论(0) 推荐(0)
摘要: 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 基本介绍 **意图:**给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用 阅读全文
posted @ 2020-07-09 17:35 Nemo& 阅读(376) 评论(0) 推荐(0)
摘要: 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 **主要解决:**所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部 阅读全文
posted @ 2020-07-09 17:33 Nemo& 阅读(231) 评论(0) 推荐(0)
摘要: 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 基本介绍 **意图:**用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从 阅读全文
posted @ 2020-07-09 17:32 Nemo& 阅读(241) 评论(0) 推荐(0)
摘要: 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。事件驱动模型。 设计思想:通过注解或者定义接口,可以拿到所有的执行方法。通过反射或者实现类,在获取事件的地方拿到所有执行方法,循环执行。 基本 阅读全文
posted @ 2020-07-09 17:30 Nemo& 阅读(396) 评论(0) 推荐(1)
摘要: 迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 基本介绍 **意图:**提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。 阅读全文
posted @ 2020-07-09 17:29 Nemo& 阅读(252) 评论(0) 推荐(0)
摘要: 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 基本介绍 **意图:**主要将数 阅读全文
posted @ 2020-07-09 17:27 Nemo& 阅读(280) 评论(0) 推荐(0)
摘要: 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 基本介绍 **意图:**将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行 阅读全文
posted @ 2020-07-09 17:26 Nemo& 阅读(2025) 评论(0) 推荐(0)
摘要: 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 当算法的结构已经固定,但某些步骤需要子类来实现时,可以通过模板方法模式提供一个固定的步骤框架,而将某些 阅读全文
posted @ 2020-07-09 17:25 Nemo& 阅读(293) 评论(0) 推荐(0)
摘要: 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 在 AOP(面向切面编程)中,Spring 实现的很多功能(如事务、日志等)都可以看作代理模式的应用。这点也和装饰器模式类似, 阅读全文
posted @ 2020-07-09 17:23 Nemo& 阅读(402) 评论(0) 推荐(0)
摘要: 享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。 基本介绍 **意图 阅读全文
posted @ 2020-07-09 17:22 Nemo& 阅读(721) 评论(0) 推荐(0)
摘要: 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。 基本介绍 **意图:* 阅读全文
posted @ 2020-07-09 17:21 Nemo& 阅读(237) 评论(0) 推荐(0)
摘要: 组合模式 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组 阅读全文
posted @ 2020-07-09 17:20 Nemo& 阅读(256) 评论(0) 推荐(0)
摘要: 装饰器模式(Decorator Pattern),也叫包装器模式(Wrapper Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了 阅读全文
posted @ 2020-07-09 17:19 Nemo& 阅读(400) 评论(0) 推荐(0)
摘要: 桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。 基本介绍 **意 阅读全文
posted @ 2020-07-09 17:18 Nemo& 阅读(392) 评论(0) 推荐(1)
摘要: 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入 阅读全文
posted @ 2020-07-09 17:17 Nemo& 阅读(2607) 评论(0) 推荐(0)
摘要: 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 基本介绍 **意图:**将一个复杂的构建与其表 阅读全文
posted @ 2020-07-09 17:16 Nemo& 阅读(416) 评论(0) 推荐(0)
摘要: 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操 阅读全文
posted @ 2020-07-09 17:04 Nemo& 阅读(504) 评论(0) 推荐(0)
摘要: 在讲抽象工厂模式之前,我们先用抽象工厂模式的一个特殊例子——“工厂方法模式”来铺垫一下。 工厂方法模式 简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改。假如增加其他种类的披萨,工厂类需要修改,如何解决? 这就用到工厂方法模式,创建一个工厂接口和创建多 阅读全文
posted @ 2020-07-09 17:03 Nemo& 阅读(2851) 评论(0) 推荐(0)