某些设计模式的Java实现
1. 单例模式1.1 饿汉式12345678910public class Singleton{ private static Singleton instance = new Singleton(); //私有构造方法 private Singleton(){}; public static Singleton getInstance() { return instance; }}
1.2 懒汉式123456789101112131415public class Singleton{ private static Singleton instance = null; //私有构造方法 private Singleton(){}; //synchronized 保证线程安全 synchronized public static Singleton getInstance() { if(in ...
JVM(三):字节码与类加载
字节码指令javap工具Oracle提供了class文件反编译工具:javap,使用:javap -v Hello.class,即可反编译Hello.class文件。
效果如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566Classfile /D:/IDEA/Workspace/JVM/out/production/JVM/Hello.class Last modified 2022年8月11日; size 519 bytes SHA-256 checksum 8045a3a5ec29528b945e8ad71cc0b6274ef2bb7a5513aa2c2473446f744189cf Compiled from "Hello.java"public class Hello minor version: 0 major version: 52 flag ...
Java对象晋升的四种方式
四种方式
担保机制
大对象直接进入老年代
长期存活的对象进入老年代
动态对象年龄判断
担保机制当新生代中无法容纳新对象时,则JVM会通过担保机制将大对象直接放到老年代中。如下图:
代码:
123456789101112131415161718192021public class test1 { /*JVM参数: -XX:+PrintGCDetails -verbose:gc -Xms30M -Xmx30M 参数说明 * -XX:+PrintGCDetails 程序执行完成后打印内存使用情况 * -verbose:gc 每次GC后打印日志 * -Xms30M 初始堆内存 * -Xmx30M 最大堆内存 */ public static int _1M = 1024 * 1024; public static void main(String[] args) { byte[] bytes1 = new byte[2 * _1M ...
JVM(二):垃圾回收
一些VM参数:
含义
参数
堆初始大小
-Xms
堆最大大小
-Xmx 或 -XX:MaxHeapSize=size
新生代大小
-Xmn或(-XX:NewSize=size±XX:MaxNewSize=size)
幸存区比例(动态)
-XX:InitialSurvivorRatio=ratio和-XX:+UseAdaptiveSizePolicy
幸存区比例
-XX:SurvivorRatio=ratio
晋升阈值
-XX:MaxTenuringThreshold=threshold
晋升详情
-XX:+PrintTenuringDistribution
GC详情
-XX:+PrintGCDetails -verbose:gc
FullGC前MinorGC
-XX:+ScavengeBeforeFullGC
一、判断对象能否回收的方式引用计数法引用计数法即某对象被引用一次,则引用次数加1,当引用次数为0时,则被回收。
缺点;若出现循环引用,则无法回收,会导致内存泄漏。
可达性分析算法
JVM中的垃圾回收器通过可达性分析来探索 ...
JVM(一):内存结构
JVM(一):内存结构一、JVM概述定义Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境)
好处
一次编写,到处运行
自动内存管理,垃圾回收机制
数组下标越界检查
JVM JRE JDK的比较
二、内存结构整体结构
程序计数器PC
定义:Program Counter Register 程序计数器(寄存器)
作用:==记录JVM中要执行的下一条指令的地址==
特点:
线程私有
CPU会为每个线程分配时间片,当当前线程的时间片使用完以后,CPU就会去执行另一个线程中的代码
程序计数器是每个线程所私有的,当另一个线程的时间片用完,又返回来执行当前线程的代码时,通过程序计数器可以知道应该执行哪一句指令
不会存在内存溢出
虚拟机栈
定义:
每个线程运行所需要的内存空间称为虚拟机栈;
每个栈由多个栈帧组成,对应着每次调用方法时所占用的内存;
每个线程只能有一个活动栈帧,对应着当前正在执行的方法,会处于虚拟机栈的栈顶。
调整栈空间大小:
12-Xss空间大小-Xss8M
实例:
常见问题辨析:
垃圾回收是否涉及栈内存?
不 ...
SpringBoot整合Redis的两种方式
SpringBoot整合Redis实现基本操作
相关项目:后端:gqd000/OurBlog: 多人博客系统 (github.com)
1前端:
1664635775/BlogDemo (github.com)
Redis应用场景:
缓存
任务队列
网站访问统计
应用排行榜
数据过期处理
分布式集群架构中的 session 分离
整合方式:使用注解和不适用注解
注意:实体类必须实现序列化接口:implements Serializable
Redis
五种数据结构
结构类型
结构存储的值
结构的读写能力
String
可以是字符串、整数或者浮点数
对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement)
List
一个链表,链表上的每个节点都包含了一个字符串
从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素
Set
包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同
添 ...
ELK实现模糊搜索并高亮
ELK实现全文模糊搜索高亮
相关项目:后端:gqd000/OurBlog: 多人博客系统 (github.com)
前端:1664635775/BlogDemo (github.com)
后端代码部分:
以搜索文章内容和标题为zhu例,先创建显示的实体类ArticleSearchDTO:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960package com.digging.model.dto;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;import org.springframework.data.annotation.Id;import org.springframework.data.elasticsearch.ann ...
Java笔记(四)
多线程基础一、线程相关概念
程序:是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码。
进程:指运行中的程序
比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间;
进程是程序的一次执行过程,或是正在运行的一个程序;
进程是动态过程:有它自身的产生、存在和消亡的过程。
线程
线程有进程创建,是进程的一个实体;
一个进程可以有多个线程。
单线程:同一时刻,只允许执行一个线程。
多线程:同一个时刻,可以执行多个线程,比如:一个QQ进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件。
并发:同一时刻,多个任务交替执行,造成一种“貌似同时”的错觉,单核CPU的多任务就是并发。
并行:同一时刻,多个任务同时执行,多核CPU可以实现并行。
二、创建线程的两种方法
在Java中,创建线程有两种方法:
继承Thread类,重写run方法(Thread类也实现了Runnable接口);
实现Runnable接口,重写run方法。
继承Thread类
当一个类继承了 ...
Java笔记(三)
集合一、前言
集合框架体系
Collection接口特点方法
Collection接口的子接口:
List实现类:ArrayList、LinkedList、Vector
Set实现类:HashSet、LinkedHashSet
Map接口、特点方法、遍历方式
Map接口的实现类:HashMap、Hashtable等
Collections工具类的使用
集合与数组
数组:
长度开始时必须指定,而且一旦指定,不能更改
保存的必须为同一类型的元素
使用数组进行增加元素的示意代码-比较麻烦
集合
可以动态保存任意多个对象,使用比较方便
提供了一系列方便的操作对象的方法:add、remove、set、get等
使用集合添加,删除新元素的代码简洁
集合体系图
Collection体系图(单列集合:Collection重要子接口List和Set,实现子类都是单列集合)
Map体系图(双列集合:Map接口的实现子类是双列集合,存放的 K-V)
二、Collection接口Collection接口实现类的特点
Collection实现子类可以存放多个 ...
Java笔记(二)
枚举(Enumeration)和注解(Annotation)[toc]
一、枚举
引出枚举类:
需求:创建Season类,包含季节的值,且季节的值是有限的4个(春夏秋冬),此类只读,不需要修改。
枚举类自定义枚举类
规范
不提供set()方法,枚举类通常只读;
对枚举对象/属性使用final static共同修饰,实现底层优化;
枚举对象名通常使用全部大写,常量的命名规范;
枚举对象根据需要可以有多个属性。
特点
构造器私有化;
本类内部创建一组对象;
对外暴露对象(通过为对象添加public final static修饰符)
可以提供get()方法,但不提供set()方法。
代码演示
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849public class test1 { public static void main(String[] args) { //访问对象实例 System.out.println(Sea ...