- 博客(300)
- 资源 (15)
- 收藏
- 关注
原创 线程池-局部使用的风险
简介ExecutorService执行任务,使用一个或多个池中的线程(使用Executors的工厂方法正常配置)。线程池解决两个问题:1.为大量的异步任务执行提高性能,提供了管理资源的一种方式(线程、执行任务的集合)。每一个ThreadPoolExecutor仍然提供了一些基础统计(完成任务的数量)。编程人员通过Executors的newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor来获取最简单的线程池。当一个新task通过ex
2021-03-31 09:25:25
492
原创 springMVC拦截器详解
HandlerExecutionChain:由HandlerMethod和Interceptor集合组成的类,会被HandlerMapping接口的getHandler方法获取。HandlerInterceptor接口:Spring拦截器基础接口AbstractHandlerMapping:HandlerMapping的基础抽象类AsyncHandlerInterceptor:继承HandlerInterceptor接口,额外提供了afterConcurrentHandlingStarted方法
2021-03-04 18:25:58
302
3
原创 mybatis架构设计及实例分析
使用Mapper接口和数据库交互Mybatis将配置文件中的每一个<mapper>节点抽象为一个Mapper接口,而这个接口中声明的方法和mapper节点的<select|update|delete|insert>节点项对应。2.数据处理层数据处理层可以说是MyBatis 的核心,从大的方面上讲,它要完成三个功能:a. 通过传入参数构建动态SQL语句;b. SQL语句的执行以及封装查询结果集成List<E>2.1.参数映射和动态SQL语句生成动
2021-03-04 17:40:06
374
2
原创 reactiveWeb性能测试
使用Reactive编程的优点:更有效的使用机器资源,和阻塞式的springMVC应用程度不同,可以使用更少的线程处理更多的请求。启动delayService,报错如下:Caused by: java.lang.ClassNotFoundException: org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType经过查询,application.Java文件不能直接放在main/java文件夹下,必须要建一个包把.
2021-03-02 15:39:06
289
原创 slf4j+logback配置详解
1. <dependency>2. <groupId>org.slf4j</groupId>3. <artifactId>slf4j-api</artifactId>4. <version>1.7.10</version>5. </dependency>6.
2018-05-04 19:37:55
703
转载 守护线程与非守护线程
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾...
2018-05-04 19:24:32
2292
1
转载 GC的一些概念
1. 什么时候会触发Minor GC? Eden区域满了,或者新创建的对象大小 > Eden所剩空间 CMS设置了CMSScavengeBeforeRemark参数,这样在CMS的Remark之前会先做一次Minor GC来清理新生代,加速之后的Remark的速度。这样整体的stop-the world时间反而断 Full GC的时候会先触发Minor GC2. 什么时候会...
2018-05-04 19:17:10
394
转载 相对全面的gc总结
首先是大家都要提到的GC的基础算法:标记清除,标记整理,复制,分代。这些算法的第一步都是做的一件事: 标记(Mark)。JVM的标记算法采用了根搜索算法(Root Tracing)。根有几种:1. JVM栈的Frame里面的引用2. 静态类,常量的引用3. 本地栈中的引用4. 本地方法的引用5.分代式GC是一种部分收集的做法,在执行部分收集时,从GC堆的非收集部分指向收集部分的引用,也必须作为GC...
2018-05-03 21:10:26
372
转载 一次CMS排查过程
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下。这篇文章分三部分:1、问题的场景和处理过程;2、GC的一些理论东西;3、看懂GC的日志先说一下问题吧问题场景:线上机器在半夜会推送一个700M左右的数据,这个时候有个数据置换的过程,也就是说有700M*2的数据在heap区域中,线上系统超时比较多,导致了很严重(严重程度就不说了)的问题。问题原因:看日志,...
2018-05-03 21:07:56
883
转载 CMS垃圾收集器的几个过程
首先理解下Major GC,Full GC和CMS的区别:1. Full GC == Major GC指的是对老年代/永久代的stop the world的GC2. Full GC的次数 = 老年代GC时 stop the world的次数3. Full GC的时间 = 老年代GC时 stop the world的总时间4. CMS 不等于Full GC,我们可以看到CMS分为多个阶段,只有sto...
2018-05-03 21:07:28
2522
1
转载 CMS
CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是年老代的回收,目标...
2018-05-03 21:06:56
825
转载 java堆内存与栈内存
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产...
2018-05-03 21:06:11
177
转载 java虚拟机
JAVA的技术体系:支撑JAVA程序运行的虚拟机,提供各开发领域接口的JAVA API, JAVA编程语言及许多第三方框架(spring,struts) 对于JAVA程序员,在虚拟机自动内存管理机制帮助下,不再需要为每一个new操作去写配对的delete/free代码。不容易出现内存泄露与内存溢出的问题。一旦出现了,不了解虚拟机如何使用内存...
2018-05-03 21:05:31
247
转载 jmap命令使用
jmap用于查看堆内存使用情况,一般结合jhat使用。jmap -permstat pid 打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。使用jmap -histo[:live] pid查看堆...
2018-05-03 21:01:08
1807
转载 jps分析
jstack命令的语法为:jstack <pid>. 可以用jps查看java进程id。jps本身可以列出所有的java进程。如下:[www@idc02-test-pay-17 che]$ jps18992 Bootstrap19668 Bootstrap43764 Bootstrap8531 Bootstrap5498 Bootstrap41978 Bootstrap46242...
2018-05-03 21:00:44
616
转载 jstack命令使用
jstack <pid> :导出该进程的堆栈信息,对于解决问题是非常有帮助的。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和...
2018-05-03 21:00:15
934
转载 jstat命令使用
jstat(JVM统计监测工具) 语法格式如下:jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] vmid是虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:root@ub...
2018-05-03 20:59:40
483
转载 jvm调优
堆设置-Xmx3550m:设置JVM最大堆内存 为3550M。 -Xms3550m:设置JVM初始堆内存 为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xss128k: 设置每个线程的栈 大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能 生成更多的线程。但是操...
2018-05-02 12:03:38
268
转载 jvm性能监控和故障处理
给一个系统定位问题时,理论知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段所以在定位问题时,对于JVM相关的知识的理解非常关键,对这部分理论知识在这里就不详述了。概述工具分两大类,一类是命令行工具,一类是可视化工具命令行工具是运行期定位线上问题的首选工具。 常用用法用ps、jps找出线程号如果怀疑是死循环、线程类的问题,使用jstack -l来查看如果是jvm内存问题,使用jstat...
2018-05-02 12:03:10
231
转载 关于GC
Minor GC从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。这一定义既清晰又易于理解。但是,当发生Minor GC事件的时候,有一些有趣的地方需要注意到:当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如当 Eden 区满了。所以分配率越高,越频繁执行 Minor GC。内存池被填满的时候,其中的内容全部会被复制,指针会从0开始跟...
2018-05-02 12:02:33
151
转载 tomcat的jvm内存溢出问题的解决
java_opts参数:-server:作为第一个参数,在多个cpu时性能佳。-Xms:初始Heap(堆)大小,使用的最小内存,cpu性能高时此值应设的大一些。-Xmx:java heap最大值,使用的最大内存。-XX:PermSize:设定内存的永久保存区域-XX:MaxPermSize:设定最大内存的永久保存区域-Xmn:young generation的heap大小,一般设置为Xmx的3、4...
2018-05-02 12:01:40
359
转载 git远程仓库版本回退方法
远程分支回滚的三种方法:自己的分支回滚直接用reset公共分支回滚用revert错的太远了直接将代码全部删掉,用正确代码替代3 本地分支版本回退的方法如果你在本地做了错误提交,那么回退版本的方法很简单 先用下面命令找到要回退的版本的commit id:git reflog接着回退版本:git reset --hard Obfafd0bfafd就是你要回退的版本的commit id的前面几位4 自己...
2018-05-02 11:57:47
1087
1
转载 阿里java规范
1.任何布尔类型的变量,都不要加is。否则部分框架解析会引起序列化错误。 反例:boolean isSuccess,它的方法是isSuccess()。RPC框架在反向解析的时候,以为对应的属性名称是success。导致属性获取不到,进而拋出异常。2.不要使用一个常量维护所有常量,应该按常量功能进行归类,分开维护。如:缓存相关的常量放在类CacheConsts下,系统配置相关的常量放在类:Co...
2018-05-02 11:52:28
301
转载 深入web请求过程
如何发起一个HTTP请求和如何建立一个socket连接区别不大,只不过outputstream.write写的二进制字节数据格式要符合HTTP,浏览器在建立socket连接之前,必须根据地址栏里输入的URL的域名DNS解析出IP地址,然后再根据ip地址和端口与对应的远程服务器建立socket连接。然后浏览器根据URL组装成一个get类型的http请求头,通过outputStream...
2018-05-02 11:51:24
156
转载 java正则表达式
正则表达式:JAVA复杂文本操作。工具软件:::RegexBuddy语法::::普通字符,字母,数字,汉字,下划线以及没有特殊定义的符号。转义字符:\n \t \\ \^ \$ \. \( \) \? \+ \* \| \[ \]标准字符集合:::::注意区分大小写,大写是相反的 \d 任意一个数字,0-9 ...
2018-05-02 11:50:20
128
转载 hashMap
hashMap,hashSet都是collection框架的一部分。 hashSet实现了Set接口,不允许集合中有重复的值,当提到hashSet时,第一件事情是将对象存储到HashSet之前,要先确保对象重写equals()方法和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。 hashSet底层通过hashMap来实现的,构...
2018-05-02 11:43:06
104
转载 JDBC
JDBC数据库操作MYSQL数据库特点:开放源代码的关系型数据库系统,目前很多大公司都在使用。适用于所有平台,支持多线程,充分利用CPU资源,性能不错。价格便宜,对于大数据,包含5千万个记录的数据库使用mysql完全没有问题。mysql命令行连接: mysql -hlocalhost -uroot -p123456JDBC:为java开发者使用数据库提供了统一的编程接口,它由一组JAVA类和接口组...
2018-05-02 11:39:43
151
转载 类加载器
自定义类加载器的流程: 0:继承:java.lang.ClassLoader 1.检查请求的类型是否已经被这个类装载器装载到命名空间中了,如果已经装载,直接返回。 2.委派类加载请求给父类加载器,如果父类加载器能够...
2018-05-01 16:44:46
98
转载 ToStringBuilder
1、ToStringBuilder、HashCodeBuilder、EqualsBuilder、ToStringStyle、ReflectionToStringBuilder、CompareToBuilder等这些类都是位于commons-lang.jar下面的,所以要使用这些类一定要导入commons-lang.jar。 2、为什么要使用ToStringBuilder? 系统中一般...
2018-05-01 16:43:24
8351
1
转载 微信高并发资金交易系统设计方案——百亿红包背后的技术支撑
微信高并发资金交易系统设计方案——百亿红包背后的技术支撑每年节假日,微信红包的收发数量都会暴涨,尤以除夕为最。如此大规模、高峰值的业务需要,背后需要怎样的技术支撑?百亿级别的红包规模,如何保证并发性能与资金安全?背景介绍2017年1月28日,正月初一,微信公布了用户在除夕当天收发微信红包的数量——142亿个,而其收发峰值也已达到76万每秒。百亿级别的红包,如何保障并发性能与资金安全?这给微信带来了...
2018-05-01 16:32:22
213
转载 性能调优
关于性能优化这是一个比较大的话题,在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法。本文的东西是我的一些经验和知识,并不一定全对,希望大家指正和补充。在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的《代码优化概要》,这篇文章基本上告诉你——要进行优化,先得找到性能瓶颈! 但是...
2018-05-01 16:31:28
177
转载 java里的协程
这东西其实有很多名词,比如有的人喜欢称为纤程(Fiber),或者绿色线程(GreenThread)。其实最直观的解释可以定义为线程的线程。有点拗口,但本质上就是这样。线程的定义 操作系统产生一个进程,进程再产生若干个线程并行的处理逻辑,线程的切换由操作系统负责调度。传统语言C++ Java等线程其实与操作系统线程是1:1的关系,每个线程都有自己的Stack,Java在64位系统默认S...
2018-05-01 16:30:23
2508
原创 红黑树
TreeMap底层通过红黑树实现。二叉查找树由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:若任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若任意...
2018-05-01 16:24:43
125
转载 LRuCache
LruCache底层使用LinkedHashMap,因为LruCache中Lru算法的实现就是通过LinkedHashMap来实现的。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序,这可以由其构造函数public LinkedHashMap(int initialCapacity,float ...
2018-05-01 16:23:52
144
转载 跳表
跳表是一种随机化的数据结构,目前Redis和LevelDB都用到它。它的效率和红黑树以及AVL树不相上下。但其原理相对简单。skip list可以很好解决有序列表查找特定值困难的场景。Skip List定义像下面这样(初中物理经常这样用,这里我也盗用下):一个跳表,应该具有以下特征:一个跳表应该有几个层(level)组成;跳表的第一层包含所有的元素;每一层都是一个有序的链表;如果元素x出现在第i层...
2018-05-01 16:22:44
238
转载 并发编程指南之并发集合
在编程中,数据结构是一种基本的元素。几乎每个程序都使用一个或多个数据结构类型来存储和管理它们的数据。Java API提供了Java集合框架(Java Collections framework),它包括可以用来实现许多不同的数据结构的接口、类和算法,你可以在程序中使用它们。当你需要在并发程序中使用数据集合时,你必须十分小心的选择实现。大多数集合数并不适合用在并发应用程序中,因为它们没有控制并发访问...
2018-05-01 15:41:47
165
转载 并发编程指南之定制并发类
Java 并发API提供许多接口和类来实现并发应用程序。它们提供底层(low-level)机制,如Thread类、Runnable或Callable接口、或synchronized关键字。同样也提供高级(high-level)机制,如Executor框架和Java 7 发布的Fork/Join框架。尽管这样,你可能发现你自己开发一个程序时,没有一个java类能满足你的需求。在这种情况下,你也许需要...
2018-05-01 15:25:48
123
转载 并发编程之基本线程同步
在并发编程中发生的最常见的一种情况是超过一个执行线程使用共享资源。在并发应用程序中,多个线程读或写相同的数据或访问同一文件或数据库连接这是正常的。这些共享资源会引发错误或数据不一致的情况,我们必须通过一些机制来避免这些错误。解决这些问题从临界区的概念开始。临界区是访问一个共享资源在同一时间不能被超过一个线程执行的代码块。Java(和 几乎所有的编程语言)提供同步机制,帮助程序员实现临界区。当一个线...
2018-04-30 21:31:19
175
转载 并发编程指南之线程管理
与每个Java语言中的元素一样,线程是对象。在Java中,我们有2个方式创建线程: 通过直接继承thread类,然后覆盖run()方法。 构建一个实现Runnable接口的类, 然后创建一个thread类对象并传递Runnable对象作为构造参数1. package test;2. public class Calculator implements Runnable {3. pr...
2018-04-30 21:26:44
135
转载 并发线程指南之线程同步工具
在第二章基本的线程同步中,我们学习了同步和critical section的内容。基本上,当多个并发任务共享一个资源时就称为同步,例如:一个对象或者一个对象的属性。访问这个资源的代码块称为:临界区。 如果机制没有使用恰当,那么可能会导致错误的结果,或者数据不一致,又或者出现异常情况。所以必须采取java语言提供的某个恰当的同步机制来避免这些问题。 在第二章,基本的线程同步中,我们学会了以下2个同步...
2018-04-30 21:00:00
167
java实现uv,pv,ip统计
2015-03-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人