自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

喜三仔的世界

吉祥如意,生意兴隆

  • 博客(123)
  • 收藏
  • 关注

原创 链表环入口-快慢指针方法理解的关键点

看到这个图一般就理解了,加油,共勉。

2020-09-07 14:35:45 184

原创 SpringBoot整合Mybatis(IDEA)

创建项目Finish目录结构设计表application.properties配置文件spring.datasource.username=rootspring.datasource.password=1234spring.datasource.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8spring.datasou

2020-07-07 18:16:52 304

原创 Eureka注册中心

 上一篇博文中我们搭建了一个简单的SpringCloud微服务工程,其中包含服务提供者和服务消费者。Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。...

2020-05-30 13:52:18 396

原创 SpringCloud微服务简单搭建(IDEA版本)

 SpringBoot是SpringCloud的基础,所以学习SpringCloud之前需要对SpringBoot有一定的了解。父工程(springcloud)打开IDEA,创建一个maven项目springcloud,这个是接下来所有子项目的父工程。pom.xml(springcloud)<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"

2020-05-28 21:56:52 630

原创 IDEA cannot download Sources

打开IDEA下方的Terminal输入下面这段代码:mvn dependency:resolve -Dclassifier=sources回车重新打开 sources

2020-05-11 09:33:33 162

原创 Redis数据持久化

RDB RDB方式的数据持久化,仅需在redis.conf文件中配置即可,默认配置是启用的。配置文件中有SNAPSHOTTING,这一部分就是关于RDB的配置说明。配置SNAPSHOTTING地方有三处:配置执行RDB生成快照文件的时间策略。对Redis进行设置,让它在“N秒内数据集至少有M个key改动”这一条件被满足时,自动保存一次数据集。配置格式:save <seconds&...

2020-04-25 15:48:49 117

原创 Redis发布订阅功能

 Redis提供了发布订阅的功能发布:PUBLISH订阅:SUBSCRIBE先订阅,再发布 示例代码:Pblisher 发布者public class Pblisher { public static void main(String[] args) { System.out.println("现在开始发布者---------------------...

2020-04-25 12:27:55 98

原创 Redis事务操作

事务事务有以下特性:⑴ 原子性(Atomicity)  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。⑵ 一致性(Consistency)  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必...

2020-04-25 11:31:05 139

原创 Jedis和SpringDataRedis

Redis官方推荐使用Jedis api,但它是不完善的。ps:由于我本人以前学习技术都是照着图片打代码,这样的学习效果不佳,所以在本文章中我会尽量使用文字阐述,但仍会尽量详尽,目的在于让各位看客多思考,遇到问题然后解决问题才有更好的学习效果。Jedis使用首先我们使用IDEA创建一个新的Maven project,在pom文件中添加下面的依赖:<dependencies> ...

2020-04-23 21:42:30 654

原创 启动多个redis进程

启动时指定端口启动时指定端口可在一台服务器启动多个redis进程cd /usr/local/redis/bin./redis-server ../conf/redis.conf --port 6380创建多个redis目录创建多个redis目录,建议以端口号命名将redis目录改名为redis-6379复制一个目录6380redis-6380的配置文件需要修改端口分别启动两...

2020-04-21 12:00:36 953

原创 Redis安装配置及后台启动和关闭(CentOS7)

安装配置首先我们需要有一个CentOS7的系统环境。推荐初学者使用虚拟机,方便管理容错率还高。然后我们需要让这个虚拟机可以联网 (侵删)使用免费的Xftp6将下载好的redis安装包传输到/usr/local目录下cd /usr/local/ 进入目录tar -zxvf redis-5.0.4.tar.gz 解压安装包cd /usr/local/redis-5.0.4 进入解压目录...

2020-04-21 10:34:20 645

原创 Java核心技术之程序编译与代码优化---Java与C/C++的编译器对比

 大多数程序员都认为C/C++会比Java语言快,甚至觉得从Java语言诞生以来“执行速度缓慢”的帽子就应当扣在它的头顶,这种观点的出现是由于Java刚出现的时候即时编译技术还不成熟,主要靠解释器执行的Java语言性能确实比较低下。 Java与C/C++的编译器对比实际上代表了最经典的即时编译器与静态编译器的对比,很大程度上也决定了Java与C/C++的性能对比的结果,因为无论是C/C++还是J...

2019-11-05 08:12:24 279

原创 Java核心技术之程序编译与代码优化---晚期(运行期)优化

 在部分的商用虚拟机(Sun HotSpot、IBM J9)中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为 “热点代码”(Hot Spot Code)。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Ju...

2019-11-04 21:05:44 1099 1

原创 Java核心技术之程序编译与代码优化---早期(编译期)优化

 Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把 .java文件转变成.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程;还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把.java文...

2019-11-03 16:14:35 434

原创 Java核心技术之类加载及执行子系统

 在Class文件格式与执行引擎这部分中,用户能通过程序进行操作的,主要是字节码生成与类加载器这两部分的功能。 Tomcat:正统的类加载器架构 主流的Java Web服务器,如Tomcat、Jetty、WebLogic、WebSphere或其他笔者没有列举的服务器,都实现了自己定义的类加载器(一般都不止一个)。因为一个功能健全的Web服务器,要解决如下几个问题:部署在同一个服务器上的...

2019-11-02 23:01:34 365

原创 Java核心技术之虚拟机字节码执行引擎---基于栈的字节码解释执行引擎

 Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行) 和编译执行(通过即时编译器产生本地代码执行) 两种选择。 解释执行 Java语言经常被人们定位为“解释执行”的语言,但主流的虚拟机中都包含了即时编译器后,Class文件中的代码到底会被解释执行还是编译执行,就成了只有虚拟机自己才能准确判断的事情。编译过程 Java语言中,Javac编译器完成了程序代码经过...

2019-11-01 15:00:57 154

原创 Java核心技术之虚拟机字节码执行引擎---方法调用

 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。 在程序运行时,进行方法调用是最普遍、最频繁的操作,但Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用)。解析 所有方法调用中的目标方...

2019-10-31 17:35:19 211 1

原创 Java核心技术之虚拟机字节码执行引擎---运行时栈帧结构

前言 执行引擎是Java虚拟机最核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是:物理机的执行引擎直接建立在处理器、硬件、指令集和操作系统层面上虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。 从外观上看起来,所有的Java虚拟机的执行引擎都是一致的:输入的是字节...

2019-10-30 18:40:10 159

原创 Java核心技术之类加载机制---类加载器

 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。 类与类加载器 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则...

2019-10-29 10:11:47 181

原创 Java核心技术之类加载机制---类加载的过程

加载 “加载”是“类加载”(Class Loading)过程的一个阶段。在加载阶段,虚拟机需要完成以下3件事情:通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。 虚拟机实现与具体应用的灵活度都是相当大的,例如“通过一个类...

2019-10-28 17:12:11 192

原创 Java核心技术之类加载机制---类加载的时机

 我们已经知道,在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。那么,虚拟机如何加载这些Class文件? 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增...

2019-10-27 22:27:58 291

原创 Java核心技术之字节码指令

 Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。 Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码。 字节码指令集是一种具有鲜明特点、优劣势都很突出的指令集架构,由于限制了Java虚拟机操作码的长度为一个字节(即0~25...

2019-10-25 14:26:54 250

原创 Java核心技术之类文件结构

代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。 今天的计算机仍然只能识别0和1,但由于最近10年内虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展,将我们编写的程序编译成二进制本地机器码(NativeCode)已不再是唯一的选择,越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。 无关性...

2019-10-24 18:27:30 275

原创 Java核心技术之虚拟机性能监控与故障处理---JDK的可视化工具

 JDK中有这么两个可视化工具:JConsole和VisualVM,它们是JDK的正式成员。 JConsole:Java监视与管理控制台 JConsole(Java Monitoring and Management Console)是一种基于JMX的可视化监视、管理工具。启动JConsole 进入到JDK/bin目录下,通过“jconsole.exe”启动JConsole。程序将自动搜...

2019-10-23 13:10:58 135

原创 Java核心技术之虚拟机性能监控与故障处理---JDK的命令行工具

 给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。  JDK的bin目录中有“java.exe”、“javac.exe”这...

2019-10-22 09:41:10 185

原创 Java核心技术之内存管理机制---内存分配与回收策略

内存管理其实就只是两个问题:给对象分配内存以及回收分配给对象的内存。 前面的几篇文章已经描述了各种内存回收的问题,所以这一篇着重在对象的内存分配。对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则并不是...

2019-10-21 09:45:53 176

原创 Java核心技术之内存管理机制---垃圾收集器

 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。HotSpot虚拟机的垃圾收集器 上面是7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。 Serial收集器 Serial收集器是最古老、最基本的收集器,在JDK 1.3.1之前它是唯一的新生代收集器。该收集器是单线程的...

2019-10-20 22:13:59 125

原创 Java核心技术之内存管理机制---HotSpot的算法实现

 前面的

2019-10-18 09:48:15 144

原创 Java核心技术之内存管理机制---垃圾收集算法

标记-清除算法 该算法分为“标记”和“清除”两个阶段:首先使用上一篇博文中的方法标记出所有需要回收的对象。在标记完成后统一回收所有被标记的对象。这个算法简单方便,但是它有两个比较重要的缺陷:一个是效率问题,标记和清除两个过程的效率都不高另一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而...

2019-10-17 07:12:23 127

原创 Java核心技术之内存管理机制---垃圾收集

 在Java程序运行的过程中,线程间不可见的内存区域:程序计数器、虚拟机栈和本地方法栈随着线程而诞生,当线程结束时,它们也一并被清空销毁。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此,这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。 但是Java堆和方法区不一样。只有当我们的Java程序运行...

2019-10-16 12:42:03 87

原创 Java核心技术之内存管理机制---溢出异常

 在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能。 Java堆溢出 Java堆是Java虚拟机运行时的最大块的内存,里面存储了大量对象实例。如果一直创建对象,同时保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么就会产生OutOfMemoryError内存溢出异常。示...

2019-10-15 10:04:45 147

原创 Java核心技术之内存管理机制---HotSpot虚拟机对象

 这篇文章用于探讨HotSpot虚拟机在Java堆中对象分配、布局和访问的全过程。 对象创建(一)检查类虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。(二)分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存,对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的...

2019-10-14 20:46:18 116

原创 Java核心技术之内存管理机制---运行时的数据区域

 对于一名Java程序开发的开发人员,了解Java的核心内存管理,可以令你的薪水有一个突破。Java程序运行时的数据区可以分为:方法区、堆、虚拟机栈、本地方法栈和程序计数器。其中方法区和堆是由所有线程共享的数据区,后面三个是线程隔离的数据区。Java虚拟机数据区域程序计数器 程序计数器是指示字节码执行的一块小空间,各个功能都需要依靠它,不然就无法实现分支、循环、跳转、异常处理和线程恢复等...

2019-10-12 20:25:03 113

原创 Java异步线程池

 Java中的线程池设计得非常巧妙,可以高效并发执行多个任务,但是在某些场景下需要对线程池进行扩展才能更好地服务于系统。例如,如果一个任务扔进线程池之后,运行线程池的程序重启了,那么线程池里的任务就会丢失。 另外,线程池只能处理本机的任务,在集群环境下不能有效地调度所有机器的任务。异步任务池设计图 任务池的主要处理流程是:每台机器会启动一个任务池,每个任务池里有多个线程池,某台机器将一个...

2019-10-11 13:55:08 503

原创 Java并发编程性能测试

登录到服务器里查看当前有多少台机器在压测服务器(端口:12200)注意不能压测线上机器,压测应该是用开发服务器!$ netstat -nat | grep 12200 –c10用netstat命令查看已经使用了多少个数据库连接(端口:3306)$ netstat -nat | grep 3306 –c12通过ps命令可以查看线程数$ ps -eLf | grep java -c...

2019-10-11 13:26:27 239

原创 Java并发编程线上问题定位

 有时候,有很多问题只有在线上或者预发环境才能发现,而线上又不能调试代码,所以线上问题定位就只能看日志、系统状态和dump线程。1)在Linux命令行下使用TOP命令查看每个进程的情况,显示如下。top - 22:27:25 up 463 days, 12:46, 1 user, load average: 11.80, 12.19, 11.79Tasks: 113 total, 5 run...

2019-10-11 10:01:16 234

原创 Executor框架---ThreadPoolExecutor详解

 Executor框架最核心的类是ThreadPoolExecutor,它是线程池的实现类,主要由下列4个组件构成。corePool:核心线程池的大小。maximumPool:最大线程池的大小。BlockingQueue:用来暂时保存任务的工作队列。RejectedExecutionHandler:当ThreadPoolExecutor已经关闭或ThreadPoolExecutor已经饱...

2019-10-10 13:10:07 290

原创 Executor框架---简介

 在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。 Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机...

2019-10-09 12:14:46 176

原创 Java中的线程池---线程池的使用

线程池的创建使用ThreadPoolExecutor创建new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,milliseconds,runnableTaskQueue, handler);输入的参数:1)corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创建一个线程来执行任...

2019-10-08 13:26:30 103

原创 Java中的线程池---实现原理

 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。线程池的好处降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。 当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。...

2019-10-08 09:12:03 113

空空如也

空空如也

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

TA关注的人

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