- 博客(49)
- 资源 (2)
- 收藏
- 关注
原创 JUnit5的启动 - Launcher
Launcher概述Launcher是JUnit5的启动类,也是对启动进行扩展的主要入口,扩展通过实现自定义的TestEngine来自定义测试类的发现和执行逻辑以达到定制化测试的目的Launcher启动示例代码public static void main(String[] args) { //设置搜索和过滤规则 LauncherDiscoveryReq
2017-11-07 10:11:44
4181
1
原创 JUnit5总体介绍
JUnit5是什么官网介绍如下 :JUnit 5 is the next generation of JUnit. The goal is to create an up-to-date foundation for developer-side testing on the JVM. This includes focusing on Java 8 and above, as w
2017-11-07 09:56:55
1514
原创 JUnit4之BlockJUnit4ClassRunner
Runner概述JUnit对Runner的定位为负责执行测试方法和通知测试的Listener可以通过@Runwith来执行自定义Runner在每次执行测试方法之前都会通过反射创建一个新的测试类对象,这回导致测试类中的成员变量无法在每个测试方法调用中保持相同的值(需要在@Before和@After中进行重置) , 在JUnit5中可以通过@TestInstance(L
2017-11-06 15:11:14
3180
原创 JUnit4的入口类 - JUnitCore
概述JUnitCore作为JUnit4的入口类(包含了静态的main方法),定义了一系列方法来启动JUnit完成对测试类的反射执行编程方式使用 :public static void main(String[] args) { Result result = JUnitCore.runClasses(MyTest.class); // 测试类的class对象
2017-11-06 12:51:56
2471
原创 JUnit4总体介绍
关键类Statement可执行单元,也就是我们的测试方法和测试类FrameworkMember保存反射获取的成员变量和方法集合实现类为FrameworkMethod 和 FrameworkFieldDescription用来描述一个test(将要执行或者已经被执行(failure))的状态提供测试运行的feedback,比如IDE提供的tree view
2017-11-06 11:54:34
469
原创 HotSpot 调试环境搭建
环境 :和《HotSpot实战》里的一致源代码版本 : OpenJDK7,分支代号b147操作系统: Ubuntu 12.10编译环境 : GCC 4.7 、 G++ 4.6 和 GDB7.5可能遇到的问题 1. Ubuntu的问题由于12.10已经不再支持更新了,所以要设置一下支持旧版的软件源sudo gedit /etc/apt/sources.list
2017-04-09 15:54:43
2229
原创 书单推荐
JVM ⭐⭐⭐⭐⭐⭐ 《垃圾回收的算法与实现》 - 中村成洋介绍了垃圾回收算法的方方面面⭐⭐⭐⭐⭐⭐ 《HotSpot实战》 - 陈涛学习JVM实现和源码⭐⭐⭐⭐⭐⭐ 《深入java虚拟机》 网络⭐⭐⭐⭐⭐⭐《TCP/IP详解》 ,卷1是对协议的介绍⭐⭐⭐⭐⭐⭐《Scalable_IO_in_Java》 - Doug Le
2017-04-08 09:35:13
403
原创 Spring——bean的加载
本文主要介绍 ClassA classA = (ClassA) context.getBean("classA"); - 从Spring容器中获取一个bean的实例的大致流程。
2017-02-17 23:32:09
1015
原创 spring-配置文件的读取和解析
简介Spring的配置文件是我们使用其功能的开始,本文旨在理清Spring在对配置文件的读取和解析的关键节点。因为在读源码的时候很容易陷入对其中的细枝末节的纠结,而忘了我们本来的目的是为了了解框架本身的架构和原理而非对编程中的奇淫巧技的追逐。和我们对一般文件的处理一样,Spring对配置文件的处理分为两步 : 找到文件并载入内存中对文件内容进行解析转换为自己定义好的
2017-02-17 23:26:13
384
原创 tomcat——容器
什么是容器在Tomcat中用Container接口表示容器 , 其作用是处理接收到的客户端请求并返回相应的结果。如图,Container有四个子接口: Engine : 整个Tomcat的Servlet引擎 , 对应 Server.xml 的 Engine标签 Host :表示一个虚拟主机,可以包含多个context , Host标签Context : 即Web应用
2017-02-17 18:57:09
351
原创 tomcat——简单的Web服务器和Servlet容器
一般的Web服务器的处理过程 :以HTTP为例 ,当服务器接收到客户端请求的时候会经历如上图的过程读取输入流进行解码进行业务处理对结果进行编码发送响应到客户端在JAVA中一般用 Socket代表客户端 , ServerSocket代表服务端根据上图可以抽象出几个对象 :为HTTP的请求 - 响应模型Request 、 Res
2017-02-17 00:04:04
670
原创 一般Spring MVC项目问题排查经验
开发中总会遇上的这样那样的情况 : 这参数怎么没有传过来/传的值不对复制过来的代码怎么效果不一样在本地是好的啊怎么上线就挂了,这不科学好吧, 这里就分享一些开发中遇到问题快速定位的小经验,主要针对基于 Spring MVC 和 Mybatis的一般Web项目,旨在找出问题所在而非问题的解决方案。一次HTTP请求和服务器的交互过程 ,基本分为三部分 :
2017-02-07 20:42:42
1746
1
原创 git的操作
1. 修改打开git shell的起始目录,不需要每次打开都cd到指定目录右键git shell -> 属性 -> 修改目标为 path\tp\AppData\Local\GitHub\GitHub.appref-ms --open-shell=起始目录
2016-09-03 15:14:27
319
原创 Selenium自定义配置的策略
1. 希望能对WebDriver的超时(HttpClient)自定义配置关键的类: HttpCommandExecutor、HttpClientFactory顾名思义,HttpClientFactory可以生成HttpClient用于处理HTTP请求,而从源码中可以看到其中的SoTimeout并不合理HttpClientFactory : private final int TI
2016-08-17 22:33:16
1624
原创 简单的Selenium访问控制线程池
思路:频繁开关phantomJS进程比较耗费资源,所以需要维护一个线程池控制访问以减少内存消耗1. 自定义操作CustomAction接口public interface CustomAction { String action(WebDriver webDriver);}2. WebDriverPool池public class WebDriverPool {
2016-08-16 22:51:52
5740
原创 selenium2.53的一些实践
Selenium是一个自动化测试工具,可以模拟用户操作浏览器的行为,故也可以用于对一些需要执行JS脚本的网站的爬虫的开发一、Linux(Centos)下命令行环境的搭建 1.1 Xvfb的安装由于命令行下没有图形界面,这样就需要一个虚拟的后台运行的桌面Xvfb来欺骗浏览器使其得以正常运行yum install Xvfb 1.2 后台启动Xvfb并指定DISPLA
2016-08-14 22:19:55
2242
原创 Httpclient4.5
1.传递表单参数的方式:一般第一种就可以解决问题1.1 StringEntity entity =new StringEntity("a=1&b=2", "UTF-8");1.2 public static StringEntity createEntity(Map params) { StringEntity entity = null; Lis
2016-05-30 22:25:36
534
原创 tomcat——简单的日志实现
日志系统是一个记录信息的组件在Catalina中,日志系统是一个相对简单的跟容器相关联的组件一个日志系统必须实现org.apache.catalina.Logger接口日志接口提供了日志系统要实现的方法,最简单的方法是接受一个字符串并将其记录verbosity level : 冗余级别五个冗余级别:FATALERRORDEBUGWARNINGINFO
2016-04-11 21:13:45
438
原创 tomcat——生命周期管理机制
Catalina由多个组件组成,当Catalina启动的时候,这些组件也会启动。当Catalina停止的时候,这些组件也必须有机会被清除。保持组件启动和停止一致的机制通过实现org.apache.catalina.Lifecycle接口来实现如果一个组件可以触发事件,那么必须存在相应的监听器来对触发的事件作出回应。Tomcat的生命周期管理机制算是监听器模式的一种应用Lif
2016-04-10 15:53:21
631
转载 JMM——volatile与内存屏障
为了实现volatile内存语义,JMM会分别限制编译器重排序和处理器重排序1.当第一个操作为普通的读或写时,如果第二个操作为volatile写,则编译器不能重排序这两个操作(1,3)2.当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前(第二行)3.当第一个操作
2016-03-30 13:08:08
16271
5
转载 JMM——volatile的内存语义
volatile理解volatile特性的一个好方法:把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步 锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,这意味这对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入值锁的语义决定了临界区代码的执行具有原子性如果是多个vo
2016-03-30 10:01:44
1973
转载 JMM——重排序与happens-before
数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为下列三种类型: 上述三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变只有编译器和处理器在重排序时会遵守数据依赖性,它们不会改变存在数据依赖性关系的两个操作的执行顺序。但是不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑 a
2016-03-30 09:49:09
991
转载 JMM——重排序与内存屏障
重排序在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序重排序有三种类型:1.编译器优化的重排序编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序2.指令级并行的重排序现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序3.内存系统的重排序由于处理器使用缓存和读/写缓冲区,这使
2016-03-30 09:28:01
3168
原创 JAVA多线程——死锁分析
线程死锁的原因:当两个或多个线程正在等待对方占有的锁,死锁就会发生死锁会导致两个线程无法继续运行,被永远挂起。线程0想要lock1,线程1想要lock0,双方都在等待对方释放锁简单的死锁例子创建两个互相等待对方释放锁的线程public class DeadLock1 implements Runnable { private Object o1
2016-03-29 09:38:53
687
原创 JMM——线程间通信
在并发编程中,我们需要处理两个关键问题:1. 线程之间如何通信 通信是指线程之间以何种机制来交换信息,在命令式编程(c语言)中,线程之间的通信机制有两种: 1.1 共享内存 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。 JAVA并发采用的是共享内存模型,java线程之间的通信总是隐式进行,整个通信过程对程序员完全透
2016-03-28 20:16:09
1262
原创 java多线程——监视锁(monitor)
java中每个对象都有唯一的一个monitor,想拥有一个对象的monitor的话有以下三种方式:1.执行该对象的同步方法public synchronize a () {}2.执行该对象的同步块synchronize(obj) {}3.执行某个类的静态同步方法public static synchronize b(){}tips:拥有monitor的是线程
2016-03-28 18:34:15
17569
原创 JAVA多线程——notify()和notifyAll()的注意事项
1. - waiting on —— 对应java.lang.Thread.State: WAITING表示线程执行到了锁的wait()方法上由于wait()方法会释放锁,所以当前线程此时处于未获取锁状态,等待notify() || notifyAll()2. - waiting to lock —— 对应java.lang.Thread.State: BLOCKED表示锁已经
2016-03-28 13:33:40
656
原创 redis——list类型的设计与实现
Redis list -- 双向链表,l(L)开头命令效果备注lpush listkey value在list的头部添加value lpush list01 lzjlrange listkey start end表示从下标start开始取到end lrang
2016-03-28 08:23:38
600
原创 redis——string类型的设计与实现
Redis的string类型可以保存任何数据,包括图片、视频,是用二进制形式存储的Redis String,无前缀,对于不存在的key都会创建指定的key命令效果备注set key value设置对应的key和value set name lzjget key
2016-03-27 23:16:00
1013
原创 redis——redis的创建与部署
我用的redis版本是redis-3.0.7,系统是Linux Mintredis安装1.解压tar -zxvf redis-3.0.7.tar.gz2.编译和安装cd redis-3.0.7makesudo make install3.为了便于管理,把常用文件放到/usr/local/redis下3.1 先创建目录sudo mkdir -p /us
2016-03-27 22:18:04
1411
原创 JVM——JVM调优工具
Sun JDK 监控和故障处理工具1.jps (JVM Process Status Tool)显示指定系统内所有的HotSpot虚拟机进程2.jstat(JVM Statstisics Monitoring Tool)用于收集HotSpot虚拟机各方面的运行数据3.jinfo(Configuration Info for java)显示虚拟机配置信息4.jmap(Me
2016-03-27 21:05:53
404
转载 JVM——JVM性能调优
JVM性能调优的经验整个堆大小=年轻代大小 + 年老代大小 + 持久代大小-Xms : 最小可用内存-Xmx : 最大可用内存-Xmn(New Generation) : 年轻代大小-XX:SurviorRatio=x : 设置年轻代中Eden区与Survivor区的大小比值,2:eden = x-XX:MaxTenuringThreshold : 控制对象在经历多少此
2016-03-27 20:59:11
438
原创 坑——freemarker
1.空值处理 1.1 使用默认值 ${empty!"EmptyValue of fbysss"} 1.2 判断是否为空 ${var} 2.数字处理freemarker对数字默认使用逗号形式: 200,100,2000${varNum?c}3.取list长度${varList?size}
2016-03-27 20:03:48
394
转载 JVMGC——并发收集器(CMS)
CMS(Concurrent Mark Sweep)收集器C : ConcurrentM : 标记(marking)对象 :GC必须记住哪些对象可达,以便删除不可达的对象 S : 清除(sweeping) : 删除未标记的对象并释放它们的内存CMS是一种以最短停顿时间为目标的收集器,使用CMS并不能达到GC效率最高,但它尽可能降低GC时服务的停顿时间。使用标记
2016-03-27 19:28:11
6648
转载 JVMGC——垃圾收集器的分类
垃圾收集器是垃圾回收算法的体现JVM中垃圾收集器分为三类:1.串行收集器 2.并行收集器 3.并发收集器串行收集器用单线程处理所有垃圾回收工作,因此无需多线程交互,所以效率比较高适合单处理器机器。串行垃圾回收时会暂停程序-XX:+UseSerialGC并行收集器 对年轻代进行并行垃圾回收-XX:+UsePar
2016-03-27 18:55:42
1942
转载 JVMGC——堆内存的分代
分代的垃圾回收策略基于对对象声明周期分析后得出的垃圾回收算法。把对象分为年青代、年老代和持久代,对不同声明周期的对象使用不同的算法年轻代: 一个Eden区,两个Survior区 ,使用复制回收算法所有新生成的对象首先都是放置在年轻代(Eden区)的年轻代的目标就是尽可能快速地收集掉那些生命周期短的对象年轻代回收过程:1. 当Eden区满时,
2016-03-27 18:49:41
546
原创 JVMGC——基本垃圾回收算法
按照基本回收策略分:1. 引用计数原理是此对象有一个引用就增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只回收计数为0的对象。 缺点:无法处理循环引用的问题 2. 标记-清除 此算法执行分两阶段:1. 从引用根节点开始标记所有被引用的对象2. 遍历整个堆,把未标记的对象清除。缺点:此算法需要暂停整个应用,会产生内存碎片
2016-03-27 16:46:32
543
原创 JMM——运行时数据区
Java虚拟机运行时数据区1 程序计数器(Program Counter Register) 1.1 程序计数器是一块较小的线程私有的内存空间,可以看作是当前线程锁执行的字节码的行号指示器。 1.2 如果线程正在执行的是一个Java方法,记录的是正在执行的虚拟机字节码指令的地址 1.3 如果执行的是Native方法,计数器值为空(Undefined
2016-03-27 16:23:42
621
原创 java线程同步——CountDownLatch
java.util.concurrent.CountDownLatchCountDownLatch允许线程等待一组在其他线程中执行的操作完成之后才继续执行这个类通过指定一个整数初始化内部计数器,这个整数就是线程要等待完成的操作的数目当一个线程要等待某些操作先执行时,需要调用await()方法让线程进入休眠直到所有操作完成当某一个操作完成的时候,它将调用countDown()方法
2016-03-27 15:28:46
541
转载 java线程同步——信号量(Semaphore)
java.util.concurrent.Semaphore信号量是一种计数器,用来保护一个或者多个共享资源的访问,它是并发编程的一种基础工具。信号量通过计数器的方式来对资源进行访问控制当其计数器值大于0时,表示有资源可以访问当其计数器值等于0时,线程将进入休眠状态直到计数器值大于0通过信号量的构造函数指定资源数量:private final Semaphore s
2016-03-27 14:55:39
903
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人