自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 删除表数据后,如何保证新增数据主键仍然从id=1开始自增

1、删了数据库某些列,现在希望新插入的值仍然从1开始,怎么办?(不能用drop,然后再create一张表这种愚蠢的办法)2、jvm中调整栈大小的参数:-Xss3、海量数据排序?4、Arrays.sort()默认实现是什么?问题1:mysql清空表可以用delete和truncate两个命令来完成:1. delete① 语法:delete from table_name;② 示例:DELETE FROM `order`;...

2020-08-16 20:05:09 2464

原创 MySQL - 慢查询日志 & SHOW PROFILES

慢查询日志记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询并可以在mysql控制台直接输命令,但是只针对当前数据库,且重启后失效。还可以在my.cnf里面直接配置。my.ini是MySQL数据库中使用的配置文件,修改这个文件可以达到更新配置的目的。show variables like '%slow_query_log%'; //查看慢日志文件功能是否开启及日志文件的位置(windows默认在C:\ProgramData\MySQL.

2020-07-02 12:50:05 291

原创 MySQL - order by排序优化

排序优化:order by(索引不再用于查询,而是用于排序了)(order by默认升序)一句话:索引建的好,对order by的语句也有影响,怎么看这个关于order by的语句建立的好不好:根据Explain中Extra列是否显示Using filesort(显示了就不好)Using index(扫描有序索引排序) 和 Using filesort(文件排序),前者好,后者意味着order by 的列名(个数、顺序、种类)有些问题。Using filesort时,就没有使用索引提供好的顺序,而

2020-07-02 00:24:15 542

原创 MySQL - where和having不得不谈的区别

2020-07-02 00:21:15 115

原创 MySQL - in与exists 小表驱动大表

小表驱动大表:写sql前确定几件事:以员工(emp)和部门(dept)为例1、谁在外(左),谁在里(右)(根据中文描述来判断)找出指定部门里的员工:员工在外(左),部门在里(右)找出有员工参加的部门:部门在外(左),员工在里(右)2、谁大谁小(根据数据量)当小表在里时,使用in当大表在里时,使用exists正解:select * from tb_emp A where A.deptno in (select B.deptno from tb_dept B)//select *

2020-06-29 21:12:37 970

原创 MySQL - 索引及优化分析EXPLAIN

首先抛出个问题,什么会引起sql慢、性能下降?答:执行时间长、等待时间长会导致sql慢,具体来说: 1.查询语句写的烂 2.索引失效,而索引又分为 *单值索引:给表只给一个字段建立的索引; create index idx_user_name on user(name); *复合索引:给表的多个字段联合在一起,建立的索引。 create index idx_user_nameEmail on user(name,email); 3.关联查...

2020-06-29 20:54:39 279

原创 MySQL - linux下jdk与mysql的安装(亲自验证通过)

因为现在想把项目部署在linux上测试,所以mysql也就需要安装在服务器上,而不能使用本地windows的mysql,所以linux要装jdk、mysql先一、linux安装jdk1.8:https://www.cnblogs.com/fswhq/p/10713429.html下载linux jdk1.8:链接:https://pan.baidu.com/s/1mZx5MFCKCShj47Xney224w提取码:fhim二、安装mysql:https://blog.csdn.net/w

2020-06-28 14:54:39 291

原创 MySQL - 入门(架构、存储引擎、文件)

MySQL架构了解四层1 连接器(连接层)2 业务逻辑层(服务层)3 存储引擎(引擎层)(服务端通过API与存储引擎进行通信)4 文件存储系统(存储层)Mysql存储引擎了解重点学习InnoDBMySQL配置文件了解一、配置文件Windows下最大的配置文件称为my.iniLinux下最大的配置文件称为/etc/my.cnf里面可以指定其他文件的位置以及一些参数二、日志文件1)二进制日志文件把主机上的变化记录下来,用于主从复制,默...

2020-06-28 14:43:23 97

原创 jvm - GC垃圾回收器(二) G1垃圾回收器

???G1垃圾回收器和CMS垃圾回收器有什么区别?G1横跨young old两区(证明:-XX:PrintGCDetails -XX:UseG1GC ,在输出中只能看到garbage first heap和Metaspace,看不到young、old),而CMS用于老年代;CMS采用老年代采用标记清除,而G1整体上采用标记整理,局部采用复制算法,不会产生内存碎片;在IDEA配置JVM参数:结果:只有两层,新生代+老年代被grabage-first heap一次性拿下(证明了: G.

2020-06-23 13:29:30 204

原创 jvm - GC垃圾回收器(一)年轻代+老年代

四种主要的垃圾回收器: *Serial(串行垃圾回收器):后台只有一个线程负责垃圾回收,当它回收时,会暂停所有用户线程,所以不适合服务器环境。(一个人打扫,其他客人都得等着) *Parallel(并行垃圾回收器):后台有多个线程负责垃圾回收,当它们回收时,同样暂停所有用户线程,适用于科学计算/大数据处理等若交互场景。(一堆人打扫,客人都得等着) *CMS(并发标记清除,简称 并发垃圾回收器):(它其实分4步,有两步其实还是会暂停一下,但效率已经高很多了)(边吃边打扫)...

2020-06-23 13:24:13 1529 1

原创 jvm - 强引用、软引用、弱引用(涉及WeakHashMap)、虚引用(涉及ReferenceQueue)垃圾回收时机

引用的架构图:Reference在java.lang.ref包下1、强引用(默认)将对象赋值给以引用变量,这个引用变量就是一个强引用,这个强引用指向的对象即使出现了OOM也不会被回收。代码举例:obj2也是强引用,所以即使obj不再指向new Object()对象了,但是该对象依旧不会被GC2、软引用SoftReference softReference = new SoftReference<>(new Object());适用于对内存敏感的..

2020-06-18 15:48:45 381

原创 jvm - GC roots & 参数调优与命令

什么是垃圾:内存中不再被使用到的空间。如何确定是不是垃圾:引用计数法、用枚举根节点做可达性分析。枚举根节点是一系列名为GC roots的对象集合(一组活跃的引用),作为起始点,它们下面连着的叫引用可达对象,没连着的叫引用不可达对象。哪些对象属于GC root Set?(???字符串常量池在方法区中吗)(jdk1.6的时候还在(此时为永久代))(jdk1.7,字符串常量池被移动到了堆中)代码举例:new GCRootDemo()就是虚拟机栈(栈中的本地变量表)中引用的对象;pr..

2020-06-18 12:47:33 285

原创 jvm - gc回收算法之 引用计数法、复制、标记清除、标记压缩 & Minor GC 和 Full GC的差别与调用时机

GC是什么(分代收集算法):1.在次数上,频繁地收集Young区:2.在次数上,较少地收集Old区:3.基本不动Perm区(元空间):GC4大回收算法:1、引用计数法(了解即可)(JVM的实现一般不采用这种方式。)给每个对象一个计数器,减到0的时候,回收。循环引用的举例:2、复制算法(Copying)(常见常用)(年轻代使用YGC或者说Minor GC进行垃圾回收,这种回收方式本质调用了复制算法)(即年轻代GC使用复制算法,复制算法不会产生内存碎片)把伊甸园.

2020-06-17 23:31:56 375

原创 jvm - jvm堆参数调优 & OutOfMemoryError的dmeo

堆参数的调优(我们说JVM调优,其本质就是对参数的调优)在jdk1.7下(已过时):其中:1)-Xms:start(默认为1/64,)2)-Xmx:max (默认为1/4,即默认堆的最大值是物理内存的1/4)堆的初始大小和最大值,两者最好一致,避免内存大小调整影响运行的性能3)-Xmn:new之前学过堆物理上,新生代和老年代的比例为1:2所以想要修改这个比例,就是调整 -Xmn 的大小,但是这个参数,一般不调。下面两个参数一辈子用不上,因为jdk1.8取消了永久

2020-06-17 23:27:06 178

原创 jvm - 堆的新生代和老年代 & 年轻代gc回收过程 & OutOfMemoryError & 永久代和元空间关系 & 字符串常量池在不同jdk版本的位置

堆(Heap)在jdk1.7以前:jdk1.8:永久区变成了元空间堆在物理上分为:新生+养老(真正干活的就这两个)讲一下堆中物理划分出两个:新生区+养老区:(真正干活的就这两个)新生区中伊甸区的GC称为Minor GC;养老区的GC称为Major GC(Full GC);堆从物理上分为新生区+养老区(真正干活的就这两个)伊甸区的GC又可以称为YGC;1.伊甸区满了(假设100个),需要GC,GC之后存活的对象,不会留在伊甸区,而是进入幸存者0区-S0-F..

2020-06-17 23:21:10 737

原创 jvm - 栈发生StackOverflowError的demo & HotSpot与jvm关系 & 句柄池原理

会导致栈溢出StackOverflowError它是一种错误,不是异常:(OutOfMemoryError也是错误)OutOfMemoryError和StackOverflowError都属于VirtualMachineError的一种下面讲一下方法区、栈、堆三者的关系:1.HotSpot是sun公司创建的JVM;(我们学习及使用的JVM,一般都是指sun公司创建的这个HotSpot)(所以引用通过指针,指向访问对象,没什么好解释的了)其它公司也可以自己创建一种jvm,取其...

2020-06-17 23:16:41 202

原创 jvm - 体系结构 & 本地方法接口 & pc寄存器 & 方法区 &栈

线程是操作系统级别的,不是语言级别的。因为Java语言中new Thread().start()中,其本质调用了一个native方法:start0();native方法:调用的是和Java无关的底层的操作系统库或者C语言函数库。本地方法接口(Native Interface)由于栈中存放方法,所以栈分了两类:Java栈(又叫虚拟机栈)、本地方法栈(Native Method Stack)(里面存放native方法)本地方法栈:本地方法接口在本地方法栈中登记标记为native...

2020-06-17 23:13:37 131

原创 jvm - 初步了解JVM体系结构 & 类装载器 & 双亲委派机制和沙箱安全

JVM的体系结构图:(橙色+灰色)灰色:线程私有(即每个线程对应一个)、内存占的特别少,几乎不存在垃圾回收Execution执行引擎:解释命令,交由操作系统执行本地方法接口:设计的目的就是融合不同的语言为Java所用。(本地方法接口在本地方法栈中登记标记为native的方法,当执行引擎执行时,本地方法接口调用native方法库)(即本地方法接口是本地方法栈、执行引擎、本地方法库的中心)方法区不是放方法的区,是放类的描述信息,即放模板的地方。类装载器不唯一,有几种,类不同,类装载.

2020-06-17 23:08:49 114

转载 Synchronized原理 & 锁升级

转载自tongdanping:Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级

2020-06-17 17:50:38 81

原创 再看一遍《并发编程》的收获

suspend() resume() stop()被弃用;前三者和interrupt()的使用方法一样,针对的是哪个线程,就由哪个线程调用这些方法;suspend() resume() stop() interrupt() isInterrupted()方法都是Thread类中的方法,且都是非静态的,interrupted()是静态方法,效果是返回当前线程(而非调用该方法的线程)的中断标志,并还原为默认false。(当然,需要在其他线程内写这行调用代码,如在main线程里让threadA暂停);可

2020-06-17 16:20:18 71

原创 CountDownLatch/CyclicBarrier/Semaphore/Exchanger使用过吗?

四者都是jdk1.5的新特性一、CountDownLatch举例:老师等学生到齐后上课1、涉及线程:1个老师线程,多个学生线程。2、多个学生线程共用一个new CountDownLatch()对象,当来了一个学生后,该学生(线程)就调用countDownLatch.countDown();所以需要给学生线程的构造方法指定要使用的countDownLatch(且必须是同一个);3、老师(主线程)调用countDownLatch.await()进行等待所有学生的到来(都到来后,才会继续执行.

2020-06-17 15:44:44 124

原创 Fork/Join框架 组成成分 与 代码示例

JDK1.7推出,用于并行执行任务:将一个大人物分割成若干小任务,最终汇总每个小任务的结果得到大任务的结果。主要分两步:任务分割;结果合并。API介绍: (1)ForkJoinPool:线程池 (2)ForkJoinTask:任务,即自定义一个任务类,继承RecursiveAction\RecursiveTask,重写compute()方法ForkJoinTask中的主要方法: * fork() 在当前线程运行的线程池中安排一个异步执行。简单的理解就是再创建一个子任...

2020-06-17 15:08:00 105

原创 Java中公平锁、非公平锁、可重入、递归锁、自旋锁的理解 & 手写实现一个自旋锁

手写实现一个自旋锁要根据AtomicReference的值(值为线程)判断被谁获取了来模拟锁对象的功能)(自旋这个东西在讲乐观锁策略CAS(CompareAndSwap)讲到过,通过do{}while()来反复检查并执行,仿佛在旋转)(CAS是Unsafe类(sun.mics)的核心,而Unsafe类是原子类操作的核心)一、公平锁/非公平锁公平:按申请锁的顺序进入等待(应该是同步队列)队列中排队,不可插队非公平:上来就直接占有,如果尝试失败,再采用类似公平锁的那种方式,因为上来先..

2020-06-15 14:41:22 253

原创 死锁demo & 检测死锁的产生

死锁定义、造成死锁的原因不多说了,操作系统里的那套理论知识罢了。写一个死锁的demo:public class HoldLockThread implements Runnable { private String lockA; private String lockB; public HoldLockThread(String lockA, String lockB) { this.lockA = lockA; this.lockB .

2020-06-14 16:17:09 121

原创 原子操作类——CAS原理详解(二)

CAS你知道吗?原子类的实现没有加锁,而是通过不停自旋进行CAS实现。(由unsafe类提供底层支持,unsafe类的方法大部分都是native方法)谈谈原子类AtomicInteger带来的ABA问题?原子引用更新知道吗?一、CAS涉及到笔记:并发编程中的——原子类操作什么是CAS:CAS:compareAndSwap(比较并交换,这里的比较是将自己的期望值(即期望主内存中是这个值)与主内存中的值比较)JUC.atomic包下有很多原子类,它们提供了一种用法简单、性能高效、线..

2020-06-14 15:52:23 233

原创 Runnable Callable接口总结

文末有“关于FutureTask、new Thread()、线程池、Future的总结”Runnable和Callable区别:1.返回值,前者不返回,后者返回(根据实现接口那里写好的泛型确定call方法的返回类型)2.抛异常,前者不抛,后者抛3.重写方法不同,前者重写run(),后者重写call()4.Thread t1 = new Thread(Runnable runnable);t1.start();这个构造方法中,没有可以传入callalble的线程构造方法解决办法.

2020-06-13 19:08:08 247

原创 Java原子操作类四大数据类型 & 原子操作类CAS原理详解 (一)

java.util.concurrent.atomic(在JUC下的atomic包中)(jdk1.5开始提供)这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。Atomic包下的这些类都是采用乐观锁策略CAS(又称为无锁操作)来更新数据的:假设所有线程访问共享资源的时候不会出现冲突,因此不会阻塞其他线程的操作。那么,如果出现冲突了怎么办:出现冲突就重试当前操作直到没有冲突为止。对CAS最直观的理解:线程安全地更新变量,一般用synchronized,但是太重型.

2020-06-12 15:56:58 468

原创 Executor框架详解,包含Executors工具类 Runnable Callable Future FutureTask,以及创建线程的四种方法

线程池通过new ThreadPoolExecutor(5个或7个参数)创建,而ThreadPoolExecutor本质是ExecutorService或者说Executor;通过Executor框架下的Executors工具类也可以创建几种线程池,当然其本质也是调用ThreadPoolExecutor构造函数下面内容总结自博客:https://blog.csdn.net/qq_16811963/article/details/52161713这个框架主要就由3部分组成:任务生产部分..

2020-06-11 21:25:52 666

原创 Java线程池(三)之阻塞队列BlockingQueue详解

阻塞队列BlockingQueue(又叫工作队列,又叫任务队列)(在线程池的构造函数中的第五个参数,用于存放待处理的任务,待分配给线程)里面装的不是线程哦,是元素,例如生产者-消费者中,阻塞队列装的是产品,这里的阻塞队列可以理解成仓库线程是阻塞队列的操纵者,从里面取或往里面放。当使用put(e)、take()时,线程才会被阻塞,但也不是放进BlockingQueue中。在线程池里面,工作队列(也即阻塞队列)里面装的是代办业务,而不是线程,ok?OK!队列的接口结构:Lis..

2020-06-11 17:59:03 1906

原创 Java线程池(二)

一、为什么使用线程池?线程池的优势?二、线程池的底层就是ThreadPoolExcutor类,父类可以说是ExecutorService,甚至说是Executor(看图说话)Executors是:一个工具类,学了Collections(在集合框架线程不安全里面学过)之后感觉更深通过Executors,可以创建出两大类线程池:ThreadPool(一般线程池)(fixed + single + cached)、ScheduledThreadPool(调度线程池)...

2020-06-10 22:54:58 134

原创 Java线程池(一)

Executor中讲过,可以通过Executors.newxxxx(参数)来创建线程池(阿里手册中并不推荐这种封装好的工厂模式,原因见下面),也可以使用构造函数 public ThreadPoolExecutor(很多参数){....}public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long kee

2020-06-10 18:07:17 75

原创 线程状态切换 详解等待队列和同步队列的关系

线程的主要状态及切换:1.初始-NEW(还未调用start())2.运行-RUNNABLE(就绪(READY):调用了start() , 运行中(RUNNING):获得了时间片 这两者统称为运行)3.阻塞-BLOCKED因为synchronized没获取到锁的线程就会阻塞在同步队列中(同步队列中放的是尝试获取锁但失败的线程)4.等待-WAITING(具体情况见下图,会进入等待队列,等待进入同步队列去竞争同步锁)(进入等待队列后,需要notify()唤醒...

2020-06-10 15:55:11 1616

原创 happens-before | as-if-serial | 重排序 (二)

指令在重排序时,考虑到指令之间数据的依赖性,会禁止一部分重排序,如:int a = 10; //语句1int r = 2; //语句2a = a + 3; //语句3r = a*a; //语句4语句3、语句4有数据依赖性,不会重排序。但这种“有用”的禁止仅仅在单线程内保证,即在单线程中,重排序(禁止部分重排序)不会影响程序执行结果;但在多线程中,仅仅看一个线程内部有无数据依赖性,并不能保证多个线程之间相互合作不会出问题,如:(单例模式中的DCL也有.

2020-06-08 16:30:40 78

原创 happens-before | as-if-serial | 重排序 (一)

happen-before不光指A发生在B之前,更重要的是要知道它是一个原则,它让A的结果在B之前出现,即B能够看到A对数据进行的操作(言下之意,时间先后顺序与先行发生原则之间基本没有太大的关系,所以我们衡量并发安全问题的时候不要受到时间顺序的干扰,一切以先行发生原则为准)从底层原理上理解上面括号里这句话:在程序运行过程中,所有的变更会先在寄存器或本地cache中完成,然后才会被拷贝到主存以跨越内存栅栏(或者叫内存屏障,即是从线程的工作内存到主内存的拷贝动作,在多线程并发过程中,仅当写操作.

2020-06-08 16:25:52 123

原创 lock与synchronized的关系详解 同步队列 等待队列(二)

1 synchronized和lock区别在笔记本:并发编程中讲过一次,现在再补充些新知识:1.1synchronized是Java关键字,属于JVM层面;Lock是api,属于java.util.concurrent.locks.lock1.2synchronized底层使用monitorenter、monitorexit,而wait()、notify()也是基于monitor的,所以wait()、notify()需要在synchronized的同步块中使用。所以为什么Object类的w

2020-06-05 15:42:47 442

原创 lock与synchronized的关系详解 同步队列 等待队列(一)

lock.lock()or lock.lockInterruptibly(),如果锁被占用,当前线程A都是进入同步队列,只不过调用后者方法,除了干等到其他线程B lock.unlock(),让自己在同步队列中继续去试着抢一次锁以外,还可以期待其他线程B调用 A.interrupt()来让自己误以为锁被释放了,提前去抢一下锁(这里与等待队列毫无关系)lock(ReentrantLock)在jdk1.5新增lock在java.util.concurrent(俗称juc).locks包下,sync..

2020-06-05 15:40:42 1554

原创 volatile原理 JMM内存模型 指令重排

一.volatile(它的应用涉及到单例模式(具体是指volatile禁止了指令重排,所以可以让双端检锁实现线程安全))先说原理:在生成汇编代码时,会在有volatile变量修饰的共享变量进行写操作的时候会多出Lock前缀的指令,通过查IA-32架构软件开发者手册可知,lock前缀的指令在多核处理器下会引发了两件事情。* 将当前处理器缓存行的数据写回到系统内存。* 这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效。处理器为了提高处理速度,不直接和内存进行通讯,而.

2020-06-02 20:52:10 171

原创 Java中equals()方法和==的区别

对于https://blog.csdn.net/u010921701/article/details/52821843做了个小总结一.对于基本数据类型==和equals()都只比较两者数值二.对于引用类型i==和equals()都只比较两者地址在栈内存中的地址三.而对于重写了equals()方法的String(本质上是第二种引用类型),则有少许不同:从上面看出,S...

2018-09-17 21:07:06 103

原创 解决ssm框架下maven风格使用com.mchange.v2.c3p0.ComboPooledDataSource,在初始化c3p0 pool时卡住不动

      编程遇到一个问题:ssm框架下maven风格使用com.mchange.v2.c3p0.ComboPooledDataSource,在初始化c3p0 pool时卡住不动,以下是个人在解决时自己使用的方法: 1.当在application.xml中使用com.mchange.v2.c3p0.ComboPooledDataSource作为数据源时,如下图: 2.在pom...

2018-07-18 13:46:25 3301

空空如也

空空如也

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

TA关注的人

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