- 博客(106)
- 资源 (2)
- 收藏
- 关注
原创 关于JVM调优的工具及JVM 常见调优参数
六个命令行排查工具我们一般使用 JDK 自带的 6 个命令行工具来排查JVM。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使用命令行工具直接运行。jps(虚拟机进程状况工具)jps(JVM Process Status tool,虚拟机进程状况工具),用于列出正在运行的 JVM 的 LVMID(Local Virtual Machine IDentifier,本地虚拟机唯一 ID),以及 JVM 的执行主类、JVM 启动
2020-06-22 16:37:30
1070
原创 JAVA 四种引用类型和垃圾回收器
JAVA 四中引用类型强引用 在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一。软引用 软引用需要用 SoftReference类来实现,对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内存空间不足时它会被回收。软引用通常用在对内存敏感的程序中。弱引用 弱引用需要用
2020-06-19 18:23:21
372
原创 JVM之垃圾回收算法
在学JVM,我们经常听到GC,GC意思:“垃圾回收”(GC,Garbage Collection),垃圾回收影响着我们整个程序的执行效率,因此我们需要学垃圾回收算法。在垃圾回收过程中,我们需要先判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。判断一个对象“死亡的两种方法”引用计数算法(Reference Counting) 是指在创建对象时关联一个与之相对应的计数器,当此对象被使用时加 1,相反销毁时 -1。当此计数器为 0 时,则表示此对象未使用,可以被垃圾收集
2020-06-19 17:45:48
310
原创 彻底弄懂类加载和JVM的双亲委派机制
类加载类的生命周期会经历以下 7 个阶段:加载阶段(Loading)验证阶段(Verification)准备阶段(Preparation)解析阶段(Resolution)初始化阶段(Initialization)使用阶段(Using)卸载阶段(Unloading)其中验证、准备、解析 3 个阶段统称为连接(Linking),如下图所示JVM 类加载通常指的就是前五个阶段:加载、验证、准备、解析、初始化1.加载阶段此阶段用于查到相应的类(通过类名进行查找)并将此类的字节流转换为方
2020-05-30 17:38:35
366
原创 JVM快速入门
什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,我们都知道,运行一个Java的程序,必须安装JDK或者JRE包。因为Java应用在编译后会变成字节码,然后通过字节码运行在JVM中,JVM是JRE的核心组成部分。JVM内存模型在Java中,JVM内存模型主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈。1. 堆(Heap)堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又
2020-05-28 21:06:57
673
转载 公平锁、非公平锁、可重入锁、自旋锁,死锁及死锁排查
公平锁、非公平锁公平锁:非常公平,不能插队,必须先来后到!非公平锁:非常不公平,可以插队(默认都是非公平)//非公平锁public Reentrantlock(){ sync=new NonfairSync();}//公平锁public Reentrantlock(boolean fair){ sync=fair?new FairSync():new NonfairSync();}可重入锁Synchronized版public class Demo01 { p
2020-05-27 14:59:18
214
转载 深入理解CAS,解决ABA问题
CAS(campare and swap)public class CASDemo { // CAS compareAndSet : 比较并交换! public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger(2020); //期望、更新 //public final boolean compareAndSet(int expect,in
2020-05-27 14:55:38
215
转载 彻底玩转单例模式
饿汉式单例// 饿汉式单例public class Hungry { // 可能会浪费空间 private byte[] data1 = new byte[1024*1024]; private byte[] data2 = new byte[1024*1024]; private byte[] data3 = new byte[1024*1024]; private byte[] data4 = new byte[1024*1024]; privat
2020-05-27 11:25:16
144
转载 学习volatile:1. 保证可见性 2. 不保证原子性 3. 禁止指令重排
谈谈对volatile的理解volatile是Java虚拟机提供的轻量级同步机制保证可见性不保证原子性禁止指令重排保证可见性public class JMMDemo { // 不加 volatile 程序就会死循环! // 加 volatile 可以保证可见性 private volatile static int num = 0; public static void main(String[] args) { // main .
2020-05-27 09:33:47
147
原创 Java内存模型JMM
什么是JMMJMM即为JAVA 内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且线程安全,但是换了个系统就出现各种问题。Java内存模型,就是为了屏蔽系统和硬件的差异,让一套代码在不同平台下能到达相同的访问结果。JMM从java 5开始的JSR-133发布后,已经成熟和完善起来。关于JMM的一些同步约定:1.线程解锁前,必须把共享变量立刻刷回主存(举个例子,如下图,线程A要拿到主存的
2020-05-27 08:21:20
160
原创 解决IDEA项目运行Tomcat时报错Cannot build artifact
IDEA项目运行Tomcat时报错:Error:Cannot build artifact ‘项目名:war exploded’ because it is included into a circular dependency (artifact ‘项目名:war exploded’, artifact ‘项目名:war exploded’)今天拿原来的一个项目复用,也就是在原来配置上重新做另一个项目,在最后打war包运行Tomcat时就报了这么个错误。原因就是原本的项目也运行过Tomcat导致在ar
2020-05-26 12:39:55
9044
原创 解决springboot项目测试API报错This application has no explicit mapping for /error
问题描述这两天在测试自己写的API时,在测试其中一个API报错,也就是下面的错误,一开始自己根据错误信息排查,怀疑是Mapper类没写@Mapper注解导致,但是检查了之后发现有写,最后我对这个API从实体类,Mapper类,Mapper.xml,service类,serviceImpl类,Controller类排查,一个个排查下来,我还是找不到问题所在,因为访问这个API的所有方法时控制台都会报错该方法调用service方法的那一行代码,也就是说在controller层调用service层时出了问题,网
2020-05-21 17:29:10
1320
转载 ForkJoin详解
什么是ForkJoin?ForkJoin在jdk1.7,在并行执行任务!提高效率,在处理大数据量时运用到。大数据:Map Reduce(把大任务拆成小任务,如下图:)ForkJoin特点:工作窃取什么是工作窃取,我们通过一个例子讲解一下,如下图,A,B是两个不同的线程,分别维护着两个不同的双端队列,当A线程执行到一半时,B线程已经执行完了,这时,B线程会把A线程处理的队列中把最后一个拿过来帮忙处理,提高效率,这种就叫做工作窃取。package com.kuang.forkjoin;imp
2020-05-20 22:54:03
4449
1
转载 Stream流式计算
什么是Stream流式计算Stream流式计算就是把计算交给流来操作,而集合只做存储。这么说可能看不懂,我们通过下面例子来理解。题目要求:一分钟内完成此题,只能用一行代码实现!现在有5个用户!筛选:1、ID 必须是偶数2、年龄必须大于23岁3、用户名转为大写字母4、用户名字母倒着排序5、只输出一个用户!代码实现:package com.kuang.stream;import java.util.Arrays;import java.util.List;public cla
2020-05-20 22:35:00
447
转载 四大函数式接口
什么是函数式接口只有一个方法的接口称为函数式是接口@FunctionalInterfacepublic interface Runnable{ public abstract void run();}//简化编程模型,在新版本的框架底层大量使用//foreach(消费者类的函数式接口)** Function 函数型接口**/** * Function 函数型接口, 有一个输入参数,有一个输出 * 只要是 函数型接口 可以 用 lambda表达式简化 */public cl
2020-05-20 19:07:33
253
原创 线程池:Executors工具类的三大方法和ThreadPoolExecutor的七大参数及四种拒绝策略
线程池需要掌握的知识点:三大方法、七大参数、四种拒绝策略讲线程池前,我们得先了解一下池化技术池化技术通俗讲就是我事先准备好一些资源,有人需要用就可以来我这里借去使用,用完后再还回来就可以了,这样还回来的资源又可以让后面需要来借的人拿去使用。线程池就是利用的池化技术,把多个线程维护在一个池子里,池子里面的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。这样做的好处是:1.可以降低资源的消耗;2. 提高响应的速度;3.提高线程的可管理性。(总结成一句话:线程复用、可控
2020-05-20 16:17:14
556
原创 阻塞队列BlockingQueue(add,offer,put,remove,poll,take,element,peek介绍)和同步队列SynchronizeQueue
BlockingQueueAPI文档中的描述BlockingQueue与Collection的关系四组API方式抛出异常有返回值,不抛异常阻塞 等待超时等待添加add()offer()put()offer(,)移除remove()poll()take()poll(,)检测队首元素element()peek()添加:add()只能添加队列的容量大小的元素,如果添加元素数量超过队列容量大小,则会IllegalStateExcept
2020-05-19 17:32:57
2704
原创 一文学懂读写锁ReadWriteLock
ReadWriteLock我们先来查看jdk1.8API文档里对ReadWriteLock的描述所有已知实现类: ReentrantReadWriteLockA ReadWriteLock维护一对关联的locks ,一个用于只读操作,一个用于写入。 read lock可以由多个阅读器线程同时进行,只要没有作者。 write lock是独家的。 (也就是我们说的一写多读)所有ReadWriteLock实现必须保证的存储器同步效应writeLock操作(如在指定Lock接口)也保持相对于所述相关联
2020-05-14 17:15:57
291
原创 必须要会的常用辅助类CountDownLatch、CyclicBarrier、Semaphore
CountDownLatchjdk1.8文档是这么介绍CountDownLatch的允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。A CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的await 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 如果您需要重置计数的版本,请考虑使用CyclicBarrier 。A CountDownLatch
2020-05-14 09:32:29
217
原创 Android中的Toast和Log日志的优缺点
Toast概念:Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失。Toast的优点:占用屏幕空间小。不会打断用户操作。使用简单适用范围广。Toast的缺点:出现时间短,在碎片化时代注意力不集中容易错过Toast提示。会遮盖其他控件,但不能对Toast进行交互。系统自带Toast采用的是队列的方式, 等当前Toast消失后, 下一个Toast才能显示出来。最
2020-05-13 19:53:08
2181
原创 深扒HashMap和ConcurrentHashMap的源码
初识HashMapHashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的,多线程环境下用 ConcurrentHashMap 替代HashMap。它的key、value都可以为null。此外,HashMap中的映射不是有序的。HashMap在JDK1.7和JDK1.8中的区别在 JDK 1.7
2020-05-10 16:07:59
378
原创 【Java实现】复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行复制,并返回复制后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路用一个 hashmap保存新旧链表节点的对应的结点关系代码import java.util.HashMap;/*public class RandomListNode { int label; RandomListNode nex
2020-05-09 15:27:17
176
原创 如何使ArrayList和Set在多线程并发环境下线程安全
ArrayList是一个我们常见的集合类之一,我们平常使用的都是在单线程的情况下,那么,在多线程并发的情况下,ArrayList还能和单线程一样安全吗?我们可以试一下,代码走起。import java.util.ArrayList;import java.util.List;import java.util.UUID;public class ListTest { public static void main(String[] args) { List<Stri
2020-05-09 08:40:13
554
原创 八个例子彻底理解锁
例子一:一个对象,两个加锁方法下面代码运行结果是先输出打电话还是发短信public class Test1 { public static void main(String[] args) { Phone phone= new Phone(); //这里的->是lambda表达式的写法 new Thread(()-> { phone.sendMessage(); },"A").start().
2020-05-08 18:54:16
287
原创 那些必须掌握的数据库面试题
1.数据库的四大特性(ACID)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。一致性指事务前后数据的完整性必须保持一致。隔离性指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。持久性是指一个事务一旦提交,它对数据库中数据的改变就是永久性的,即便数据库发生故障也不应该对其有任何影响。2.数据库的三大范式...
2020-04-30 16:34:49
275
原创 巧用摩尔投票算法解数组中出现次数超过一半的数字
摩尔投票法介绍摩尔投票法(Boyer–Moore majority vote algorithm),也被称作「多数投票法」,算法解决的问题是:如何在任意多的候选人中(选票无序),选出获得票数最多的那个。算法可以分为两个阶段:对抗阶段:分属两个候选人的票数进行两两对抗抵消计数阶段:计算对抗结果中最后留下的候选人票数是否有效假设投票是这样的,[A, C, A, A, B],ABC是指三...
2020-04-29 18:42:44
375
2
原创 面试高频-----生产者与消费者经典问题
synchronized版本package cn.gb.demo08;/** * 线程之间的通信问题:生产者和消费者问题! 等待唤醒,通知唤醒 * 线程交替执行 A B 操作 */public class A { public static void main(String[] args) { Data data=new Data(); //这...
2020-04-29 10:41:17
479
原创 深扒synchronized锁和lock锁
synchronized锁synchronized是Java的关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized方法和synchronized块。用...
2020-04-29 10:39:14
292
原创 巧用双指针解和为S的两个数字、和为S的连续整数序列
1、和为S的两个数字1.1 题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。1.2 解题思路我们先审题,找出对我们有用的信息。“一个递增排序的数组”,“查找和为S的两个数”,“输出的两个数的乘积最小”如果你刷已经刷过一定的算法题了,那看到这道题基本就会想到用双指针解题如果你是一个小白,没做过...
2020-04-28 19:43:46
211
原创 Linux环境下安装fastdfs及整合Nginx及安装包下载
背景我用的是阿里云的ECS服务器Centos7安装的fastdfs及整合Nginx,Nginx用的1.13.9版,fastdfs用的6.06版本。安装包下载方式一:我把我用的四个安装包打包成一个传到了CSDN上,为了让大家可以白嫖,我设置了0积分下载,下载链接:https://download.csdn.net/download/weixin_42369886/12358577方法二...
2020-04-24 16:50:15
643
原创 Linux环境安装FastDFS及整合Nginx遇到的bug及解决方法
背景我的是阿里云ecs服务器,CentOS 7安装的,下面是我安装过程中遇到的问题问题&解决方法问题1: ERROR - file: storage_ip_changed_dealer.c, line: 163, connect to tracker server xx.xx.xx.xx:22122 fail, errno: 4, error info: Interrupted sy...
2020-04-24 15:39:42
1287
原创 解决宝塔面板打开不了登录界面问题或xshell界面显示的宝塔登录地址是空的的问题
问题描述某天重开电脑之后,在浏览器打开宝塔面板页面时,提示请使用正确的入口登录面版,如下图:解决方案:正常情况下把查看面板入口的命令给复制到xshell里面,他就会返回给你登录地址,用户名,密码,然后你复制地址重新登录就可以了。如果你在xshell输入查看面板入口的命令后,没有显示出登录地址和密码给你,如下图:导致这种情况的就只有两种可能,一是你的阿里云服务器没有给宝塔的端口...
2020-04-22 19:47:34
7095
转载 【收藏版】Linux常用命令大全
系统信息arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本dmidecode -q显示硬件系统部件 - (SMBIOS / DMI)hdparm -i /dev/hda 罗列一个磁盘的架构特性hdparm -tT /dev/sda 在磁盘上执行测试性读取操作cat /proc/cpuinfo 显示CPU info的信息ca...
2020-04-22 07:55:57
224
原创 完美解决xshell输入tree命令后显示找不到该命令-bash: tree: command not found
问题描述xshell输入tree命令后显示找不到该命令-bash: tree: command not found错误原因系统中没有安装tree这个东西,需要安装tree后才行解决办法如果你的Linux系统是Ubuntu版的,输入下面命令安装即可sudo apt-get install tree如果你的Linux系统是cent os 版的,输入下面命令安装即可yum -y...
2020-04-21 19:06:30
6491
2
原创 不一样的解决Non-static method 'xxx' cannot be referenced from a static context
背景:在做小组项目的时候出现的这个bug,小组项目是一个springboot项目,,我是在写某个模块的CreditServiceImpl时调用其他层方法时出的这个bug,我其他模块这么写是没问题的,在写这个模块就神奇出现这个bug了。这个错误意思是非静态方法"findCreditByUserId(int)"无法从静态上下文中引用,好的,既然是关于静态方法的,那我们先来看一下非静态方法的用法:...
2020-04-20 13:26:42
11107
12
原创 【Java实现】滑动窗口中的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5...
2020-04-19 17:02:36
425
原创 【Java实现】机器人运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8= 19。请问该机器人能够达到多少个格子。解题思路看到这种题目中出现左,右,上...
2020-04-17 16:09:59
243
原创 【Java实现】二叉搜索树的第K个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点为4。解题思路这道题是找数组的第K小结点的变形题,都是先把它转换成一个升序的数组然后寻找第K个元素,但是如何把二叉搜索树转换成一个升序数组呢?我们根据二叉搜索树的特点,知道二叉搜索树的中序遍历就是一个升序数组,所以我们可以对给的二叉搜索树进行中序遍历再找到第K个...
2020-04-15 13:43:53
221
原创 【Java实现】序列化二叉树和反序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到...
2020-04-14 15:24:20
213
原创 【Java实现】二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路这道题的解题思路就是对二叉树进行深度遍历,写一个递归方法返回当前路径下匹配目标值的路径,解题的关键是由题目中路径的定义我们可以知道走到最后的点必须是叶子节点,即最后加进ArrayList的节点为叶子节点,也就是该节点的左子节点和右...
2020-04-13 20:05:52
170
FastDFS大礼包.zip
2020-04-24
JDK_API中文版.zip
2020-02-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人