存档

2012年11月 的存档

web.xml 中的listener、 filter、servlet 加载顺序及其详解

2012年11月30日 1 条评论

一、概述

1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。

2、紧接着,容器创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。

3、容器将<context-param>转换为键值对,并交给servletContext。

4、容器创建<listener>中的类实例,创建监听器。

二 、 load-on-startup

load-on-startup 元素在web应用启动的时候指定了servlet被加载的顺序,它的值必须是一个整数。如果它的值是一个负整数或是这个元素不存在,那么容器会在该servlet被调用的时候,加载这个servlet 。如果值是正整数或零,容器在配置的时候就加载并初始化这个servlet,容器必须保证值小的先被加载。如果值相等,容器可以自动选择先加载谁。

在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:

标记容器是否在启动的时候就加载这个servlet。

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;

当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。

正数的值越小,启动该servlet的优先级越高。

三  、加载顺序

首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:ServletContext -> listener -> filter -> servlet 阅读全文…

分类: 项目管理 标签: , ,

java.lang.OutOfMemoryError: GC overhead limit exceeded解决

2012年11月23日 没有评论
一、异常如下:
Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded
二、解释:
JDK6新增错误类型。当GC为释放很小空间占用大量时间时抛出。
一般是因为堆太小。导致异常的原因:没有足够的内存。
三、解决方案:
1、查看系统是否有使用大内存的代码或死循环。
2、可以添加JVM的启动参数来限制使用内存:-XX:-UseGCOverheadLimit

模板方法模式(Template Method)

2012年11月21日 没有评论

模板方法(Template Method)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。

结构:

1) 抽象类(Abstract Class):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。
2) 具体类(Concrete Class):实现父类中的抽象方法以完成算法中与特定子类相关的步骤。

 abstract class Meetting {
 public abstract void task();
 public abstract void howGo();
 public void goMeetting() {
 System.out.println(“准备开会去哦!”);
 task();
 howGo();
 System.out.println(“开会结束,我要换回公司了!”);
 }
 }
 class PersonA extends Meetting {
 public PersonA(String name) {
 System.out.println(“我的名字叫” + name);
 }
 public void task() {
 System.out.println(“老板让我去总公司汇报财政情况”);
 }
 public void howGo() {
 System.out.println(“我搭公交车去总公司开会!”);
 }
 }
 class PersonB extends Meetting {
 public PersonB(String name) {
 System.out.println(“我的名字叫” + name);
 }
 public void task() {
 System.out.println(“老板让我去总公司提货物”);
 }
 public void howGo() {
 System.out.println(“我搭公交车去总公司开会!”);
 }
 }
 public class AttendMeetting {
 public static void main(String[] args) {
 Meetting person;
 person = new PersonA(“A”);
 person.goMeetting();
 System.out.println(“”);
 person = new PersonB(“B”);
 person.goMeetting();
 }
 }

适用情况:
1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可
以说是一种好的编码习惯了。
3) 控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。

【译】jconsole的使用

2012年11月20日 没有评论

 

准备翻译下jconsole的官方使用教程,官方页面:

http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html

译文如下:

使用jconsole
    jconsole图形用户界面是一个符合JMX规格的监控工具。JConsole使用JVM的仪表化的扩展提供关于应用在java平台上的执行和资源消耗信息。
    在J2SE6中,JConsole已经更新了windows和gnome桌面的外观。通过一个运行在xp上的接口实例来展现。
开始运行
      JConsole的可执行文件在JDK_HOME/bin目录中,如果你已经配置了环境变量,可以在命令行中直接输入‘jconsole’来执行。否则,你必须输入可执行文件的全路径。
命令语法
       你可以使用jconsole监控本地应用和远程应用.
注意:使用jconsole监控一个本地应用是有用的,但在生产环境是不推荐的,应为jconsole本身会消耗系统资源。推荐使用远程监控来隔离jconsole和要监控的应用。
jconsole命令的完整语法可参考:Java Monitoring and Management Console.
设置本地监控
       在命令行中键入以下命令开始
% jconsole
当jconsole启动后,你会在所有本地运行的java应用中选择一个来通过jconsole连接。
如果你想要监控一个特别的应用,并且你知道应用的进程id,你可以同jcons连接到这个应用。这个应用必须使用相同的userid运行。语法如下:
% jconsole processID
       上面的命令中processID是应用的pid。可以通过以下方式确定应用的pid:
在linux系统中,可以使用ps命令查找运行的java实例的pid。
在windows中,可以使用任务管理器查找java或javaw的pid
也可以使用jps命令行工具确定pid
例如,你去顶‘Notepad’应用的pid是2956,你可以使用下面的命令启动jconsole
% jconsole 2956
        jconsole和应用必须用同一个用户执行。管理和监控系统使用操作系统的文件权限。如果你不指定一个pid,jconsole会自动检测所有的本地java应用,显示在一个对话框中,让你选择监控哪一个
设置远程监控
启动远程监控使用下面的命令
% jconsole hostName:portNum
hostName是应用运行的系统名,portNum是启动的jvm的端口号。如果你没指定主机名和端口号,jconsole会显示一个连接会话框来输入主机名和端口号。
设置安全远程监控
你可以启动jconsole通过一个使用SSL的安全连接来监控。使用安全连接的命令在这 Remote Monitoring with JConsole with SSL Enabled in Chapter 2, Monitoring and Management Using JMX Technology.
连接到一个JMX代理
如果你启动jconsole通过参数指定一个JMX代理来连接,它会自动的启动监控指定的JVM。你能在任何时候通过选择连接或新建连接来连接到一个不同的主机。
否则,如果你启动jconsole时不提供任何参数,你会首先看到连接对话框。这个对话框有两个选项,允许远程或本地连接
动态连接
在较早的javase平台下,你想要监控的应用需要在下列条件下启动。
% -Dcom.sun.management.jmxremote
然而,j2se6提供的jconsole的版本能连接到任何应用。换句话说,任何运行在java se6 jvm的应用可被jconsole自动探测,并且不需要使用上面的命令选项。
连接jconsole到一个本地进程
如果启动jconsole不使用提供指定JMX代理来连接,你会看到下面的窗口
图一、创建一个本地进程连接

The dialog window for creating connections to local processes

本地进程选择列出所有运行在本地操作系统的jvm,类名或者参数信息和进程id。为了连接jconsole到你的应用,选择你要监控的应用,然后点击连接。
本地进程的列表包含以下类别的jvm:
1、应用的管理代理可用。
2、应用可连接,并且管理代理不可用
3、应用不可连接,并且管理代理不可用
展示overview信息
jconsole_overview
分类: jvm 标签: , ,

IP网段表示法与子网掩码的计算

2012年11月16日 没有评论

 

现在的IPv4暂时由四段数字组成,通常分为三类IP:

     A类:0.0.0.0到127.255.255.255

     B类:128.0.0.0到191.255.255.255

     C类:192.0.0.0到223.255.255.255

 

子网掩码:

     A类:255.0.0.0                一个子网最多可容纳1677万台电脑

     B类:255.255.0.0            一个子网最多可容纳6万台电脑

     C类:255.255.255.0        一个子网最多可容纳253台电脑

 

在同一网段,要求网络标识相同,网络标识就是用IP的二进制与子网掩码的二进制数据作'与'运算(可用WINDOWS计算器算二进制),所以结果相同,表示在同一网段,而不是IP地址前几段相同就表示在同一网段。算网络标识的时候,A类IP只算第一段,B类只算第一,二段,C类IP算第一,二,三段。

     例:192.168.0.1 255.255.255.0的网络标识为:192.168.0.0

            192.168.0.1:    11000000.10101000.00000000.00000001

            255.255.255.0:11111111.11111111.11111111.0000000

            作与运算:        11000000.10101000.00000000.00000000

     结果:192.168.0.0

子网掩码决定了一个子网的计算机数目,简单的算法就是2的M次方。M表示二进制的子网掩码后面0的数目。

     例:255.255.255.0

     二进制:11111111.11111111.11111111.00000000

后面有8个0,那M就是8,这个子网掩码可以容纳2的8次方(台)电脑,也就是256台,去掉0和255就是254台电脑。

实例:一个公司有530台电脑,组成一个对等网,子网掩码如何设?IP如何设?

     子网掩码:         

          2的M次方=530,求的M=10

          那么子网掩码最后为10个0,如此便是:11111111.11111111.11111100.00000000

          换成十进制便是:255.255.252.0

再看IP,我们选一个B类IP,例如:188.188.×.×

     前两段按B类要随便设就可以,关键是第三段,只要网络标识相同就可以在同一网段就可以,我们先看网络标识:

          255.255.252.0:11111111.11111111.11111100.00000000

          188.188.×.×:   10111100.10111100.??????××.××××××××

          网络标识:        10111100.10111100.??????00.00000000

     上边×号无论填0和1结果都是0

     ?处填0和1都一样,我们就全填0,结果便是IP便是:

     10111100.10111100.000000××.××××××××,这个IP共有530台电脑,IP最后一段分给254台,一共要分530/254=2.086段,四舍五入要分成3段,所以IP地址000000××处分成三个不同的数据即可,例:00000001,00000010,00000011,分别是1,2,3,

这样IP地址就确定了188.188.1.×,188.188.2.×,188.188.3.×。

分类: 网络 标签:

awk简介

2012年11月15日 没有评论

 

  AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
  最简单地说, AWK 是一种用于处理文本的编程语言工具。AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想。在最初创造 AWK 时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
  尽管操作可能会很复杂,但命令的语法始终是:
  awk '{pattern + action}' 或者 awk 'pattern {action}'
  其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
分类: linux 标签: ,

文章分类汇总

2012年11月14日 5 条评论
JVM基础及优化系列
jdk源码分析系列
        Vector源码分析
        HashMap源码分析
        HashTable源码分析

《深入java虚拟机》笔记

2012年11月13日 1 条评论

 

java虚拟机结束:System.exit(0)、程序正常执行 结束、异常、系统错误jvm进程退出

 
加载:查找并加载类的二进制数据
连接:
        验证:确保被加载的类的正确性
        准备:为类的静态变量分配内存,并将其初始化为默认值
        解析:把类中的符号引用转换为直接引用。
初始化:为类的静态变量赋予正确的初始值
 
java程序对类的使用方式:主动使用、被动使用
 
所有java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化他们
 
主动使用:(六种)
1.创建类的实例
2.访问某个类或接口的静态变量,或者对该静态变量赋值
3.调用类的静态方法
4.反射(Class.forName("com.Test"))
5.初始化一个类的子类
6.java虚拟机启动时被标明为启动类的类
 
 
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在heap区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。

 

分类: jvm 标签:

windows中将命令行的结果的输出到文件

2012年11月11日 没有评论

 

echo 12 >e:\a.txt

分类: 小技巧 标签:

sleep()与wait()的区别

2012年11月11日 没有评论

 

1、所在的位置不同
sleep()在Thread类中。而wait()在Object类中。
2、睡眠时的动作不同
sleep是让线程睡眠了,线程还是抱着对象锁不放,也就是说,虽然他睡了,他所占有的东西你还是别想动;wait不同,睡了,同时把自己占有的锁让出来,给别人机会运行,但也要别人将他唤醒。
分类: java基础知识 标签: