自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(109)
  • 收藏
  • 关注

转载 指针初识-黑马c++学习

指针1 指针的基本概念指针的作用:可以通过指针间接访问内存。内存编号是从0开始记录的,一般用十六进制数字表示可以利用指针变量保存地址2 指针的定义#include <iostream>using namespace std;int main(){ int a = 10; //定义指针 int *p; //给指针复制 p = &a; cout << &a << endl; cout <&l

2021-08-08 20:33:21 210

转载 Redis 缓存淘汰策略

Redis 缓存淘汰策略将Redis用作缓存时,如果内存空间用满,就会自动驱逐老的数据。默认情况下memcached就是这种方式,大部分开发者都比较熟悉。LRU时Redis唯一支持的回收算法。本文消息介绍用于限制最大内存使用量的maxmemory指令,并深入了解Redis所使用的近似LRU算法。maxmemory配置指令maxmemory用于指定Redis能使用的最大内存。既可以在redis.conf文件中配置,也可以在运行过程中通过config set命令动态实现修改。例如,要设置100MB的内

2020-09-18 10:12:44 221

转载 如何防止form表单重复提交

防止表单重复提交的4种方法1.背景与介绍:平时开发的项目中可能会出现下面这些情况:由于用户误操作,多次点击表单提交按钮。由于网速等原因造成页面卡顿,用户重复刷新提交页面。黑客或恶意用户使用postman等工具重复恶意提交表单(攻击网站)。2.解决方案2.1通过JS屏蔽提交按钮通过js代码,当用户点击提交按钮后,屏蔽提交按钮使用户无法点击提交按钮或点击无效,从而实现防止表单重复提交。ps:js代码很容易被绕过,比如用户通过刷新页面方式,或使用postman等工具绕过前段页面仍能重复提交表

2020-09-17 22:19:36 775

原创 Spring 监听器的简单用法

SpringApplicationListener用法与原理SpringApplicationListener的简介与基本用法SpringApplicationListener是Spring为我们提供的事件监听器,它主要是为我们提供事件监听机制,我们可以创建一个监听器,并向该监听器创建相应的事件,当该事件发生时,我们可以我们的监听器就会得到相应的通知,并且触发相应的逻辑。是典型的观察者模式基本用法@FunctionalInterfacepublic interface ApplicationLis

2020-09-04 00:03:36 299

原创 SpringIOC容器创建过程

Spring整体流程1.SpringIOC容器初始化流程(ApplicationContext的初始化)如上图所示,Spring注解ApplicationContext通过配置类创建IOC容器。public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this(); register(componentClasses); refresh();}@Overridepub

2020-09-04 00:01:12 258

转载 SpringMVC常见面试题

SpringMVC常见面试题1.什么是SpringMVC?简单介绍下你对SpringMVC的理解SpringMVC是一个基于Java实现的MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。2.SpringMVC核心组件前端控制器DispatcherServlet作用:接收请求、相应结果,相当于转发器,有了DIspatcherServlet就减少了其他组件之

2020-08-04 16:31:18 214

转载 Java内部类相关知识

Java内部类基础Java可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类一般包括成员内部类,局部内部类,匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。成员内部类...

2020-08-04 09:27:06 90

原创 MySQL锁总结

MySQL锁总结锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性,有效性,锁重读也是影响数据库并发访问性能的一个重要因素。锁是MySQL在服务器层和存储引擎层的并发控制。加锁是消耗资源的,锁的各种操作,包括获得锁,检测锁是否已解除,释放锁等。锁机制共享锁与排他锁共享锁(读锁):其他事务可以读,但不能写。排他锁(写锁):其他事务不能读取,也不能写。粒度锁MySQL不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引

2020-07-28 14:45:54 150

原创 JVM GC G1垃圾回收器

G1回收器官方给G1设定的目标实在延迟可控的情况下获得尽可能高的吞吐量,所以才担当起”全功能收集器“的重任与期望。G1时一个并行回收器,它把堆内存分割为很多不相关的区域,使用不同的Region来表示Eden,幸存者0区,幸存者1区,老年代等。G1 GC有计划的避免在整个Java堆中进行全区域的垃圾收集。G1跟踪这个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。由于这种方式的侧重点在于回收垃圾最大量的区间,所以我们给G1一个名字,

2020-07-18 11:14:17 236

原创 JVM 常见的垃圾收集器

垃圾回收器垃圾回收器的分类串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如CPU处理器或者较小的应用内存硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器,所以,串行回收默认被应用在客户端的Client模式下的JVM中。在并发能力比较强的CPU上,并行回收器产生的停顿时间要短语串行回收器和串行回收相反,并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行

2020-07-18 09:03:10 113

原创 JVM 垃圾收集 内存相关问题与四种引用类型

垃圾回收的相关概念System.gc()的理解在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用JVM实现者可以通过System.gc()调用来决定JVM的GC行为,而一般情况下,垃圾回收应该是自动机型的,无需手动触发,否则就太过于麻烦了。System.gc() 与 System.ru

2020-07-18 08:57:27 145

原创 JVM常见的GC算法

JVM 垃圾回收概述垃圾收集机制是Java的招牌能力,极大的提高了开发效率。如今,垃圾收集几乎称为现代语言的标配,及时经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,堆垃圾收集提出了新的挑战。什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一致保存到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。早期垃圾回收在早期的

2020-07-18 08:52:46 382

原创 Spring AOP原理(3)--目标方法的调用

Spring AOP原理目标方法的执行容器中保存了组件的代理对象(cglib增强后的对象),这个对象里面保存了详细信息(比如增强器,目标对象,等);CglibAopProxy.intercept();拦截目标方法的执行根据ProxyFactory对象获得将要执行的目标方法拦截器链;List interceptorList保存所有拦截器 ,一个默认的ExposeInvocationInterceptor和4个增强器;遍历所有的增强器,将其转为interceptor。将增强器转为我们要用的Me

2020-07-17 13:56:24 323

原创 Spring AOP原理(2)-AnnotationAwareAspectJAutoProxyCreator的注册与使用

Spring AOP原理(2)Spring 容器注册AnnotationAwareAspectJAutoProxyCreator流程注册配置类,调用refresh()刷新容器。调用registerBeanPostProcessors(beanFactory);注册bean的后置处理器方便拦截bean的创建。先获取ioc容器中已经定义了的需要创建对象的所有BeanPostProcessor。优先注册实现了PriorityOrdered接口的BeanPostProcessor。再给容器中

2020-07-17 13:55:03 141

原创 Spring AOP原理(1)--@EnableAspectJAutoProxy

Spring AOP原理@EnableAspectJAutoProxy注解使用Spring 的AOP功能需要再配置类上添加@EnableAspectJAutoProxy注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAutoProxy { /** *

2020-07-17 13:50:54 187

转载 Spring Bean 生命周期

Spring Bean的声明周期Bean生命周期概述Spring Bean的声明周期共有4个,分别为实例化 Instantiation属性赋值 Populate初始化 Initialization销毁 Destruction主要逻辑都在doCreate()方法中,逻辑很清晰,就是顺序调用以下三个方法,这三个方法与三个生命周期意义对应,分别为createBeanInstance()->实例化populateBean()->属性赋值initializeBean()->

2020-07-16 12:42:02 95

转载 MySQL查询慢的原因

MySQL查询慢的情况一、分类讨论一条SQL语句执行的很慢,那是每次都执行很慢呢,还是大多数情况下正常,偶尔出现的很慢?因此需要分以下两种情况来讨论大多数情况是正常的,只是偶尔会出现很慢的情况。在数据量不变的情况下,这条SQL语句一直以来都执行的很慢二、情况一一条SQL大多数情况正常,偶尔才会出现很慢的情况,针对这种情况,这条SQL语句本身的书写时没什么问题的,而是其他原因导致的,那是什么原因呢?1.数据库在刷新脏页当我们要往数据库插入一条数据、或者要更新一条数据的时候,我们直到数据库会

2020-07-09 12:34:30 820

原创 JVM对象实例化过程

JVM对象的实例化从字节码文件看创建对象的过程判断对象对应的类是否加载、链接、初始化虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。如果没有,那么在双亲委派模式下,使用当前类加载器已ClassLoader+包名+类名为Key进行查找对应的.class文件。如果没有找到文件,则抛出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的Class类对象

2020-07-09 11:36:11 1643

原创 JVM String常量池

JVM StringTableString:字符串,使用一堆""引起表示String s1 = “atguigu”;String s2 = new String(“atguigu”);String声明为final的,不可被继承String实现了Serializable接口,表示可以序列化String实现了Comparable接口,表示可以排序JDK1.8之前String底层时char[],JDK1.9变为byte[]。字符串常量池字符串常量池中不会存储相同内容的字符串Stri

2020-07-09 09:50:10 140

原创 JVM执行引擎

JVM执行引擎虚拟机时一个相对于物理机的概念,这两种机器都有代码执行能力,其区别时物理机的执行引擎时直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约的定制指令集和执行引擎的结构体系,能够执行不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字节码指令、符号表、以及其他辅助信息。如果让一个Jav

2020-07-09 09:37:45 131

原创 JVM 方法区

JVM方法区方法区的用途: 主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。PermGen(永久代)什么是永久代永久代是方法区的一种实现,只有Java1.7之前的HotSpot虚拟机才有永久代,对于其他类型的虚拟机并没有永久代,方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。在JDK1.8中HotSpot已经没有永久代这个区间,取而代之的是一个叫做Metaspace(元空间)的东西。

2020-07-09 09:00:18 99

原创 JVM 堆内存总结

JVM的堆内存方法区和堆对进程来说是唯一的,一个进程对应一个JVM实例。堆的核心概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域Java堆区在JVM启动时就被创建,其空间大小也就确定了。是JVM管理的最大的一块内存空间。《JVM虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(TLAB)所有的对象实例以及数组都应该在运行时分配在堆上。数组和对象可能永远

2020-07-02 13:39:11 361 1

原创 JVM 虚拟机栈(动态链接与方法重写)

JVM虚拟机栈动态链接(指向运行时常量池的方法引用)每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接。比如invokedynamic指令。在Java源文件被编译到字节码文件中,所有的变量和方法都作为符号引用保存在class文件的常量池里,比如:描述一个方法调用了其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接就是为了将这些符号引用转换为调用方法的直接引用。帧数据区保存着能够访问常量池的指针。pub

2020-06-28 22:44:45 1345

原创 JVM虚拟机栈(局部变量表与操作数栈)

JVM虚拟机栈(局部变量表与操作数栈)虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点时跨平台,指令集小,编译器容易实现,缺点时性能下降,实现同样的功能需要更多的指令。栈是运行时的单位,堆时存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储问题,即数据怎么放,放在哪里。public class StackTest{ public static void main(Strin

2020-06-27 22:30:37 2621 2

原创 JVM运行时数据区概述与程序计数器

JVM运行时数据区JVM定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁,另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。上述本地方法栈,程序计数器,虚拟机栈为线程私有,堆区和元数据区为线程共享的。Runtime 实例一个JVM实例就对应着一个Runtime实例线程线程是一个程序的运行单元。JVM允许一个应用有多个线程并行的执行,再Hotspot JVM里,每个线程都与操作系统的本地线程直接映射

2020-06-27 16:24:58 137

原创 JVM 双亲委派模型与其他类加载器相关知识

JVM 双亲委派模型与沙箱安全模型现象JVM对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模型,即把请求交给父类处理,他是一种任务委派模型。创建一个java.lang包,再其中创建一个String下面代码使用的不是自定义的String类,还是JDK核心api库中的Stringpublic class StringTest{ public static

2020-06-26 22:26:45 79

原创 JVM 类加载器分类

Java类加载器分类JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。从概念上讲,自定义类加载器一般指的是程序中有开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生与抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,再程序中我们最常见的类加载器始终只有3个Bootstrap ClassLoader(使用c++语

2020-06-26 21:42:07 392

原创 JVM ClassLoader加载过程

JVM ClassLoader加载过程JVM类加载阶段LoadingLinkingInitialization类加载器子系统的作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定加载的类信息存放与一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常

2020-06-26 19:22:25 128

原创 SpringMVC 拦截器

SpringMVC拦截器SpringMVC提供了拦截器机制,允许运行目标方法之前进行一些拦截工作,或者目标方法之后进行一些其他处理;Filter:javaWeb拦截器:SpringMVCHandlerInterceptorpublic interface HandlerInterceptor { //目标方法运行之前调用,返回为true 放晴,返回为false,不放行 default boolean preHandle(HttpServletRequest request, HttpSe

2020-05-28 23:44:54 255 1

原创 SpringMVC ResponseBody

SpringMVC快速返回ajax功能返回数据是json就可以;页面时$.ajax();原生javaweb导入gson返回数据用gson转成json返回SpringMVC导包写配置添加jackson依赖<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId

2020-05-28 21:56:45 300

原创 SpringMVC 视图解析器流程分析

Spring视图解析器(ViewResolve)视图解析器会将Controller中String的返回值(视图名)进行拼串。@Controllerpublic class HelloController{ @RequestMapping("/hello") public String hello(){ return "../../hello"; }}//forward:转发到一个页面// /hello.jsp:转发到当前项目下的hello@Reques

2020-05-26 21:49:37 245

原创 SpringMVC DispatcherServlet 分析

SpringMVC-DispatcherServlet源码总结SpringMVC工作流程DispatcherServlet用户的请求最先到达DispatcherServlet,他是springmvc的核心,也是中央处理器。DispatcherServlet的核心就是doDispatcher这个方法protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception

2020-05-23 23:40:32 165

原创 SpringMVC HelloWorld常用知识

SpringMVC HelloWorldHelloWorld运行流程客户端点击链接会发送http://localhost:8080/springmvc/hello请求来到tomcat服务器:SpringMVC的前端控制器收到所有请求来看请求地址和@RequestMapping标注的那个匹配,来找到使用哪个类的哪个方法处理前端控制器找到了目标处理器类和目标方法,直接利用反射执行目标方法方法执行完成后会有一个返回值,若无其他注解,SpringMVC会认为这个返回值就是要去的页面地址拿到方法返回

2020-05-19 23:48:58 113

原创 Spring 事务学习

Spring 事务Spring事务中的使用方法常见的有两种,一种是编程式事务,一种是声明式事务。编程式事务目前使用的较少,一般是jdbc进行数据库操作而没有引入其他框架时,就需要通过手动编写事务进行处理。声明式事务@Transactional,在实际开发中,对于一组数据库操作特别是增删改操作,为了保证原子性,通常需要用事务来控制,要么全部成功,要么全部失败。尽可能将Mysql执行语句放到方法体后面靠。因为MySQL事务的commit语句是在第一次执行MySQL相关语句开始,一直到方法的结束。@Tr

2020-05-14 16:32:14 102

原创 Redis学习(7)--有序集合对象

Redis 有序集合有序集合编码有ziplist或者skiplist。ziplist编码的有序集合使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素则保存元素的分值。压缩列表内的集合元素按分值从小到大进行排序, 分值较小的元素被放置在靠近表头的方向, 而分值较大的元素则被放置在靠近表尾的方向。举个例子, 如果我们执行以下 ZA...

2020-05-07 11:14:04 262

转载 Java 动态代理

Java动态代理首先我们介绍代理模式静态代理模式[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zrz9qToq-1588689266715)(C:\Users\lym\AppData\Roaming\Typora\typora-user-images\image-20200505143328273.png)]静态代理可以做到在不修改目标对象前提下,对目标...

2020-05-05 22:36:11 138

原创 Java 注解

注解Annotation从JDK5.0开始引入的新技术Annotation的作用:不是程序本身,可以对程序做出解释。可以被其他程序读取Annotation的格式:注解是以“@注释名”在代码中存在的,还可以添加一些参数值,Annotation在哪里使用?可以附加在package,class,method,field上面,详单与给他们添加了额外的辅助信息,我们...

2020-05-04 23:03:35 109

原创 Redis学习(6)--Redis集合对象

Redis集合对象集合对象的编码可以时intset或者hashtable。Redis整数集合的实现整数集合(intset)是 Redis 用于保存整数值的集合抽象数据结构, 它可以保存类型为 int16_t 、 int32_t 或者 int64_t 的整数值, 并且保证集合中不会出现重复元素。每个 intset.h/intset 结构表示一个整数集合:typedef struct int...

2020-05-04 21:36:59 113

原创 Redis学习(5) 哈希对象

Redis 哈希对象哈希对象的编码可以是ziplist或者hashtable。ziplist编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾,因此:保存了同一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值的节点在后;先添加到哈希对象中的键值对会被放在压...

2020-05-03 17:41:46 130

原创 SpringBoot学习 日志系统

SpringBoot日志系统市面上的日志框架JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…日志门面 (日志的抽象层)日志实现 (日志的抽象层)JCL(Jakarta Commons Logging SLF4j(Simple Logging Facade for Java) jboss-loggiJUL(java.uti...

2020-05-03 13:04:27 155

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除