摘要:
1. 描述 Container提供管理bean的能力。 基于Jetty-9.4.8.v20171121。 1.1 API 从API可以看出Container主要维护bean并且监听bean的增加和删除事件。 1.2 类图 从类图可以看出,Container与LifeCycle接口很类似,都是很多组件 阅读全文
摘要:
1. 描述 基于Jetty-9.4.8.v20171121。 LifeCycle主要管理Jetty里面通用组件的生命周期,比如组件启动中、启动、运行、停止中、停止等,实现该接口就可以定义一套生命周期。 其中通用组件比如Server,Connector,Handler等,Jetty把很多对象当成组件来 阅读全文
摘要:
1. 环境 Windows7-64Bit VS2010-32Bit JDK1.8-64Bit 2. 步骤 2.1 创建NativePrint类 其中包含一个native方法,这个native方法是通过C++实现的,C++的实现代码最终是生成dll文件,然后通过Java调用。 2.2 编译Native 阅读全文
摘要:
1. 背景 虽然大多数应用程序使用JVM的默认设置就能很好地工作,仍然有不少应用程序需要对JVM进行额外的配置才能达到其期望的性能要求。 现在JVM为了满足各种应用的需要,为程序运行提供了大量的JVM配置选项。不幸的是,针对一个应用程序进行的JVM调优(配置)可能并不适用于另一个应用程序。 注意:为 阅读全文
摘要:
1. 概述 应用的性能极限是服务等级协议中关注的重点。找到性能极限的关键在于知道该监控哪些数据、监控软件栈的哪些部分以及使用哪些工具。本篇文章将介绍需要监控的操作系统数据以及可用的操作系统性能监控攻击,还会给出一般性指导原则。主要涉及的操作系统是Windows 7和Ubuntu 12.04.5 LT 阅读全文
摘要:
1. Java平台级模块系统 该特性使Java9最大的一个特性,Java提供该功能的主要的动机在于,减少内存的开销,JVM启动的时候,至少会有30~60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去,模 阅读全文
摘要:
0. 实例 如何使用模块--从编写源代码到编译,打包和运行程序。 0.1 使用命令行编写和运行模块程序 0.1.1 设置目录 使用如下目录层次结构来编写,编译,打包和运行源代码: src目录用于保存源代码,其中包含一个com.jdk9.m的子目录,并且创建一个同名的com.jdk9.m模块名,并将其 阅读全文
摘要:
1. 背景 Java8发行版是自Java5以来最具革命性的版本,Java8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。 2. Java语言的新特性 2.1 Lambda表达式与Functional接口 Lambda表达式(称为闭包)是整个Java8发行版中最受期待的在Java语言 阅读全文
摘要:
1. 背景 给一个系统定位问题的时候,知识、经验是关键基础,数据(运行日志、异常堆栈、GC日志、线程快照[threaddump / javacore文件]、堆转储快照[heapdump / hprof])是依据,工具是运用知识处理数据的手段。 经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据 阅读全文
摘要:
类文件格式 大量建立在虚拟机之上的程序语言将编写的程序编译成二进制本地机器码(Native Code)已不再是唯一的选择,越来越多的程序语言选择了与操作系统和机器指令集无关的,平台中立的格式作为程序编译后的存储格式。 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式--字节码(ByteCode 阅读全文
摘要:
创建型 结构型 装饰器模式 JDK源码实例:Java的一系列InputStream流处理,如FileInputStream,BufferedInputStream 外观模式(Facade Pattern) JDK源码实例:JavaWeb的三层开发模式 行为型 阅读全文
摘要:
图片看不清楚,可以下载或在页面中单独查看图片 1. 概述 Garbage Collection, GC:1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集器技术的语言。 程序计数器,虚拟机栈,本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行 阅读全文
摘要:
1. 概述 对于Java程序员,在虚拟机自动内存管理机制的帮助下,不再需要为每个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题。 2. 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创 阅读全文
摘要:
概述 为了解决内存与cpu之间的速度矛盾,在两者之前引入了写速度尽可能接近cpu运算速度的高速缓存:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理就无须等待缓慢的内存读写了。 但是这也为计算机系统带来更高的复杂度,因为它引入了一个新的问题:缓存一致 阅读全文
摘要:
引言 synchronized是Java线程同步中的一个重要的概念,synchronized是独占锁(互斥锁),同时也是可重入锁(可重入锁一定程度上避免了死锁的问题,内部是关联一个计数器,加一次锁计数器值加一,为零时释放锁),也是一种重量级锁。 synchronized是Java中的关键字,是一种同 阅读全文
摘要:
引言 在Java中,可以通过配合调用Object对象的wait,notify和notifyAll来实现线程间的通信。 在线程中调用wait方法,将阻塞带带其他线程的通知(其他线程调用notify或notifyAll)。 在线程中调用notify或notifyAll将通知其他线程从wait方法处返回。 阅读全文
摘要:
背景 由于使用stop方法停止线程非常暴力,可能会导致一系列问题。因此,提出一种温和的方式:请求另外一个先不要在执行了,这就是中断方式。 此外有这样的场景:编写 一个程序,需要暂停一段时间,于是调用Thread.sleep(),但是编译器或IDE报错说没有处理检查到的InterruptedExcep 阅读全文
摘要:
概述 从使用者的角度,AQS的功能可分为两类:独占功能和共享功能。它的子类中,要么实现并使用了它独占功能的API,要么使用了共享锁的功能,而不会同时使用两套API,即使是它的子类ReentrantReadWriteLock,也是通过两个内部类:读锁和写锁,分别实现的两套API来实现的。 AQS是一个 阅读全文
摘要:
背景 在JDK1.5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁,锁机制存在以下问题: (1)在多线程竞争中,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题; (2)一个线程持有锁会导致其他所有需要此锁的线程挂起; (3)如果一个优先级高的线程等待一个优先 阅读全文
摘要:
前言 HashMap非线程安全的,HashTable是线程安全的,所有涉及到多线程操作的都加上了synchronized关键字来锁住整个table,这就意味着所有的线程都在竞争一把锁,在多线程的环境下,它是安全的,但是无疑效率低下的。 ConcurrentHashMap(JDK1.7) 在JDK1. 阅读全文