自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Kim_

code and life

  • 博客(104)
  • 资源 (2)
  • 收藏
  • 关注

原创 Redis之数据结构

Redis初识基于键值对的存储服务系统 支持多种数据结构:字符串、哈希、列表、集合、有序集合 高性能,功能丰富特性速度快(单线程,数据存储在内存,使用c语言编写,贴近操作系统) 持久化(断电不丢失数据,在内存中的数据异步更新到磁盘上) 支持多种数据结构 支持多种编程语言 功能丰富:Lua脚本,事务,发布订阅,pipeline 主从复制 高可用、分布式典型使用场景...

2019-11-17 19:30:06 381

原创 晚期(运行期)优化

目录1、概述2、HotSpot虚拟机内的即时编译器1、解释器与编译器2、编译对象和触发条件方法调用计数器回边计数器3、编译过程Client CompilerServer Complier3、编译优化技术公共表达式消除数组边界检查消除方法内联逃逸分析Java与C/C++编译器的对比1、概述在部分的商用虚拟机中,Java程序最初是通过...

2019-09-08 13:13:42 404

原创 早期(编译期)优化

1、概述JVM的编译器可以分为三个编译器:前端编译器:把*.java文件转变为*.class文件的过程。如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)。 JIT编译器:把字节码转变为机器码的过程,如HotSpot VM的C1、C2编译器。 AOT编译器:静态提前编译器,直接将*.java文件编译本地机器代码的过程。2、javac编译器编译的大致过程:...

2019-09-07 20:47:55 264

原创 虚拟机字节码执行引擎

1、概述执行引擎是Java虚拟机最核心的组成部分之一。虚拟机是一个相对于物理机的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。在Java虚拟机规范中指定了虚拟机字节码执行引擎的概念模型,这个概念模型成为...

2019-09-07 18:08:11 178

原创 虚拟机类加载机制

1、概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。与那些在编译器进行连接工作的语言不同,Java 中,类的加载一直到初始化过程都是在运行期间完成的,虽然会损失一点性能,但是却使Java 应用程序具有高度灵活的特性,Java 可以动态扩展的特性就是依赖于运行期动态加载和动态连接这个...

2019-09-06 18:07:21 176

原创 类文件结构

1、无关性的基石语言无关性 平台无关性各种不同的虚拟机与所有平台统一使用的程序存储格式----字节码(ByteCode),这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的一次编写,到处运行。实现语言无关性的基础是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,只与Class文件这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟...

2019-09-06 11:15:06 232

原创 并发编程艺术笔记:Fork/Join、线程池、Executor

目录Fork/Join框架运行流程工作窃取算法核心组件ThreadPoolExecutor处理过程线程池创建线程池状态工作线程线程工厂线程池调度过程核心方法execute方法工作线程的执行工作线程的清理任务的获取线程池拒绝策略线程池关闭合理配置线程池线程池监控Executor框架Excutors下的几种线程池...

2019-07-31 21:16:04 1438

原创 并发编程艺术笔记:并发队列、七大阻塞队列

目录ConcurrentLinkedQueue阻塞队列1、ArrayBlockingQueue2、LinkedBlockingQueue3、PriorityBlockingQueue4、DelayQueue5、SynchronousQueue6、LinkedTransferQueue7、LinkedBlockingDequeConcurrentLinkedQ...

2019-07-28 13:38:54 418

原创 并发编程艺术笔记:Java中的锁(重入锁、读写锁、LockSupport、Condition接口)

目录3、重入锁实现分析:构造函数实现重进入公平与非公平获取锁的区别非公平锁为什么造成线程“饥饿”为什么非公平锁性能好4、读写锁实现分析:1.读写状态的设计2.构造函数3.写锁的获取与释放4.读锁的获取与释放5.锁降级5、LockSupport6、Condition接口实现分析:1.等待队列2.等待3.通知3、重入锁...

2019-07-26 10:34:03 553

原创 并发编程艺术笔记:Java中的锁(Lock、AQS)

目录线程状态变化1、Lock接口2、队列同步器1.同步队列核心结构2.独占式同步状态获取与释放3.共享式同步状态获取与释放4.独占式获取响应中断5.独占式超时获取同步状态线程状态变化1、Lock接口Lock接口提供的synchronized关键字不具备的主要特性Lock接口的API2、队列同步器1.同步队列AQS提供几个可...

2019-07-24 22:43:32 224

原创 并发编程艺术笔记:Java并发机制、Java内存模型

目录Java并发机制上下文切换VolatileSynchronized原子操作的实现Java内存模型1、Java内存模型的基础2、重排序3、顺序一致性内存模型4、volatile的内存语义5、锁的内存语义6、final域的内存语义7、happens-before8、类的初始化过程Java并发机制上下文切换CPU通过时间片分配算法来...

2019-07-22 12:07:39 231

转载 总线锁定和缓存一致性的问题

转自https://blog.csdn.net/qq_21125183/article/details/80848941随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性。我们知道,CPU和物理内存之间的通信速度远慢于CP...

2019-07-17 16:09:34 765

原创 垃圾收集器与内存分配策略

GC要完成的事情哪些内存需要回收? 什么时候回收? 如何回收?对象存活/死去1、引用计数算法为每一个对象添加一个引用计数器,每当有一个地方持有对其的一个引用时,该计数器加1;当引用失效时,计数器值减1;任何时刻计数器为0的对象是不可能再被使用的。引用计数算法(Reference Counting)实现简单,判断效率高。但是主流的Java虚拟机实现中并没有使用这个算法,主要原因...

2019-07-16 19:36:14 183

原创 Java内存区域与内存溢出异常

JVM常量池、运行时常量池、字符串常量池 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代 在JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代 在JDK1.8 hotspot移除...

2019-07-15 11:10:04 210

原创 ThinkingInJava(五):泛型

文章目录第十五章:泛型1.泛型接口2.泛型类3.泛型方法3.1 类型参数推断3.2 显式的类型说明3.3 泛型方法可与可变参数列表共存3.4 匿名内部类4.擦除的神秘之处4.1 示例4.2 泛型边界4.3 迁移兼容性4.4 擦除的问题4.5 边界处的动作5.擦除的补偿6.边界7.通配符7.1协变与逆变7.2 无界通配符7.3 捕获转换8.泛型常见问题9.自限定10.动态类型安全第十五章:泛型泛...

2019-07-08 23:11:23 489

原创 ThinkingInJava(四):异常、字符串、RTTI

文章目录第十二章:通过异常处理错误1.概念2.基本异常3.捕获异常4.捕获所有异常5.Java标准异常6.异常的限制7.构造器第十三章:字符串1.不可变的String2.重载“+”与StringBuilder3. 无意识的递归4.String上的操作5.Formatter转换第十四章:类型信息(Run-Time Type Identification)1.为什么需要RTTI2.Class对象2.1...

2019-07-08 23:10:42 702

原创 ThinkingInJava(三):容器

文章目录第十一章:持有对象1.泛型和类型安全的容器2.基本概念3.添加一组元素4.迭代器5. Foreach与迭代器6.简单的容器分类第十六章:数组第十七章:容器深入研究1.Set和存储顺序2.队列3.Map3.1 性能4.散列与散列码4.1 散列概念4.2 理解散列4.3 HashMap查询过程(快速原因)4.4 覆盖hashCode()5.HashMap的性能因子6.快速报错(fail-fas...

2019-07-08 23:10:23 495

原创 ThinkingInJava(二):复用类、多态、接口、内部类

文章目录第七章:复用类1.复用代码的两种方法2.初始化基类3.结合使用组合和继承3.1 确保正确清理3.2 名称屏蔽4.组合和继承之间选择5.protected关键字6.向上转型7.final关键字7.1 final数据7.2 final方法7.3 final类8.继承中的初始化顺序第八章:多态1.转机1.1 方法调用绑定1.2 产生正确的行为1.3 缺陷:"覆盖"私有方法1.4 缺陷:域和静态方...

2019-07-08 23:06:55 482

原创 ThinkingInJava(一):对象导论、操作符、初始化与清理

文章目录第一章:对象导论1.替代原则2.伴随多态的可互换对象3.单根继承结构4.对象的创建和生命期5.容器6.异常机制第二章:一切都是对象1.用引用操纵对象2.数据存储方式3.特例:基本类型4.Java中的数组5.static关键字5.1 通过 static 关键字可以满足以下两方面情形的需要:5.2 static方法第三章:操作符1.赋值2.窄化转型3.移位4.Java没有`sizeof()`操...

2019-07-08 23:05:23 232

原创 MySQL学习笔记二:全局锁、表锁、MDL锁、行锁

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁。可以通过命令 Flush tables with read lock (FTWRL) 对全局进行加锁,让整个库处...

2019-06-01 15:35:58 1650 1

原创 MySQL学习笔记一:SQL执行过程、事务隔离、索引

1、一条SQL查询语句执行过程MySQL的逻辑架构图,可看到各个功能模块执行过程:MySQL 可以分为 Server 层和 存储引擎 层两部分。Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层...

2019-05-21 14:58:22 349

原创 Nginx学习笔记三:Nginx架构基础(二)

目录1、Nginx的请求切换2、Nginx的模块3、Nginx模块的分类4、Nginx通过连接池处理网络请求5、Nginx内存池6、worker进程的协同工作7、内存管理器Slab Openresty如何使用 ngx_slab_stat 模块8、哈希表的max_size与bucket_size如何配置9、添加动态模块1、Nginx的请求切换...

2019-05-19 20:11:35 396

转载 HTTPS原理

众所周知,WEB服务存在http和https两种通信方式,http默认采用80作为通讯端口,对于传输采用不加密的方式,https默认采用443,对于传输的数据进行加密传输目前主流的网站基本上开始默认采用HTTPS作为通信方式,一切的考虑都基于对安全的要求,那么如何对自己的网站配置HTTPS通信,是本文着重介绍的本文的主要内容包括:https加密传输的原理、如何申请https所用的CA证书,...

2019-05-19 19:52:44 211

转载 Apache、Tomcat和Nginx的简单介绍及比较

1、定义ApacheApache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机平台上。其属于web服务器。Apache支持支持模块多,性能稳定,Apache本身是静态解析,适合静态HTML、图片等,但可以通过扩展脚本、模块等支持动态页面等。(Apache可以支持PHPcgiperl,但是要使用Java的话,你需要Tomcat在Apache后台支撑,将Java请求由...

2019-05-17 22:51:07 1210

转载 安装好的nginx如何查看已经安装模块和添加一个未被编译安装的模块

以nginx-gridfs为例./configure --prefix=/apps/nginx/nginx-1.14.2 --add-module=/apps/src/nginx-gridfs1,查看当前nginx编译参数[root@nginx1 nginx-1.14.0]# /usr/local/nginx/sbin/nginx -Vnginx version: nginx/1.1...

2019-05-12 21:12:14 1669 2

原创 Nginx学习笔记二:Nginx架构基础(一)

目录1、Nginx的请求处理流程2、Nginx的进程结构3、信号管理4、reload重载配置文件的真相5、热升级流程6、优雅地关闭worker进程7、网络收发与Nginx事件间的对应关系8、Nginx事件驱动模型9、epoll的优劣及原理1、Nginx的请求处理流程大致有三种流量传输到Nginx中:web,email及TCP流量,进入Nginx以后,Ng...

2019-05-12 10:43:01 284

原创 Nginx学习笔记一:初识Nginx

1、Nginx的三个主要应用场景:静态资源服务:通过本地文件系统提供服务 反向代理服务:Nginx的强大性能、缓存、负载均衡 API服务:OpenResty2、Nginx出现的历史背景互联网的数据量快速增长:互联网的快速普及、全球化、物联网 摩尔定律:性能提升 低效的Apache:一个连接对应一个进程3、Nginx的主要优点高并发,高性能:往往高并发对每个连接所使...

2019-05-09 23:03:25 342

原创 Effective Java第三章:对于所有对象都通用的方法

1、覆盖equals时请遵守通用约定覆盖equals方法看似很简单,但是有许多覆盖方法会导致错误,避免这些错误最直接的方法就是不覆盖equals方法,这种情况下,类的每个实例都只与它自身相等。1、不需要覆盖equals方法的情况有哪些?类的每一个实体本质上都是唯一的。比如Thread类,每一个实体都是唯一的,所以不需要覆盖equals方法。 不关心类是否提供了“逻辑相等”的测试功能。...

2019-05-08 21:21:19 226

原创 Effective Java第二章:创建和销毁对象

1、考虑使用静态工厂方法代替构造器静态工厂方法与构造器不同的第一大优势在于,他们有名称。一个类只能有一个带有指定签名的构造器,避开这一限制的方法是通过提供多个构造器,参数列表在参数类型的顺序上有所不同,但这样很容易导致调用错误的构造器。由于静态工厂方法有名称,不受上述限制。因此当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并且慎重地选择名称以便突出它们之间的区别。 静态...

2019-05-07 22:43:50 201

转载 select、poll、epoll之间的区别总结[整理]

转载自: https://www.cnblogs.com/Anker/p/3265058.html select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就...

2019-04-25 23:13:56 333

转载 Linux下的I/O模型以及各自的优缺点

Linux下的I/O模型以及各自的优缺点https://www.cnblogs.com/pluviophile/p/7466240.html其实关于这方面的知识,我阅读的是《UNIX网络编程:卷一》,书里是以UNIX为中心展开描述的,根据这部分知识,在网上参考了部分资料。以Linux为中心整理了这篇博客。Linux的I/O模型和Unix的I/O模型基本一致,Linux下一共有5种I...

2019-04-25 17:38:00 422

原创 NIO原理及浅析

Linux环境Linux的内核将所有外部设备都看做一个文件来操作。我们对一个文件的读写,都通过调用内核提供的系统调用。内核返回给我们一个file descriptor(fd,文件描述符)。即所有执行I/O操作的系统调用都通过文件描述符。参考:Linux中的文件描述符与打开文件之间的关系一个基本的IO,它会涉及到两个系统对象,一个是调用这个IO的进程对象,另一个就是系统内核(kern...

2019-04-25 13:46:13 479

原创 Selector、SelectionKey

SelectorSelector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。这是在一个单线程中使用一个Selector处理3个Channel的图示:要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册...

2019-04-21 18:07:49 800

原创 NIO基础知识

典型回答Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。Java NIO: Channels and Buffers(通道和缓冲区)标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中...

2019-04-21 10:41:11 229

原创 Java核心技术19 | 并发库中的线程池

通常都是利用Executors提供的通用线程池创建方法,去创建不同配置的线程池,主要区别在于不同的ExecutorService类型或者不同的初始参数。Executors目前提供了5种不同的线程池创建配置:newCachedThreadPool(),它是用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置时间超...

2019-04-04 19:41:15 223

原创 Java核心技术18 | 并发包中的常用队列

有时候我们把并发包下面的所有容器都习惯叫作并发容器,但是严格来讲,只有以“Concurrent”为前缀的容器才是真正的并发容器。Concurrent类型基于lock-free,在常见的多线程访问场景,一般可以提供较高吞吐量。 而LinkedBlockingQueue内部则是基于锁,并提供了BlockingQueue的等待性方法。java.util.concurrent包提供的容器从命名上可...

2019-04-03 23:57:19 291

转载 并发核心技术总结(四)

start()和run()方法源码start()方法其实是通过start0()方法启动线程的public synchronized void start() { // 如果线程不是"就绪状态",则抛出异常! if (threadStatus != 0) throw new IllegalThreadStateException(); // 将线程...

2019-04-02 20:28:57 199

转载 并发核心技术总结(三)

(10)关于锁优化的几点建议 减少锁持有的时间 减小锁粒度 HashMap是线程不安全的 HashTable无论是进行读还是写操作都需要获取锁,因此有了ConcurrentHashMap的出现 如ConcurrentHashMap有16个Segment,也就是有16把锁,这样的话不同的线程获取不同锁锁住某一个Segment,就可以实现高并发的操作,这也是减小锁粒度的一个...

2019-04-02 20:24:08 190

转载 并发核心技术总结(二)

(7)ThreadLocal造成OOM内存溢出案例演示与原理分析下图中描述了:一个Thread中只有一个ThreadLocalMap,1个ThreadLocalMap中可以有多个ThreadLocal对象,其中一个ThreadLocal对象对应一个ThreadLocalMap中的一个Entry,也就是说一个Thread可以依附有多个ThreadLocal对象。下图中实线代表强引用,虚线...

2019-04-02 20:23:25 148

转载 并发核心技术总结(一)

(1)线程安全和锁Synchronized概念一、Java实现多线程方式(1)继承Thread并重写run()方法,用start()方法启动线程(2)实现Runnable接口二、synchronized(1)可以在任意对象及方法上加锁,加锁的代码成为“互斥区”或“临界区”(2)同步的目的是为了线程的安全,需要满足两个最基本的特性:原子性和可见性(2)可重入锁以及Sync...

2019-04-02 20:22:23 296

MYSQL实战45讲 极客时间

MYSQL实战45讲 极客时间

2019-04-30

平衡二叉课设+实验报告

C语言完成的平衡二叉树的一些基本操作。如调整、查找、插入、删除、合并、分裂、销毁等功能,并编写代码对所完成操作进行测试,同时包括实验报告。

2018-12-12

空空如也

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

TA关注的人

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