
JavaEE
文章平均质量分 80
JavaEE开发。Spring全家桶,中间件
小小本科生debug
但日子还长,机会也还会有的,不用总是匆匆忙忙那么慌张。
展开
-
Netty零拷贝机制
通过FileRegion包装的FileChannel.tranferTo实现文件传输,可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题。这样,在进行网络传输时,就可以减少内核空间到用户空间的拷贝次数。netty中的零拷贝和操作系统中零拷贝有点不一样,操作系统实现零拷贝主要是在内核态的优化,netty完全是在用户状态实现零拷贝。操作系统的核心是内核,它不同于普通应用程序,所以为了保护内核的存储空间,操作系统将虚拟空间分为了两个部分:内核空间和用户空间。原创 2023-02-12 11:18:10 · 1790 阅读 · 1 评论 -
JVM 基础 - Java 垃圾回收机制
给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。原创 2023-02-03 10:50:20 · 2198 阅读 · 0 评论 -
JVM 基础 - Java 类加载机制
3、缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。原创 2023-02-02 21:35:06 · 570 阅读 · 0 评论 -
JVM基础 - 类加载的过程
其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的。而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也称为动态绑定)。。原创 2023-02-02 18:06:52 · 339 阅读 · 0 评论 -
JVM 基础 - JVM 内存结构
永久代物理是堆的一部分,和新生代,老年代地址是连续的(受垃圾回收器管理),而元空间存在于本地内存(我们常说的堆外内存,不受垃圾回收器管理),这样就不受 JVM 限制了,也比较难发生OOM(都会有溢出异常),并没有规定如何去实现它,不同的厂商有不同的实现。本地方法栈和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。:主管 Java 程序的运行,它保存方法的局部变量、部分结果,并参与方法的调用和返回。原创 2023-02-01 16:17:15 · 1131 阅读 · 0 评论 -
JVM类的加载机制
类的加载机制一:类加载的过程1.加载2.验证3.准备4.解析5.初始化二:类加载器类和类加载器双亲委派模型一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中验证、准备、解析三个部分统称为连接。一:类加载的过程1.加载在加载阶段,Java虚拟机需要完成以下三件事情:通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的jav原创 2022-01-21 16:58:46 · 894 阅读 · 0 评论 -
JVM垃圾回收机制
JVM垃圾回收机制一:回收堆内存1.如何判定对象已死(可达性分析算法)2.对象的引用级别3.对象的死亡过程二:垃圾回收算法1.标记清除算法2.标记复制算法3.标记整理算法三:垃圾收集器1.G1(Garbage First)一:回收堆内存1.如何判定对象已死(可达性分析算法)当前主流的商用程序语言的内存管理子系统,都是通过可达性分析算法来判定对象是否存活的。这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用原创 2022-01-20 20:23:45 · 6456 阅读 · 2 评论 -
Netty 高性能架构设计
Netty 高性能架构设计一:传统阻塞 I/O 服务模型二:Reactor 模型1、单 Reactor 单线程2、3、三:Netty模型一:传统阻塞 I/O 服务模型二:Reactor 模型基于I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理Reactor对应的叫法:① 反应器模式 ② 分发者模式(Dispatcher) ③ 通知者模式(notifier)原创 2021-12-17 21:46:33 · 459 阅读 · 0 评论 -
Java I/O相关知识(BIO、NIO、AIO)
Java I/O一:Unix I/O模型二:Java I/O模型一:Unix I/O模型Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor (fd,文件描述符)。而对一个 socket 的读写也会有相应的描述符,称之为 socket fd (socket描述符)。描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型:阻塞I/O原创 2021-10-21 21:48:12 · 892 阅读 · 0 评论 -
Spring整体架构,IOC、AOP理念
日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。有了IOC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。类是对物体特征的抽象,切面就是对横切关注点的抽象。原创 2021-08-27 17:53:56 · 245 阅读 · 0 评论 -
SpringBoot是如何实现自动配置的?
SpringBoot启动类:@SpringBootApplicationpublic class CommunityApplication { public static void main(String[] args) { SpringApplication.run(CommunityApplication.class, args); }}进入@SpringBootApplication源码中:AutoConfigurationImportSelector 类的作用就是往 Spr原创 2021-08-24 22:03:04 · 2455 阅读 · 10 评论 -
Java中的浅克隆与深克隆
Java---浅克隆与深克隆一:前言二:浅克隆与深克隆的区别一:前言克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据添加,这样也能实现克隆的目的。但当对象属性较多时,这样的克隆方式会比较麻烦,所以Object类中实现了clone方法,用于克隆对象,Java中的克隆分为浅克隆与深克隆。实现克隆的方式1.对象的类需要实现Cloneable接口2.重写Object类中的clone()方法3.根据转载 2021-08-24 14:46:34 · 451 阅读 · 0 评论 -
SpringMVC工作原理及源码解析
SpringMVC工作原理及源码解析一:SpringMVC原理图二:SpringMVC的主要组件1、前端控制器DispatcherServlet:2、处理器映射器HandlerMapping:3、处理器适配器HandlerAdapter:4、处理器Handler:5、控制器Controller:6、视图解析器ViewResolver:7、视图View三:Spring MVC的工作流程四:Spring 如何保证 Controller 并发的安全?1、SpringMVC一个Controller处理所有用户请求的原创 2021-08-21 09:37:09 · 1531 阅读 · 0 评论 -
MyBatis的源码解析和运行原理、及常见面试题
MyBatis的解析和运行原理一:MyBatis是什么?二:ORM是什么三:为什么说Mybatis是半自动ORM映射工具?四:MyBatis编程步骤是什么样的?五:请说说MyBatis的工作原理六:MyBatis的功能架构七:MyBatis数据源与连接池1、MyBatis数据源DataSource分类2、数据源DataSource的创建过程3、DataSource什么时候创建Connection对象4、使用了连接池的PooledDataSource5、Connection对象的回收一:MyBatis是什么原创 2021-08-20 20:02:32 · 447 阅读 · 0 评论 -
Elasticsearch,分布式搜索引擎
Elasticsearch,分布式搜索引擎一:Elasticsearch简介二:Elasticsearch术语三:SpringBoot整合Elasticsearch一:Elasticsearch简介官网:https://www.elastic.co/cn/Elasticsearch是目前性能最好、最流行的搜索引擎,像FaceBook、百度、维基百科、GitHub,很多知名的大厂都在使用Elasticsearch搜索引擎。一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索。原创 2021-08-19 02:14:26 · 492 阅读 · 1 评论 -
Kafka,构建TB级异步消息系统
Kafka,构建TB级异步消息系统一:阻塞队列二:Kafka三:Spring整合Kafka一:阻塞队列这个是Java自带的API,用于解决线程通信的问题①BlockingQueue接口解决线程通信的问题。阻塞方法:put、take。原理图:线程Thread-1从左边存入数据线程Thread-2从右边取出数据阻塞队列Blocking Queue就在中间形成一道缓冲区,从而良好的解决线程通信的问题。阻塞队列满足生产者消费者模式②生产者消费者模式生产者:产生数据的线程。消费者:使原创 2021-08-17 17:57:50 · 316 阅读 · 0 评论 -
maven常见问题
maven常见问题常见问题1-jar包无法下载如下图: idea卡线程了 , 直接重启idea即可idea没有下载 (一直刷新maven 也不下载jar包)常见问题2-配置文件爆红检查jar包是否有下载 - 查看是不是lastUpdate文件的坑检查maven的配置是否有坑检查配置是否有坑删了配置文件的坐标 刷新idea的maven按钮 重新粘贴一次即可如果还是不行 最好 新建空间 重新导入配置常见问题3-ide不识别pom使用+号找到本地的pom.xml 选中确认即原创 2021-08-15 21:30:46 · 2493 阅读 · 5 评论 -
浅谈Java中类的加载
浅谈Java中类的加载首先创建一个.java文件,我们在命令行中用javac命令进行编译编译完打开Person.class文件,这就是字节码文件,16进制的然后我们删除掉Test.Java文件,尝试运行没问题,这就是运行时的时候不需要.java文件,只需要字节码文件执行javah -jni Person你会发现生成.h文件,也就是C++,这里知道启动类加载器的是C++写的就行Jvm是如何使用这些class文件的,就需要类加载器类加载器把class字节码文件加载到运行内存中(Ext原创 2021-07-31 18:39:01 · 223 阅读 · 0 评论 -
服务网关SpringCloud—Gateway概念理解
服务网关SpringCloud—Gateway概念理解一:网关介绍二:演变历史1、zuul 1.X(最初的网关组件)2、gateway(新一代网关)一:网关介绍API网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:(1)客户端会多次请求不同的微服务,增加了客户端的复杂性。(2)存在跨域请求,在一定场景下处理相对复杂。(3)认证复杂,每个服务都需要独立认证。(4)难以原创 2021-07-30 16:46:51 · 697 阅读 · 0 评论 -
Linux服务器CPU100%问题(云服务器中了挖矿病毒)
今天玩云服务器,发现服务器变得很卡顿,解压文件有时都卡死了,很奇怪,不知道服务器出了什么状况。于是登录到阿里云查看云服务器的情况,结果发现服务器的CPU使用率一直维持在100%。于是远程连接到服务器,进行问题排查1、查消耗cpu最高的进程PID,输入top命令2、根据PID查出消耗cpu最高的线程号。top -Hp 512,显示一个进程的线程运行信息列表。3、把上面线程的十进制数转成十六进制(printf %x 1062)为4264、根据线程号查出对应的java线程,进行处理。jstac原创 2021-07-24 22:23:36 · 3446 阅读 · 1 评论 -
SpringBoot整合Redis服务出现DENIED Redis is running in protected mode because protected mode is enabled
发现错误阅读报错信息,大致的意思为说Redis服务处于保护模式,可以采取的解决方法之一:修改配置文件redis.conf。将NETWORK下的protected-mode yes修改为no改过之后,依然报错仔细想了一下可能是Linux的防火墙没有关闭,那就关闭防火墙查看防火墙状态sudo systemctl status firewalld关闭防火墙sudo systemctl stop firewalld打开防火墙sudo systemctl start firewalld原创 2021-07-22 01:11:20 · 543 阅读 · 0 评论 -
Windows下80端口被进程System占用,造成NGINX启动报错的解决方发(nginx: [emerg] bind() to 0.0.0.0:80 failed )
最近在做尚硅谷的尚医通项目由于我们后端有很多服务模块,每个模块都有对应的访问路径与端口,为了提供统一的api接口,所以使用nginx作为反向代理服务器;之前都是在Linux上使用nginx,这次想尝试一下Windows版的nginx。遇到了一些问题启动之后发现报错直觉告诉我应该是80端口被占用的问题,于是解决看到80端口果真被占用。发现占用的pid是4,名字是System。这个进程可是干不掉啊,那怎么禁用呢。于是就一通百度,终于找到了解决方法1、打开注册表:regedit2、找到:HK原创 2021-07-22 00:36:30 · 426 阅读 · 1 评论 -
前端工程化实例简介(Node.js,NPM,Webpack,前端框架)
前端工程化实例简介一:NPM包管理器1、npm简介2、使用npm管理项目1、项目的初始化2、修改npm镜像3、npm install命令二:Webpack1、Webpack简介2、Webpack1、全局安装2、JS打包一:前端框架介绍二级目录三级目录一:NPM包管理器1、npm简介NPM全称Node Package Manager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Node.js的包管理工具,相当于前端的Maven 。2、使用npm管理项目1、原创 2021-07-19 11:30:48 · 1067 阅读 · 2 评论 -
教你理解Java中方法的参数传递
Java中方法的参数传递JVM的内存模型Java中方法的参数传递方式只有一种:值传递这个值是变量在栈内存中的值。基本数据类型在栈中存的是值而引用数据类型存的是对象的地址1、参数传递之基本数据类型栈中存的是基本数据类型的值因此:基本数据类型在参数传递过程中,就是把实参的值复制 到形参上。形参只是实参的值的一个临时存储单元,因此形参与实参虽然值相同,但却有着不同的存储单元,因此对形参的改变不会影响实参的值。2、参数传递之引用对象类型栈中存的是引用对象在堆中的地址因此:引原创 2021-06-29 22:03:27 · 483 阅读 · 0 评论 -
使用Git进行多人协同开发
使用Git进行多人协同开发一:Linux常用命令回顾二、Git的基础配置三、Git的常用指令1.本地仓库的搭建2.代码的上传提交三、Git的分支详解1.什么是分支2.为什么要创建其他分支3.分支的创建与切换4.分支的合并二级目录二级目录三级目录一级目录二级目录三级目录一级目录二级目录三级目录一级目录二级目录三级目录一级目录二级目录三级目录一:Linux常用命令回顾由于Git命令行的操作是基于Linux的所以我们有必要回顾一下Linux的相关指令,以便于我们能更便捷的操作。1)cd : 改变目录。2)原创 2021-04-25 11:42:53 · 1870 阅读 · 0 评论 -
一篇文章教你如何配置Java环境变量
一篇文章教你如何配置Java环境变量为什么要配置环境变量如何配置环境变量如何在命令行下编译运行Java源程序为什么要配置环境变量我们举个例子来说明一下比如我们在D盘的test目录下有一个HelloWorld的Java源程序。现在我们想对其进行编译、运行,那么有两种方法1.需要把该Java源程序移动到javac.exe所在的目录下(javac.exe就是用来编译Java源程序的,java.exe是用来运行Java程序的)但是把Java源程序都放在JDK的bin目录下,这样很不便于后期开发时对原创 2021-01-06 18:26:52 · 379 阅读 · 3 评论 -
Collections集合工具类的方法
Collections集合工具类的方法一: 常用功能二: addAll方法和shuffle方法二: 简述Comparable和Comparator两个接口的区别。一: 常用功能java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。public static void shuff原创 2020-10-18 17:22:38 · 349 阅读 · 0 评论 -
Collection集合、泛型
这里写目录标题一、Collection集合1.1 集合概述1.2 集合框架1.3 Collection 常用功能二、 Iterator迭代器2.1 Iterator接口2.2 增强for三、泛型3.1 泛型概述3.2 使用泛型的好处3.3 泛型的定义与使用含有泛型的接口3.4 泛型通配符一、Collection集合1.1 集合概述集合和数组既然都是容器,它们有啥区别呢?集合:集合是java中提供的一种容器,可以用来存储多个数据。数组的长度是固定的。集合的长度是可变的。数组中存储的是同一原创 2020-10-15 21:38:07 · 196 阅读 · 0 评论 -
抽象类 接口
文章目录一:抽象类1.概述2.定义3.abstract使用格式4.抽象类的特点二:接口(不是类,是特殊的抽象类)1.概述2.定义格式3.接口的特点4.基本的实现5.接口的多实现一:抽象类1.概述父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法 的类就是抽象类。2.定义(1)抽象方法 : 没有方法体的方法。(2)抽象类:包含抽象方法的类。3.原创 2020-10-06 23:12:38 · 227 阅读 · 0 评论 -
Java面向对象程序设计(高级篇)
这里写目录标题一:封装1.封装概述2.封装的步骤3.封装的操作——private关键字4.封装优化1——this关键字5.封装优化2——构造方法二:继承1.概述2.定义3.继承的格式4.继承后的特点——成员变量5.继承后的特点——成员方法6.继承后的特点——构造方法7.继承的特点三:多态1.定义2.多态的体现3.静态多态性(编译时多态)4.动态多态性(运行时多态)5.多态实现的条件一:封装1.封装概述概述面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修原创 2020-10-06 18:49:23 · 677 阅读 · 0 评论 -
Java面向对象程序设计(基础篇)
一:类与对象1.1类的声明类可理解为Java中的一种新的数据类型,他是Java程序设计的基本单位。这种数据类型中封装了数据的内容和对数据内容的操作。类的定义可以看作是建立对象的模板,当程序运行时,已声明的类用来创建新对象。由类创建对象对象的过程称为实例化(instantiation),每个对象都是类的一个新实例(instance)。1.2类与对象的关系类→对象(具体化过程)对象→类(抽象化过程)对象包括1.属性(对象的特征)2.方法(对象的行为)1.3类的声明格式[修饰符] class原创 2020-10-06 17:09:28 · 8486 阅读 · 5 评论 -
Java_work_01
第一次作业内容1.定义一个整型变量并赋任意五位正整数作为初始值,判断它是不是五位回文数2.定义一个整型变量并赋任意五位正整数作为初始值,输出各位数字之和3. 定义整型变量 a、b,写出将 a、b 两个变量值进行互换的程序(要求不能使用第三个变量)4. 请写出一段遵守编码规范的 Hello World 代码1.定义一个整型变量并赋任意五位正整数作为初始值,判断它是不是五位回文数(五位回文数:个位与万位相同,十位与千位相同,例如:12321)package test01;import java.原创 2020-10-04 20:57:52 · 322 阅读 · 0 评论