- 博客(156)
- 资源 (10)
- 收藏
- 关注
原创 Pepper Metrics - Spring/Spring Boot应用性能监控利器
关于项目Pepper Metrics是我与同事开发的一个开源工具(https://github.com/zrbcool/pepper-metrics),其通过收集jedis/mybatis/httpservlet/dubbo/motan的运行性能统计,并暴露成prometheus等主流时序数据库兼容数据,通过grafana展示趋势。其插件化的架构也非常方便使用者扩展并集成其他开源组件。请大家给...
2019-09-06 13:57:27
481
原创 深入分析Java类加载器原理
本文分析了双亲委派模型的实现原理,并通过代码示例说明了什么时候需要实现自己的类加载器以及如何实现自己的类加载器。本文基于JDK8。0 ClassLoader的作用ClassLoader用于将class文件加载到JVM中。另外一个作用是确认每个类应该由哪个类加载器加载。第二个作用也用于判断JVM运行时的两个类是否相等,影响的判断方法有equals()、isAssignableFrom()、i...
2019-04-06 20:55:14
1157
原创 JVM-GC垃圾回收算法-标记清除法、复制算法、标记压缩法、分代算法
目录1标记清除算法2复制算法3标记压缩算法4分代算法Minor GC存在的问题注释GC的出现解放了程序员需要手动回收内存的苦恼,但我们也是要了解GC的,知己知彼,百战不殆嘛。常见的GC回收算法主要包括引用计数算法、可达性分析法、标记清除算法、复制算法、标记压缩算法、分代算法以及分区算法。其中,引用计数法和可达性分析法用于判定一个对象是否可以回收,其他的算法为具体...
2018-12-14 08:52:41
3559
原创 JVM-GC垃圾回收算法-判定一个对象是否是可回收的对象
GC的出现解放了程序员需要手动回收内存的苦恼,但我们也是要了解GC的,知己知彼,百战不殆嘛。常见的GC回收算法主要包括引用计数算法、可达性分析法、标记清除算法、复制算法、标记压缩算法、分代算法以及分区算法。其中,引用计数法和可达性分析法用于判定一个对象是否可以回收,其他的算法为具体执行GC时的算法。今天来聊聊可达性分析法,并说明一下什么样的对象才是真正可以被回收的。 在介绍引用...
2018-12-14 08:46:17
703
3
原创 JVM-GC垃圾回收算法-引用计数法
GC的出现解放了程序员需要手动回收内存的苦恼,但我们也是要了解GC的,知己知彼,百战不殆嘛。常见的GC回收算法主要包括引用计数算法、标记清除算法、复制算法、标记压缩算法、分代算法以及分区算法。今天来聊聊引用计数算法。 1原理顾名思义,此种算法会在每一个对象上记录这个对象被引用的次数,只要有任何一个对象引用了次对象,这个对象的计数器就+1,取消对这个对象的引用时,计数器就-1。任...
2018-12-14 08:39:25
637
原创 HashMap原理及内部存储结构
本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程。public static void main(String[] args) { Map<String, String> map = new HashMap<>(); for (int i = 0; i < 50; i++) { map.put("key" + ...
2018-12-11 20:00:26
3366
原创 Jsoup获取网页全部原始内容
Jsoup可以对HTML页面进行分析和元素的提取,有点类似于DOM编程。对Jsoup常用的方式是将HTML解析成Document对象,再对之进行操作。Jsoup也可以提取给定URL的原始HTML文档,在发送请求时,同样可以设置Cookie、data、charset等条件,Demo如下:import org.jsoup.Connection;import org.jsoup.J
2017-08-16 00:28:43
4339
原创 解决Lucene的多线程并发问题
在Lucene程序中,成功以上面的方式创建IndexWriter对象以后,会在索引库中出现一个锁文件,这个锁文件是当前这个IndexWriter的锁,如果调用indexWriter.close()关闭了链接,则将会把这个锁文件删除,也就是说,它释放了锁。释放以后,第二个IndexWriter再开启是没有问题的。如果不关闭,同时开了两个或以上的IndexWriter,会抛出一个异常。导致程序终止。
2014-02-07 16:59:19
6893
原创 Lucene创建和查询索引库的HelloWorld(含详细注释)
本案例使用的是Lucene-3.6.2版本,Lucene官方网站:http://lucene.apache.org/。案例说明:本例模拟了贴吧中检索帖子的功能,通过创建Article类来模拟帖子对象。用户输入检索信息,Lucene就可以根据检索信息来获取与之相关的Article对象,并返回给用户。
2014-02-06 13:39:31
3559
1
原创 Java基础22--IO--文件过滤器
22-1,键盘录入键盘录入使用的是System.in,这个语句获取的是一个InputStream流对象,在通过这个对象的read()方法就可以获取键盘录入信息。这个read()方法是阻塞式方法,也就是说,当JVM读到这个语句的时候,就会开始等待用户输入,直到用户输入结束符,才继续执行剩下的程序。示例:需求:读取一个键盘录入的数据,并打印在控制台上。
2014-02-05 21:12:50
1635
原创 bug和debug的由来,挺有意思
美国的艾肯博士研制出了马克2号计算机,在研制过程中,诞生了一个新词“debug”来表示排除计算机故障,他的出现是这样的:
2014-01-26 01:10:01
4361
原创 小球下落
题目:有一颗二叉树,最大深度为d,且所有叶子的深度都相同。所有节点从上到下从左到右编号为1,2,3,...,2^d-1。在节点1处放置一个小球,它会往下落。每个内节点上都有一个开关,初始全都关闭,当每次有小球落到一个开关上时,他的状态都会改变。当小球到达一个内节点时,如果该节点上的开关关闭,则往左走,否则往右走,直到走到叶子节点。
2014-01-15 15:53:10
1165
原创 二叉树的层次遍历
题目:输入一颗二叉树,你的任务是按照从上到下、从左到右的顺序输出各个节点的值。每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开。每棵树的输入用一对空括号()结束,空括号不代表一个节点。如图:
2014-01-15 15:18:52
1161
原创 Java基础21--IO流--装饰设计模式--缓冲流
21-1,IO练习-将c盘的一个文本文件复制到d盘。将c盘的文件读取,再将读取到的文件写到d盘。思路:(1)需要读取源。(2)将读到的源数据写入到目的地。(3)既然是操作文本数据,就使用字符流。
2014-01-15 15:03:27
1186
原创 Java基础20--IO流
20-1,IO流-输入流-输出流1,IO,即Input和Output的简写,表示输入输出。IO流用于处理设备之间的设备传输,例如:内存,硬盘,优盘...2,Java对数据的操作时通过流的方式。数据从内存转移到硬盘称为输出,数据从硬盘转移到内存称为输入。
2014-01-15 12:20:28
1248
原创 Java基础19--System--Runtime--Math--Date--Calendar
19-1,API-System类1,因为System没有构造函数,所以不能被实例化,它里面的方法通常是静态的。2,System中的字段:(1)static PrintStream err:标准错误输出流(2)static InputStream in:标准输入流(3)static PrintStream out:标准输出流,System.out.println();3,主要方法:(1)public static longcurrentTimeMillis()返回以毫秒为单位的当前时间,其值取
2014-01-10 21:33:13
1190
原创 Java基础18--泛型--工具类--JDK1.5新特性
18-1,泛型-概述1,泛型是JDK1.5出现的新技术,新技术的出现是为了解决问题。2,泛型可以用于明确一个集合中存储什么类型的元素ArrayList<String> al = new ArrayList<String>();al.add("abc");//正确//al.add(3);//编译直接报错//在迭代器上加上泛型,下面取出来的时候就不用强转了Iterator<String> it = al.iterator();while(it.hasNext()) { //在这里不用强转了,因
2014-01-10 13:04:46
2199
原创 Java基础17--Map
17-1,Map集合特点&常用方法1,Map是一个接口,一次添加一对元素,Collection是一次添加一个元素。Map也成为双列集合,Collection集合称为单列集合。2,Map<K,V>,是将键映射到值得对象。K-->Key,V-->Value,<K,V>即为键值对。且一个映射当中不能包含重复的键,每个键最多只能映射到一个值上。也就是说,Map是一个键值对,Map集合中必须保证键的唯一性。3,Map常用方法。
2014-01-05 21:59:47
1394
翻译 译_jBPM4用户指南:第三章_图形化流程设计器(GPD)
本文为JBoss jBPM4官方用户指南译文,可以与原文对照看,水平有限,有不对的地方请不吝指出。原文地址:http://docs.jboss.com/jbpm/v4/userguide/html_single/#d0e14 第三章 图形化流程设计器 这一章将会阐述如何使用图形化流程设计器(GPD)。在安装完GPD并加载好示例后,你将会发现jPDL流程文件的图标会变成一个特殊的图标。在你的包视图中双击这个文件,将会使用GPD打开这个文件。
2013-12-30 11:02:48
1154
翻译 译_jBPM4用户指南:第二章_安装
本文为JBoss jBPM4官方用户指南译文,可以与原文对照看,水平有限,有不对的地方请不吝指出。原文地址:http://docs.jboss.com/jbpm/v4/userguide/html_single/#d0e14 第二章 安装 2.1 发布包解压下载后的jBPM压缩包(jbpm-4.x.zip)到你的本地硬盘驱动器,你将会看到下面的子目录:-doc:用户指南、Java文档、开发者指南;-examples:在用户指南里使用的流程示例;-install:专有环境的安装脚本;-li
2013-12-28 12:39:46
1482
翻译 译_jBPM4用户指南:第一章_介绍
本文为JBoss jBPM4官方用户指南译文,可以与原文对照看,水平有限,有不对的地方请不吝指出。原文地址:http://docs.jboss.com/jbpm/v4/userguide/html_single/#d0e14 第一章 介绍这篇文章最好在火狐浏览器中查看,IE浏览器存在一些已知的问题。 1.1 许可协议jBPM是在LGPL和EULA许可协议条件下发布的。 1.2 下载可以从sourceforge下载发布包:http://sourceforge.net/project
2013-12-27 21:07:04
861
原创 Java基础16--集合框架
16-1,集合框架Vector集合1,Vector是向量,底层为数组结构,可以通过其elements()方法获取一个Enumeration对象,这个对象的功能于Iterator的功能相同,Iterator比他多了移除的操作,所以现在一般不用Vector,都用Iterator。通过Enumeration迭代Vector集合的元素示例:public class VectorDemo { public static void main(String[] args) { Vector v = new V
2013-12-27 09:05:45
1254
原创 Java基础15--集合框架
15-1,集合框架-概述1,集合类的由来:对象是用于封装特有数据的,对象多了就需要存储起来,如果对象的个数不确定,就使用集合容器进行存储。2,集合特点:(1)用于存储对象的容器。(2)集合的长度是可变的。(3)集合中不可以存储基本数据类型值。 15-2,集合框架-体现&共性功能1,集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架。2,框架的顶层Collection接口:Collection的常见方法:
2013-12-26 17:01:23
1059
原创 Java基础14--多线程
14-1,多线程-线程间通信示例1,什么是多线程间通讯?多线程通讯:多个线程在处理同一个资源,但是任务不同。比如说:有一堆煤(资源),一辆卡车向里放煤(Input),一辆卡车向外取煤(output),放煤和取煤的任务不同,但操作的是同一个资源。由于有两个任务,所以要定义两个run方法。2,以下面代码说明。定义name和sex变量,实现交替输出不同信息的功能。定义两个run方法,一个输入名字,另一个打印名字,因为name和sex是资源,将之封装成一个类,两个run方法分别创建一个类,代码如下:
2013-12-23 20:13:06
945
原创 Java基础13--多线程
13-1,线程的状态1,Thread的stop()方法能强制结束线程。2,两个概念(非专业术语):CPU的执行资格:可以被CPU处理,在处理队列中排队;CPU的执行权:正在被CPU处理。线程的执行过程:线程先被创建,然后用start方法运行,此时具备执行资格和执行权,运行完成后消亡。在运行时线程可以临时冻结,此时释放执行资格和执行权,由于CPU在同一时间只能运行一个线程,所以除了正在执行的线程,其他线程都处于临时阻塞状态,此时具备执行资格但不具备执行权。3,线程状态图示:
2013-12-23 09:29:01
1066
原创 Java基础12--包--多线程
12-1,包-概述1,定义格式:package mypack;包名都是小写。2,包能对类文件进行分类管理,给类提供多层命名空间。多层命名空间指的是类的所属,比如一台电视,中国可以生产,美国也可以生产,这时就要说明这时中国生产的电视还是没过生产的电视,否则就会产生歧义。包应该定义在程序文件的第一行。类名的全称是:包名.类名包也是一种封装形式。3,package mypack;class PackageDemo { public static void main(String[] args)
2013-12-20 16:26:24
1269
原创 Java基础11--Object类--异常机制
11-1,Object类-equals方法1,Object是所有类的根类。Object是不断向上抽取而来的,具备着所有对象都具备的共性的内容。2,equals方法:指示其他某个对象是否与此对象相等。equals(Object obj)。equals方法比较的是两个对象的地址值。他在Java中的源代码为:public boolean equals(Object obj) { return this == obj;}调用格式为obj1.equals(obj2);如:
2013-12-19 22:17:02
1268
1
原创 Java基础10--多态--内部类
10-2,多态-概述1,对象的多态性(多种形态):class 动物{...}class 猫 extends 动物 {...}class 狗 extends 动物 {...}之前我们创建 猫 对象的时候,用的方法是:猫 mao = new 猫();有了多态之后,创建 猫 对象可以这么创建:动物 dw = new 猫();多态的创建方式,可以看出,一个对象有两种形态。即猫这个事物既具备着猫的形态,又具备着动物的形态,这就是对象的多态性。简单的说,就是一个对象对应着不同的类型。 多态在代码
2013-12-19 13:42:44
1151
原创 Java基础9--继承--抽象类--接口
9-1,子父类的构造函数-子类的实例化过程1,在子类构造对象的时候,发现访问子类构造函数时,父类的构造函数也运行了,这时为什么呢?原因是:在自类的构造函数中第一行有一个默认的隐式语句,就是super()。super()调用的就是父类中空参的构造函数。示例:
2013-12-17 13:42:17
1907
原创 Java线程-Timer定时器
主要涉及到两个类,一个是java.util.Timer,一个是java.util.TimerTask。Timer:是一种工具,用Timer操作线程,可以在后台执行线程中的任务,可以控制这个任务执行一次,或者定期重复执行。与每个Timer对象对应的是单个后台线程,用于顺序的执行所有计时器任务。如果以外终止了Timer正在执行的线程,例如调用了这个线程的stop方法,那么以后所有的该计时器的任务的尝试都将导致IllegalStateException,就好像计时器调用了cancel方法一样。Time
2013-12-09 11:19:37
9802
原创 Java基础8--单例设计模式--继承
8-1,文档注释文档注释其实就是将自己写的程序根据这些注释生成文档保存在硬盘上,与Java的API长的一样。1,格式:/** 注释内容...*/2,在命令行中通过javadoc命令生成文档注释,在工作开发中必须加文档注释。例如:
2013-12-09 10:07:06
1091
原创 Java基础7--构造函数--this--static内存详解
7-1,构造函数-概述1,特点:(1)函数名与类名相同。(2)不用定义返回值类型。(3)没有具体的返回值。2,构造函数构造函数就是构建创造对象是调用的函数。3,作用可以给对象进行初始化,即对象一创建里面就包含一些内容。
2013-12-07 21:38:02
2972
原创 Java基础6--面向对象--程序运行内存图解
1,定义:int[][] arr = new int[3][2];创建一个二维数组,这个其实是有三个一维数组,一维数组中的每个元素又引用了一个一维数组。2,打印而为数组:Sop(arr);直接打印二维数组。 打印[[I@C17164,[[是二维数组的意思,I是int的意思。Sop(arr[0]);直接打印二维数组中角标为0的一维数组。打印[I@b8e622,[是一维数组的意思。Sop(arr[0][0]);直接打印二维数组中脚标为0的一位数组的角标为0的元素。打印0。3,int[][] arr
2013-12-01 18:55:15
1739
原创 Spring与Hessian简单的整合
现在大部分的应用都使用到了Spring框架,我们一般使用Spring容器来管理对象的创建。我们同样可以将Hessian与Spring整合,方便管理,简化代码的开发。
2013-11-30 17:58:54
1586
原创 Hessian一个入门案例
Hessian与WebService一样,可以完成远程方法调用。 例如,某公司已经有了CRM系统,之后想开发一个物流系统,而物流系统的客户信息需要用到CRM系统中的客户信息,这就需要从新的物流系统去掉用CRM系统的方法获取客户数据。我们通常可以在一个系统内调用系统内的方法,但是一般不可以调用其他系统的方法,而且有的时候,我们需要的其他系统的方法并不一定与我们使用的是同一种程序设计语言,而且这两个系统一般不在同一台服务器上。想要完成这种远程方法调用,可以借助Hessian完成。
2013-11-30 15:36:38
3737
原创 Java基础5--数组--数组练习
5-1,数组的第二种格式1,元素类型[] 数组名 = new 元素类型[]{元素,元素,...}; 元素类型[] 数组名 = {元素,元素,...};这两种很多情况都是通用的,但下面的写法更简单,是常用的一种定义格式。第一种示例:(在Java基础4中提到) int[]arr = new int[3]; 第一种格式在需要一个容器,但是不明确容器的具体数据的时候用。第二种示例: int[]arr = {1,2,3,4,5}; int[]arr = new int[
2013-11-30 12:10:02
1438
原创 Java基础4--循环--函数--数组
4-1,for循环嵌套练习1,打印:********************外循环控制行,内循环控制列。
2013-11-29 17:29:54
1337
原创 Java基础3--运算符--判断--循环
3-1,比较运算符&逻辑运算符1,比较运算符:>,<,==,!=,>=,<=如果用==比较两个引用类型变量,比价的是内存地址。比较运算符运算完的结果必须是true或false。2,逻辑运算符&(AND与)、|(OR或)、^(XOR异或)、!(NOT非)、&&(AND短路与)、||(OR短路或)逻辑运算符用于连接两个boolean类型的表达式。例如:int x = 3;system.out.println(x>2 & x<5);打印结果时true,如果x=6,则结果时false。另外的比
2013-11-28 13:40:14
1743
原创 Java基础2--进制--变量--运算符
2-1,关键字1,Java语言基础组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组,这与其他的语言的基本组成差不多。只是表现形式不同。2,掌握两点:表现形式和什么时候使用。3,关键字:被赋予了特殊Java含义的单词。如class,public,static,void特点:关键字中所有的字母都是小写。 2-2,标识符1,用于标识一些东西
2013-11-21 22:18:49
1479
深入理解Java虚拟机:JVM高级特性与最佳实践
2014-03-01
Java加密与解密的艺术
2014-03-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人