自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 资源 (1)
  • 收藏
  • 关注

原创 JVM垃圾收集器(六)经典的垃圾收集器(二)

CMS垃圾收集器

2021-09-02 23:55:49 181

原创 ThreadLocal内存泄漏的原因,如何避免

ThreadLocal内存泄漏的原因,如何避免什么是内存泄漏不再会被使用的对象或者变量占用的内存不能够被回收就是内存泄漏内存泄漏是在程序申请内存后,无法释放已申请的内存空间,一次内存泄漏危害可以忽略,但内存泄漏的后果严重,无论多少内存迟早会被占光。强引用和弱引用强引用:使用最普遍的引用(new),一个对象具有强引用,不会被垃圾回收器回收。当内存不足时,JVM宁愿抛出OutOfMemoryError错误,是程序异常终止,也不会回收具有强引用的对象如果想取消强引用和某个对象之间的关联,可以显示的

2021-08-31 23:23:34 209

原创 23种设计模式(一)单例模式

单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式一个重要的思想就是构造器私有。注意:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。饿汉式单例饿汉式单例一上来就会加载对

2021-08-31 23:06:43 245

原创 JVM垃圾收集(五)经典的垃圾收集器(一)

经典的垃圾收集器下图展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用,图中收集器所处的区域,则表示它是属于新生代收集器抑或是老年代收集器。一、Serial收集器Serial收集器是最基础、历史最悠久的收集器,曾经(在JDK 1.3.1之前)是HotSpot虚拟机新生代收集器的唯一选择。这个收集器是一个单线程工作的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线

2021-08-31 00:01:47 138 1

原创 JVM垃圾收集(四)— 简述HotSpot的算法细节实现

HotSpot的算法细节实现一、根节点枚举

2021-08-30 21:12:59 132

原创 JDK1.7和JDK1.8 HashMap put一个元素分别都做了什么

标题

2021-08-26 14:32:46 122

原创 JAVA并发编程(五)简述线程及线程与进程的区别

线程一、什么是线程现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局 部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉 到这些线程在同时执行。java.lang.Thread类中有这样的明确定义:线程是程序中执行的线程,Java虚拟机允许程序同时运行多个执行线程。上Java程序天生就是多线程程序,因为执行main()方法的是一个名称为main的线 程。

2021-08-23 23:10:43 156

原创 JAVA并发编程(四)锁的升级与对比

JAVA并发编程(四)锁的升级与对比一、简述Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在 Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状 态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。二、偏向锁大多数情况下,锁不仅不存在多线程竞争,而且总是由同 一线程多次获得,为了

2021-08-23 21:56:19 79

原创 JAVA并发编程(三)volatile与synchronized的实现原理及区别

volatile与synchronized的实现原理及区别一、概述在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程 修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当 的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。在多线程并发编程中synchronized一直是

2021-08-23 18:05:40 193

原创 Java并发编程(二)死锁的原因及必要条件

死锁的原因及必要条件一、什么是死锁死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。二、死锁产生原因死锁产生的原因主要有两个:竞争资源和进程推进不当1、竞争资源系统中的资源可以分为两类:可剥夺资源和不可剥夺资源可剥夺资源:是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和主存均属于可剥夺性资源;不可剥夺资源:当系

2021-08-23 17:27:50 125

原创 JAVA并发编程(一)上下文切换

上下文切换一、什么是上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。 CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个 任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这 个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。二、如何

2021-08-23 14:54:46 1246

原创 JVM垃圾收集(三)— Appel式回收为什么使用两个Survivor

Appel式回收为什么使用两个Survivor一、Appel式回收Appel式回收的具体做法是把新生代分为一块较大的Eden空间和两块较小的 Survivor空间,每次分配内存只使用Eden和其中一块Survivor。发生垃圾搜集时,将Eden和Survivor中仍 然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8∶1,也即每次新生代中可用内存空间为整个新 生代容量的90%(

2021-08-19 17:21:55 637

原创 JVM垃圾收集(二)—几种垃圾收集算法

几种垃圾收集算法一、标记-清除算法算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记-清除算法是最基础的收集算法,后续的收集算法大多都是以标记-清除算法为基础,对其缺点进行改进而得到的。他的主要缺点有两个:是执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低;内存

2021-08-19 16:31:38 61

原创 JVM垃圾收集(一)—分代收集理论

分代收集理论一、概述垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接 垃圾收集”。由于引用计数式垃圾收集算法在接下来讨论到的主流Java虚拟机中均未涉及,所以接下来介绍的所有算法均属于追踪式垃圾收集的范畴。二、名词部分收集(Partial GC):指目标不是完整收集整个Java堆的垃圾收集整堆收集(Full GC):收集整个Java堆和方法区的垃圾收集。部分收

2021-08-18 22:51:21 229

原创 final finally 和 finalize的区别

final finally 和 finalize的区别一、finalfinal为常量关键字,在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)修饰类:当用final修饰类时,表明该类不能被其他类所继承。需要注意的是final类中所有的成员方法都会隐式的定义为final方法final class A{}//表明A类是不可继承的修饰方法:当用final修饰方法时,表明该方法不能被重写,但可以被重载。注意:若父类中final方法的访问权限为private,将导致子类中不能直接继

2021-08-18 20:49:44 139

原创 JAVA四种引用

举例说明JAVA四种引用一、背景在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。二、强引用(StrongR

2021-08-16 23:38:42 239

原创 Java 代理

Java 代理一、静态代理接口public interface TargetInteface { void method1(); void method2(); int method3(Integer i);}接口实现类public class Target implements TargetInteface { @Override public void method1() { System.out.println("method1 r

2021-08-13 23:34:21 69

原创 Java 反射

Java 反射一、java反射概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。二、反射的作用在运行时分析类的能力在运行时查看对象实现通用数组操作代码利用Method对象三、Class类获取Class类信息的三种方法:类名.class对象.getClass()Class.forName(“类的全限定名”)动态的创建

2021-08-13 22:08:30 50

原创 Java代码执行顺序问题

Java代码执行顺序问题静态的东西优先加载,并且只加载一次,再类初始化的时候执行涉及到创建时,从上至下的执行一遍非静态的初始化语句和初始化块,最后执行对应的构造方法类加载的时候是从上至下执行一遍静态的初始化语句和初始化块类加载是优先于对象创建的...

2021-08-13 20:44:27 526

原创 根据字符串长度排序

根据字符串长度排序由短到长排序,若要由长到短,颠倒o1,o2的顺序即可public static void main(String[] args) { String[] strs={"fsfs","sfsrgv","shfiuhvkdvifvhvfdiu","shfisf","sf","ahiufehisufh"}; Arrays.sort(strs);//根据字母表顺序排序 System.out.println(Arrays.toString(strs)

2021-08-12 23:36:58 1135

原创 为什么重写equals方法要重写HashCode方法

为什么重写equals方法要重写HashCode方法一、为什么重写equals方法要重写HashCode方法在Object类中HashCode和equals是具有相同表现的① 如果两个对象equals为F,则表示两个对象的地址不同,则对应的HashCode不同。② 在所有的Hash*结构中,先判断HashCode。由于现有计算HashCode的算法的不完美性,两个完全不同的对象对应的HashCode是有可能相同的。因此,两个对象的HashCode相同,当使用equals进行比较时,结果可能是T,也可

2021-08-12 23:03:56 1668

原创 为什么Java中String是一个不可变类型

为什么Java中String是一个不可变类型我们都知道在Java中String是一个不可变类型,有常量池,共享字符串,字符串不可变在String的源码中可以看到① String类是被final修饰的,是不能被继承的;② char数组也是final修饰,不会指向新的数组;③ 没有提供任何一个方法用来修改char数组的内容;因此,String是一个不可变类型...

2021-08-12 22:30:30 107

原创 二维数组根据每个数组的元素排序(奥运奖牌排序)的几种方法

二维数组根据每个数组的元素排序(奥运奖牌排序)方法一public static void sort(int[][] a){ for(int i=0;i<a.length;i++){ int k=i; for(int j=i+1;j<a.length;j++){ if(a[k][0]<a[j][0]){ k=j; }els

2021-08-12 21:42:40 290

原创 快速找到数组中出现了一次的数

数组中有一个数出现了一次,其他的都出现了两次,快速找到这个出现一次的数采用异或的方法实现public static void main(String[] args) { int[] data={1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1}; int t=0; for(int i=0;i<data.length;i++){ t=t^data[i]; } System.out

2021-08-12 21:11:06 73

原创 说明Java是值传递的

Java是值传递的一、值传递值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。二、举例说明Java是值传递的代码如下public class Student { private String name; public String getName() { return name; } public void setName(String name) { this.name

2021-08-12 20:48:00 129

原创 自增i++与++i的一些小区别

关于自增i++与++i的一些小区别首先明确,“++”在前:先自增再赋值,“++”在后:先赋值再自增对于下面代码 int i=100; int a=i++; i=100; int b=++i; System.out.println(a); System.out.println(b); i=100; i=i++; System.out.println(i);输出结果为:前两行代码很好理解int i=100;int a=i++;//等价于int a=i;i=i+1;

2021-08-12 19:40:53 102

原创 128陷阱的产生原理

简述128陷阱一、什么是128陷阱有如下代码public static void main(String[] args) { Integer a=100; Integer b=200; Integer a1=100; Integer b1=200; int a2=100; int b2=200; System.out.println(a==a1); System.out

2021-08-12 00:22:21 101

原创 SpringBoot实现excel表格导出

SpringBoot实现excel表格导出一、引入依赖 <!--导出excel--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>1.1.2-beta5</version>

2021-08-11 10:49:16 2944 2

原创 Jquery实现倒计时

Jquery实现倒计时<script type="text/javascript"> //时间倒计时 var lastHour = 0; //小时 var lastMinute = 29; //分钟 var lastSecond = 59; //秒 var lastInterval = setInterval(function () { if (lastSecond > 0) { la

2021-08-11 10:10:48 2321

原创 关于openId与union_id

对于同一用户,在不同的APPID下对应的openID是不同的对于同一APPID,其用户对应的openID是唯一的openid同一个应用(App、公众号、小程序)的同一个用户有唯一的openidunionid借用微信官方文档中的话来说,如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不

2021-08-10 13:05:13 921

原创 微信支付二:微信公众号支付(jsapi支付)

SpringBoot 实现微信公众号支付(jsapi支付)一、背景在开发一个捐赠项目时须在pc端接入微信扫码支付(Native 扫码支付),在微信端接入微信公众号支付(Jsapi 支付)。后端使用的是Spring Boot框架,前台采用HTML+css+js 编写。二、微信公众号支付流程1、微信支付开发文档:微信支付开发文档2、Jsapi 支付业务流程三、...

2021-08-10 13:02:05 1687 2

原创 微信支付(一)SpringBoot 实现微信扫码支付/Native支付

SpringBoot 实现微信扫码支付/Native支付一、背景在开发一个捐赠项目时须在pc端接入微信扫码支付(Native 扫码支付),在微信端接入微信公众号支付(Jsapi 支付)。后端使用的是Spring Boot框架,前台采用HTML+css+js 编写。二、微信扫码支付流程1、微信支付开发文档:微信支付开发文档2、微信扫码支付业务流程3、个人理解的支付流程①用户在商户平台下单②商户生成商户订单,并调起微信统一下单接口③微信生成预支付订单,返回预支付的交易连接(code_url)

2021-08-10 12:30:55 1230

原创 form表单实现点击一个按钮根据不同条件跳转到不同的action

需求:点击确认支付按钮时,根据单选框,选择的支付方式的不同,跳转不同的action(对应不同的后台接口)单选框<div class="method"><span>支付方式</span></div><div id="payMethod"> <label for="weixin" ><div class="pay payOn"><input type="radio" name="payMethod" id="

2021-07-27 15:32:08 1870

原创 An error happened during template parsing (template: “class path resource [templates/index.html]“)

在开发springboot的时候,进行modelAndView 视图层映射的时候,一直出现An error happened during template parsing (template: “class path resource [templates/index.html]”)模板解析过程中发生错误(模板:“类路径资源[templates/index.html]”)在向index.html映射的时候出现错误,可能是以下错误1.配置文件问题.spring.thymeleaf.prefix=c

2021-07-20 13:55:31 727

原创 Navicat无法连接到服务器上的数据库

Navicat无法连接到服务器上的数据库错误:解决步骤:1、打开xshell 连接上自己的服务器,根目录下输入以下代码,查看各文件占用情况#du -sh * 2、发现dev/vda1 占了100%,已经满了3、进入到vda1中发现总共5G,日志文件占了4.2G4、删除日志文件5、退出后,再用Navicat连接远程数据库,发现连接正常了。...

2021-07-20 13:37:22 1312

原创 Spring boot 集成 PageHelper 时 page.gitTocal()一直为0的问题

Spring boot 集成 PageHelper 时 page.gitTocal()一直为0的问题ServiceImpl部分public ResultJson selectProject(PageWeb<Project> project) { Page<Object> page = PageHelper.startPage(project.getPageNum(), project.getPageSize());//必须紧跟查询语句 List&l

2021-07-20 13:24:29 469

DJNativeSwing-SWT.jar,DJNativeSwing.jar下载

使用swing展示网页内容时,需要用到一下三个jar包 DJNativeSwing-SWT.jar, DJNativeSwing.jar, swt-4.3.jar

2021-07-21

空空如也

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

TA关注的人

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