java
文章平均质量分 77
车晋强
车晋强的个人总结
展开
-
线程池-局部使用的风险
简介ExecutorService执行任务,使用一个或多个池中的线程(使用Executors的工厂方法正常配置)。线程池解决两个问题:1.为大量的异步任务执行提高性能,提供了管理资源的一种方式(线程、执行任务的集合)。每一个ThreadPoolExecutor仍然提供了一些基础统计(完成任务的数量)。编程人员通过Executors的newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor来获取最简单的线程池。当一个新task通过ex原创 2021-03-31 09:25:25 · 468 阅读 · 0 评论 -
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 · 341 阅读 · 2 评论 -
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 · 384 阅读 · 0 评论 -
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 · 2507 阅读 · 1 评论 -
CMS
CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是年老代的回收,目标...转载 2018-05-03 21:06:56 · 803 阅读 · 0 评论 -
java堆内存与栈内存
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产...转载 2018-05-03 21:06:11 · 168 阅读 · 0 评论 -
java虚拟机
JAVA的技术体系:支撑JAVA程序运行的虚拟机,提供各开发领域接口的JAVA API, JAVA编程语言及许多第三方框架(spring,struts) 对于JAVA程序员,在虚拟机自动内存管理机制帮助下,不再需要为每一个new操作去写配对的delete/free代码。不容易出现内存泄露与内存溢出的问题。一旦出现了,不了解虚拟机如何使用内存...转载 2018-05-03 21:05:31 · 230 阅读 · 0 评论 -
jmap命令使用
jmap用于查看堆内存使用情况,一般结合jhat使用。jmap -permstat pid 打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。使用jmap -histo[:live] pid查看堆...转载 2018-05-03 21:01:08 · 1735 阅读 · 0 评论 -
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 · 601 阅读 · 0 评论 -
jstack命令使用
jstack <pid> :导出该进程的堆栈信息,对于解决问题是非常有帮助的。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和...转载 2018-05-03 21:00:15 · 913 阅读 · 0 评论 -
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 · 474 阅读 · 0 评论 -
jvm调优
堆设置-Xmx3550m:设置JVM最大堆内存 为3550M。 -Xms3550m:设置JVM初始堆内存 为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xss128k: 设置每个线程的栈 大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能 生成更多的线程。但是操...转载 2018-05-02 12:03:38 · 254 阅读 · 0 评论 -
jvm性能监控和故障处理
给一个系统定位问题时,理论知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段所以在定位问题时,对于JVM相关的知识的理解非常关键,对这部分理论知识在这里就不详述了。概述工具分两大类,一类是命令行工具,一类是可视化工具命令行工具是运行期定位线上问题的首选工具。 常用用法用ps、jps找出线程号如果怀疑是死循环、线程类的问题,使用jstack -l来查看如果是jvm内存问题,使用jstat...转载 2018-05-02 12:03:10 · 215 阅读 · 0 评论 -
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 · 306 阅读 · 0 评论 -
git远程仓库版本回退方法
远程分支回滚的三种方法:自己的分支回滚直接用reset公共分支回滚用revert错的太远了直接将代码全部删掉,用正确代码替代3 本地分支版本回退的方法如果你在本地做了错误提交,那么回退版本的方法很简单 先用下面命令找到要回退的版本的commit id:git reflog接着回退版本:git reset --hard Obfafd0bfafd就是你要回退的版本的commit id的前面几位4 自己...转载 2018-05-02 11:57:47 · 1041 阅读 · 1 评论 -
阿里java规范
1.任何布尔类型的变量,都不要加is。否则部分框架解析会引起序列化错误。 反例:boolean isSuccess,它的方法是isSuccess()。RPC框架在反向解析的时候,以为对应的属性名称是success。导致属性获取不到,进而拋出异常。2.不要使用一个常量维护所有常量,应该按常量功能进行归类,分开维护。如:缓存相关的常量放在类CacheConsts下,系统配置相关的常量放在类:Co...转载 2018-05-02 11:52:28 · 281 阅读 · 0 评论 -
深入web请求过程
如何发起一个HTTP请求和如何建立一个socket连接区别不大,只不过outputstream.write写的二进制字节数据格式要符合HTTP,浏览器在建立socket连接之前,必须根据地址栏里输入的URL的域名DNS解析出IP地址,然后再根据ip地址和端口与对应的远程服务器建立socket连接。然后浏览器根据URL组装成一个get类型的http请求头,通过outputStream...转载 2018-05-02 11:51:24 · 141 阅读 · 0 评论 -
一次CMS排查过程
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下。这篇文章分三部分:1、问题的场景和处理过程;2、GC的一些理论东西;3、看懂GC的日志先说一下问题吧问题场景:线上机器在半夜会推送一个700M左右的数据,这个时候有个数据置换的过程,也就是说有700M*2的数据在heap区域中,线上系统超时比较多,导致了很严重(严重程度就不说了)的问题。问题原因:看日志,...转载 2018-05-03 21:07:56 · 869 阅读 · 0 评论 -
相对全面的gc总结
首先是大家都要提到的GC的基础算法:标记清除,标记整理,复制,分代。这些算法的第一步都是做的一件事: 标记(Mark)。JVM的标记算法采用了根搜索算法(Root Tracing)。根有几种:1. JVM栈的Frame里面的引用2. 静态类,常量的引用3. 本地栈中的引用4. 本地方法的引用5.分代式GC是一种部分收集的做法,在执行部分收集时,从GC堆的非收集部分指向收集部分的引用,也必须作为GC...转载 2018-05-03 21:10:26 · 360 阅读 · 0 评论 -
servlet2和servlet3
servlet是用java编写的服务端程序,主要功能在于交互式的浏览和修改程序,生成动态Web内容。狭义的servlet是指java语言实现的一个接口,广义的servlet是指任何实现了这个servlet接口的类。这个过程为: 1.客户端发送请求至服务器端 2.服务器将请求信息发送至servlet 3.servlet生成响应内容并将其传给服务器,响应内容动态生成,通常取决...原创 2018-04-30 20:59:29 · 4420 阅读 · 1 评论 -
并发线程指南之线程同步工具
在第二章基本的线程同步中,我们学习了同步和critical section的内容。基本上,当多个并发任务共享一个资源时就称为同步,例如:一个对象或者一个对象的属性。访问这个资源的代码块称为:临界区。 如果机制没有使用恰当,那么可能会导致错误的结果,或者数据不一致,又或者出现异常情况。所以必须采取java语言提供的某个恰当的同步机制来避免这些问题。 在第二章,基本的线程同步中,我们学会了以下2个同步...转载 2018-04-30 21:00:00 · 160 阅读 · 0 评论 -
并发编程之线程执行者
通常,当你在Java中开发一个简单的并发编程应用程序,你会创建一些Runnable对象并创建相应的Thread对象来运行它们。如果你开发一个运行多个并发任务的程序,这种途径的缺点如下:你必须要实现很多相关代码来管理Thread对象(创建,结束,获得的结果)。你必须给每个任务创建一个Thread对象。如果你执行一个大数据量的任务,那么这可能影响应用程序的吞吐量。你必须有效地控制和管理计算机资源。如果...转载 2018-04-29 11:31:16 · 136 阅读 · 0 评论 -
并发编程之Fork/Join框架
通常,当你实现一个简单的并发应用程序,你实现一些Runnable对象和相应的 Thread对象。在你的程序中,你控制这些线程的创建、执行和状态。Java 5引入了Executor和ExecutorService接口及其实现类进行了改进(比如:ThreadPoolExecutor类)。执行者框架将任务的创建与执行分离。有了它,你只要实现Runnable对象和使用Executor对象。你提交Runna...转载 2018-04-29 11:24:57 · 172 阅读 · 0 评论 -
再说NIO
1.通过NIO/AIO非阻塞编程2.Buffer池3.高并发编程技巧(Volatile,CAS,ThreadLocal的使用)----------------------------------------------------------------BIO/NIO/AIOBIO:标准IO就是阻塞版IO,当IO没准备好时线程被阻塞。很多时候这在主线程是不能容许的,一般会放在子线程去执行。即:一个...转载 2018-04-29 11:18:30 · 146 阅读 · 0 评论 -
浅谈IO
从字面的意思可以看出:同步IO即 如果一个线程请求进行IO操作,在IO操作完成之前,该线程会被阻塞; 而异步IO为 如果一个线程请求进行IO操作,IO操作不会导致请求线程被阻塞。 事实上,同步IO和异步IO模型是针对用户线程和内核的交互来说的: 对于同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到...转载 2018-04-29 11:14:53 · 143 阅读 · 0 评论 -
网站服务端技术
网站并发----提升网站并发能力以使有限的资源下,网站的并发数更大----------如何让单个请求处理效率更高。 如何提高单台服务器的并发能力:1.多线程技术, --如何让一个线程运行的更快同时还要让一个线程执行的时候消耗的系统资源更低。 --有个在linux上做过一个测试,即一个线程创建和消耗至少要消耗2M内存。如果要...转载 2018-04-29 11:13:37 · 351 阅读 · 0 评论 -
线程池的实现原理
线程池的实现原理,分为以下几个方面: 1.线程池状态 2.任务的执行 3.线程池中的线程初始化 4.任务缓存队列及排队策略 5.任务拒绝策略 6.线程池的关闭 7.线程池容量的动态调整具体的成员变量定义如下 :private final BlockingQueue<Runnable> workQueue; // 任务缓存队列,用来存放等待执行的...转载 2018-04-29 11:11:58 · 141 阅读 · 0 评论 -
callable和future
由于FutureTask实现了Runnable,因此它既可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行。并且还可以直接通过get()函数获取执行结果,该函数会阻塞,直到结果返回。因此FutureTask既是Future、Runnable,又是包装了Callable( 如果是Runnable最终也会被转换为Callable ), 它是这两者的合体。 在前面的文章中...转载 2018-04-29 11:10:21 · 93 阅读 · 0 评论 -
认识NIO
JAVA NIO概述: Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels anId Buffers(通道和缓冲区)标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总...原创 2018-04-29 11:02:46 · 83 阅读 · 0 评论 -
String的intern方法
string类型的常量池: 直接使用双引号声明出来的string对象会直接存储在常量池中 如果不是用双引号声明的string对象,可以使用string提供的intern方法。intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。 如果常量池中存在当前字符串,就会直接返回当前字符串,如果常量池中没有此字符串,会将此字符串放入常量池中...原创 2018-04-29 10:56:02 · 257 阅读 · 0 评论 -
浅析synchronized和volatile
并发理论: 1.数据共享性 数据共享是线程安全的主要原因之一 2.互斥性 同时只允许一个访问者访问,通常允许多个线程同时对数据进行读操作,但同时只允许一个线程进行写操作 3.原子性 对数据的操作是一个独立的、不可分割的过程,保证原子性可以采用CAS或加锁(synchronized,lock)...转载 2018-04-29 10:54:37 · 129 阅读 · 0 评论 -
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 · 692 阅读 · 0 评论 -
守护线程与非守护线程
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾...转载 2018-05-04 19:24:32 · 2286 阅读 · 1 评论 -
java正则表达式
正则表达式:JAVA复杂文本操作。工具软件:::RegexBuddy语法::::普通字符,字母,数字,汉字,下划线以及没有特殊定义的符号。转义字符:\n \t \\ \^ \$ \. \( \) \? \+ \* \| \[ \]标准字符集合:::::注意区分大小写,大写是相反的 \d 任意一个数字,0-9 ...转载 2018-05-02 11:50:20 · 110 阅读 · 0 评论 -
hashMap
hashMap,hashSet都是collection框架的一部分。 hashSet实现了Set接口,不允许集合中有重复的值,当提到hashSet时,第一件事情是将对象存储到HashSet之前,要先确保对象重写equals()方法和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。 hashSet底层通过hashMap来实现的,构...转载 2018-05-02 11:43:06 · 89 阅读 · 0 评论 -
java10
动态编译:通过API将一些动态生成的内容进行编译。动态编译的应用场景:----可以做一个浏览器端编写JAVA代码,上传服务器编译和运行的在线评测系统。----服务器动态加载某些类文件进行编译。动态编译的两种做法:通过Rnutime调用javac,启动新的进程去操作。--之前使用,不属于动态编译Runtime run=Runtime.getRuntime();Pr原创 2015-03-01 17:38:40 · 568 阅读 · 0 评论 -
三字棋游戏JAVA
//6.28import javax.swing.JOptionPane;public class game { public static void main(String[]args){ gamestart(); } public static void gamestart(){ String[][]youxi原创 2015-03-05 14:31:00 · 876 阅读 · 0 评论 -
和为15的棋盘游戏
public class grid15{int[][]board;grid15(){board=new int[3][3];} //构造方法结束public static void main(String[]args){grid15 a=new grid15();for(a.initdata();a.board[0][0]!=9;a.nextdata())if(原创 2015-03-05 14:31:50 · 705 阅读 · 0 评论 -
网站访问量统计之UV/PV/IP
雅虎统计基础数据定义 PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。 UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。 IP(独立IP):指独立IP数。00:00-24:00内相同IP地址之被计算一次。 现在大多数的统计工具只统计到IP和PV的转载 2015-03-02 12:26:15 · 2671 阅读 · 0 评论 -
java基础9
eeee原创 2015-02-20 10:19:00 · 450 阅读 · 0 评论