java
cwjokaka
GitHub: https://github.com/cwjokaka
展开
-
设计模式_4:代理模式
这里说的是静态代理模式,想看动态代理模式可以移步来这篇博文:设计模式_25:动态代理模式假如今天轮到我做班里的值日,那么代码可以这样写:public class Main { public static void main(String[] args) { Me me = new Me(); me.doDuty(); }}interface D...原创 2017-10-06 17:41:37 · 234 阅读 · 0 评论 -
设计模式_13:适配器模式
有4个角色:美国人、英国人、中国人、中译英的翻译官,让美、英、中三人分别说一句英语,假设中国人不会说英语(即没有实现说英语的接口),那么他就只能依靠翻译官来帮忙了:public class Main { public static void main(String[] args) { IEnglish american = new American();原创 2017-10-16 16:05:07 · 160 阅读 · 0 评论 -
设计模式_22:享元模式
书上的原句:享元模式:运用共享技术有效地支持大量细粒度的对象。栗子来了:我们写了一个网站,现在要把这个产品卖给不同的用户,但为了节省资源,我们可以把相同类型的网站公用一个服务器和数据库,而不用重新购买服务器和申请多个域名了(也就是不用重复new同类别的对象)。import java.util.HashMap;import java.util.Map;public class原创 2017-10-24 18:32:43 · 223 阅读 · 0 评论 -
【JVM】7_对象的自我拯救
即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将原创 2017-11-01 17:59:54 · 252 阅读 · 0 评论 -
【JVM】4_利用GCLib测试方法区溢出
方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。对于这些区域的测试,基本的思路是运行时产生大量的类去填满方法区,直到溢出,用GCLib可以方便我们测试方法区溢出。import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cgl原创 2017-11-01 09:46:17 · 269 阅读 · 0 评论 -
【JVM】5_测试直接内存溢出
直接通过反射获取Unsafe实例进行内存分配(Unsafe类的getUnsafe()方法限制了只有引导类加载器才会返回实例,也就是设计者希望只有rt.jar中的类才能使用Unsafe的功能)。因为,虽然使用DirectByteBuffer分配内存也会抛出内存溢出异常,但它抛出异常时并没有真正向操作系统申请分配内存,而是通过计算得知内存无法分配,于是手动抛出异常,真正申请分配内存的方法是unsafe原创 2017-11-01 14:00:07 · 274 阅读 · 0 评论 -
【java集合】自己实现简易的HashMap
面试中经常会被问到HashMap的原理,所以自己尝试实现了一个极简版的,应该可以应付一般的考官了,但是功能、性能方面肯定远不及官方jdk的了。先来看看定义的IMap接口:public interface IMap { V get(K key); V put(K key, V value); int size(); interface Entry{原创 2017-11-01 00:46:11 · 243 阅读 · 0 评论 -
【java集合】自己实现简易的LinkedList
List接口:public interface IMyList { boolean add(E e); void add(int index, E e); int size(); boolean isEmpty();}LinkList实现:public class MyLinkedList implements IMyList {原创 2017-11-08 20:26:08 · 286 阅读 · 0 评论 -
jstack:Java堆栈跟踪工具
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个原创 2017-11-08 17:16:49 · 999 阅读 · 0 评论 -
设计模式_21:中介者模式
书上的原句:中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。一个例子:如果中国和美国之间的交涉通过联合国机构间接转发,而不是面对面的交涉,那么代码可以写成这样:public class Main { public static void main(String[] args) {原创 2017-10-23 12:54:14 · 152 阅读 · 0 评论 -
jhat:虚拟机堆转储快照分析工具
Sun JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。不过实事求是地说,在实际工作中,除非笔者手上真的没有别的工具可用,否则一般都不会去直接使用jhat命令来分析dump文件,主要原因有二:一是一般不会在部署应用程序的服务器原创 2017-11-08 13:58:19 · 1647 阅读 · 0 评论 -
设计模式_12:状态模式
创建一个Hero类,有一个方法work可以根据当前实例的体力(power)和是否过于疲倦(isTired)来做出不同的反应:public class Main { public static void main(String[] args) { Hero hero = new Hero(100, false); hero.work();原创 2017-10-13 14:42:46 · 164 阅读 · 0 评论 -
设计模式_14:备忘录模式
我们玩单机RPG游戏的时候,通常会在打Boss前存个档,方便输掉的时候直接读取进度,这就是典型的备忘录模式:public class Main { public static void main(String[] args) { GameRole hero = new GameRole(); RoleStateCaretaker roleSt原创 2017-10-16 17:29:52 · 169 阅读 · 0 评论 -
【JVM】6_GC存活分析算法之引用计数法的优缺
引用计数法(Reference Counting)的含义:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。优点:客观地说,引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软公司的COM(Component Object Model原创 2017-11-01 16:25:28 · 1253 阅读 · 0 评论 -
【JVM】9_大对象直接进入老年代
/** * VM参数 : * -verbose:gc * -Xms20M * -Xmx20M * -Xmn10M * -XX:+PrintGCDetails * -XX:SurvivorRatio=8 * -XX:PretenureSizeThreshold=3145728 //对象如果大于或等于此值,会直接分配到老年代里 * -XX:+UseSerialGC原创 2017-11-06 16:57:37 · 7219 阅读 · 0 评论 -
【JVM】8_对象优先在Eden分配
/** * VM参数有这些: * -verbose:gc : 表示输出虚拟机中GC的详细情况,输出像: [Full GC 168K->97K(1984K), 0.0253873 secs] * -Xms20M : 堆内存最小值(单位M) * -Xmx20M : 堆内存最大值(单位M) * -Xm原创 2017-11-06 14:37:03 · 506 阅读 · 1 评论 -
【JVM】理解GC日志
本文转载自http://blog.csdn.net/renfufei/article/details/49230943本文是 Plumbr 发行的 Java垃圾收集指南 的部分内容。文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息。我们通过 -XX:+UseSerialGC 选项,指定JVM使用串行垃圾收集器, 并使用下面的启动参数让 JVM 打印出详细的GC转载 2017-11-06 14:25:25 · 288 阅读 · 0 评论 -
【java集合】自己实现简易的Hashtable
Map接口:/** * Created by hasee on 2017/11/5. */public interface IMyMap { V put(K key, V value); V get(K key); int size(); boolean isEmpty(); interface Entry{}}Hashtable实现原创 2017-11-05 23:14:06 · 459 阅读 · 0 评论 -
【java集合】自己实现简易的HashSet
Set接口:public interface IMySet { boolean add(E e); boolean remove(E e); boolean contains(Object o); int size();}HashSet实现:import java.util.HashMap;/** * HashSet底层的数据存取是通过Hash原创 2017-11-04 19:28:12 · 477 阅读 · 0 评论 -
【java集合】自己实现简易的HashMap~改良
map接口:public interface IMyMap { V put(K key, V value); V get(K key); int size(); interface Entry{};}实现:import java.util.HashMap;/** * Created by hasee on 2017/11/2. */p原创 2017-11-03 20:20:08 · 204 阅读 · 0 评论 -
设计模式_24:访问者模式
书上的原句:访问者模式:表示一个作用在某对象结构中的各元素的操作,它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作一个例子:我们先用最简单的多态来实现一个动物的行为:public class Main { public static void main(String[] args) { Animal bird = new Bird();原创 2017-10-26 16:38:23 · 164 阅读 · 0 评论 -
设计模式_15:组合模式
将对象组合成属性结构以表示'部分-整体'的层次结构组合模式使得用户对单个对象和组合对象的使用具有一致性import java.util.ArrayList;import java.util.List;public class Main { public static void main(String[] args) { Company topCompa原创 2017-10-17 15:11:13 · 203 阅读 · 0 评论 -
设计模式_23:解释器模式
书上的原句:解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。原创 2017-10-25 12:43:00 · 187 阅读 · 0 评论 -
jmap:Java内存映像工具
jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。如果不使用jmap命令,要想获取Java堆转储快照,还有一些比较“暴力”的手段:譬如在第2章中用过的-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件,通过-XX:+HeapDumpOnCtrlBreak参数则可以原创 2017-11-08 11:48:15 · 401 阅读 · 0 评论 -
jinfo:Java配置信息工具
jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查询了(如果只限于JDK 1.6或以上版本的话,使用java-XX:+PrintFlagsFinal查看参数默认值也是原创 2017-11-08 11:25:50 · 217 阅读 · 0 评论 -
jstat虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。命令格式:jstat[option vmid[interval[s|ms][cou原创 2017-11-08 11:08:26 · 231 阅读 · 0 评论 -
设计模式_17:单例模式
单例模式:保证一个类仅有一个实例,比提供一个访问它的全局访问点(原书)举个例子:例如计划生育,每对夫妇只能有一个孩子:public class Main { public static void main(String[] args) { Children children_1 = Children.getInstance(); Children原创 2017-10-18 14:30:11 · 160 阅读 · 0 评论 -
设计模式_18:桥接模式
书上的原句:桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。public class Main { public static void main(String[] args) { Mobile nokia = new Nokia(); Mobile iphone = new IPhone(); Software原创 2017-10-19 14:27:48 · 164 阅读 · 0 评论 -
设计模式_2:策略模式
现在出现了一个需求,编写一个超市收银台软件,可以根据商品的价格统计出消费者应付金额,先来没头脑的一顿操作:import java.util.Scanner;public class Main { private static double total = 0; public static void main(String[] args) { Scann原创 2017-10-03 16:23:16 · 177 阅读 · 0 评论 -
设计模式_10:观察者模式
观察者(Observer)模式又称为发布订阅模式(Publish/Subscribe),如果一个对象改变时需要通知其他对象,那么就可以用观察者模式解决。一个简单的例子:顾客订阅了卖家,以后卖家有什么新消息(优惠活动、打折什么的)就可以找到并通知给顾客了:import java.util.ArrayList;import java.util.List;public class Main原创 2017-10-10 16:24:07 · 559 阅读 · 0 评论 -
设计模式_1:简单工厂模式
假设现在有一个需求:写一个简单的计算器,可实现加减乘除运算,开始我们凭第一感觉可能会直接写成这样:import java.util.Scanner;public class Main { public static void main(String[] args) { System.out.println("请输入你想要的运算(+ - * /):");原创 2017-10-03 11:26:46 · 173 阅读 · 0 评论 -
设计模式_9:建造者模式
在纸上画两个人,初步代码:public class Main { public static void main(String[] args) { //画一个男孩 System.out.println("small-body"); System.out.println("small-head"); System.out.原创 2017-10-10 12:40:49 · 199 阅读 · 0 评论 -
设计模式_8:外观模式
如果需要从数据库的一个表的某条信息复制到另一个表里,可以先写出初步代码:public class Main { public static void main(String[] args) { Dao1 dao1 = new Dao1(); Dao2 dao2 = new Dao2(); //从数据库一个表中读取数据 S原创 2017-10-09 22:03:58 · 141 阅读 · 0 评论 -
设计模式_7:模板方法模式
两个人要做两张相同的试卷试卷,初步代码:public class Main { public static void main(String[] args) { TestPaperA testPaperA = new TestPaperA(); testPaperA.question_one(); testPaperA.question原创 2017-10-09 17:37:35 · 169 阅读 · 0 评论 -
cxf-Springmvc-maven实现webservice
此文转载自http://www.imooc.com/article/14635虽知道webservice,工作两年一直没使用过,最近不忙趁机研究了下,实现了简单的服务端及客户端调用。鉴于慕课网没有webservice的教程,大多又都是学生,就在这里跟大家分享下,内容比较详细。大神请忽略,如有错误之处,敬请指点。第一步,下载cxf及配置环境变量。Source Distribution转载 2017-10-09 16:00:56 · 280 阅读 · 0 评论 -
设计模式_6:原型模式
有时需要生成多个相同的对象,最普通的方法就是就是用相同的属性new相同的对象: public class Main { public static void main(String[] args) { Chicken chicken1 = new Chicken(10, 'f', "Tom", 100); Chicken chicken2 = new C原创 2017-10-08 15:21:09 · 174 阅读 · 0 评论 -
设计模式_16:迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。当你需要对聚集进行多种方式遍历时,可以考虑用迭代器模式;import java.util.ArrayList;import java.util.List;public class Main { public static void main(String[] args) {原创 2017-10-17 17:39:03 · 165 阅读 · 0 评论 -
openjdk和jdk的区别
使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的openjdk,那么到底什么是openjdk,它与sun jdk有什么关系和区别呢? 历史上的原因是,openjdk是jdk的开放原始码版本,以GPL协议的形式放出。在JDK7的时候,openjdk已经成为jdk7的主干开发,sun jdk7是在openjdk7的基础上发布的,其大部分原始码都转载 2017-10-27 14:33:58 · 1684 阅读 · 0 评论 -
设计模式_19:命令模式
书上的原句:命令模式:将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。拿一个烧烤店的例子来说://客户端public class Main { public static void main(String[] args) { Barbecuer barbecuer = new原创 2017-10-19 17:23:01 · 161 阅读 · 0 评论 -
jps虚拟进程状况工具
jps(JVM Process Status Tool):可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。虽然功能比较单一,但它是使用频率最高的JDK命令行工具,因为其他的JDK工具大多需要输入它查询到的LVMID来确定要监控的是原创 2017-11-08 11:00:12 · 485 阅读 · 0 评论