<commit_before>
## JDK 安装配置

#### Ubuntu下安装配置OpenJDK
http://blog.csdn.net/gavin_dinggengjia/article/details/7363863

1、下载安装jdk
$sudo apt-get install openjdk-6-jdk
2、查看当前系统中的JVM
$sudo update-alternatives --display java
3、安装JVM路径
$sudo update-alternative s --install /usr/bin/java java /usr/lib/jvm/java-1.6.0-jdk/bin/java 60
4、更换系统 JVM
$sudo update-alternatives –config java
5、配置环境变量
$vim /etc/profile
添加以下几行： 

    export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk
    export JRE_HOME=$JAVA_HOME/jre  
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH  
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH 
    
$source /etc/profile 使配置立刻生效

6、验证配置完成
$echo $JAVA_HOME
$java -version

#### linux 安装 jdk
1, 将源码文件 jdk-8u152-linux-x64.tar.gz 解压到 /usr/local 下
2, 配置环境变量
  在/etc/profile文件中，配置环境变量，编辑文件，在最后添加：

    export JAVA_HOME=/usr/java/jdk1.8.0_65 
    export JRE_HOME=$JAVA_HOME/jre 
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib 
    export PATH=$JAVA_HOME/bin:$PATH

  保存退出后，执行source /etc/profile是修改的环境变量生效。
  注： Debian 默认安装 OPENJDK，路径：
    
    lrwxrwxrwx 1 root root 22 11月  2 22:17 /usr/bin/java -> /etc/alternatives/java

#### ubuntu下安装eclipse
http://blog.csdn.net/gavin_dinggengjia/article/details/7364375

#### dt.jar、tools.jar [作用](http://blog.csdn.net/ns_code/article/details/18547959)
* tools.jar：工具类库，它跟我们程序中用到的基础类库没有关系。我们注意到在Path中变量值bin目录下的各个exe工具的大小都很小，一般都在27KB左右，这是因为它们实际上仅仅相当于是一层代码的包装，这些工具的实现所要用到的类库都在tools.jar中，用压缩软件打开tools.jar,你会发现有很多文件是和bin目录下的exe工具相对性的。编译和运行需要的都是toos.jar里面的类分别是   

	sun.tools.java.*;	   
	sun.tools.javac.*;	

* dt.jar：运行环境类库，主要是Swing包。

* rt.jar 是JAVA基础类库，默认就在Root Classloader的加载路径里面的，而在Claspath配置该变量是不需要的；同时jre/lib目录下的其他 jar:jce.jar、jsse.jar、charsets.jar、resources.jar 都在Root Classloader中。

***

## web.xml

[格式定义](http://blog.csdn.net/liaoxiaohua1981/article/details/6759206)：

#### 初始化过程
* 在启动Web项目时，容器(比如Tomcat)会读web.xml配置文件中的两个节点 listener 和 contex-param。   
* 接着容器会创建一个 ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。  
* 接着容器会将读取到&lt;context-param&gt; 转化为键值对,并交给 ServletContext。 
* 容器创建 listener 中的类实例,即创建监听（备注：listener定义的类可以是自定义的类但必须需要继承 ServletContextListener）。   
* 在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法，在这个方法中可以通过

    event.getServletContext().getInitParameter("contextConfigLocation") 
  来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源，比如说数据库连接的关闭。 
* 得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。 
    
> 由上面的初始化过程可知容器对于web.xml的加载过程是 context-param -> listener  -> filter  -> servlet 。

#### 如何使用
页面中
     
        ${initParam.contextConfigLocation}
Servlet中
        
        String paramValue=getServletContext().getInitParameter("contextConfigLocation")
        
#### context-param

    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>contextConfigLocationValue></param-value>  
    </context-param>  
    
作用：该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
    param-name 设定上下文的参数名称。必须是唯一名称
    param-value 设定的参数名称的值


#### url-pattern
> Servlet 2.5规范允许<servlet-mapping>的<url-pattern>子元素出现多次，之前的规范只允许一个<servlet-mapping>元素包含一个<url-pattern>子元素。详细看[这里](http://blog.csdn.net/woshizoe/article/details/7696367)

##### Servlet 的 url 映射    
当Servlet容器接收到一个请求，它首先确定该请求应该由哪一个Web应用程序来响应。这是通过比较请求URI的开始部分与Web应用程序的上下文路径来确定的。映射到Servlet的路径是请求URI减去上下文的路径，Web应用程序的Context对象在去掉请求URI的上下文路径后，将按照下面的路径映射规则的顺序对剩余部分的路径进行处理，并且在找到第一个成功的匹配后，不再进行下一个匹配。

* 容器试着对请求的路径和Servlet映射的路径进行精确匹配，如果匹配成功，则调用这个Servlet来处理请求。
* 容器试着匹配最长的路径前缀，以斜杠（/）为路径分隔符，按照路径树逐级递减匹配，选择最长匹配的Servlet来处理请求。
* 如果请求的URL路径最后有扩展名，如.jsp，Servlet容器会试着匹配处理这个扩展名的Servlet。
* 如果按照前面3条规则没有找到匹配的Servlet，容器会调用Web应用程序默认的Servlet来对请求进行处理，如果没有定义默认的Servlet，容器将向客户端发送HTTP 404错误信息（请求资源不存在）。

##### 使用下面的语法来定义映射: 

* 以/开始并且以 /* 结束的字符串用来映射路径       
* 以*.为前缀的字符串用来映射扩展名         
* 以一个单独的/指示这个Web应用程序默认的Servlet    
* 所有其他的字符被用于精确匹配   

> [问题](http://blog.sina.com.cn/s/blog_7d0b04e70101mclr.html)： 为什么定义”/*.action”这样一个看起来很正常的匹配会错？  
  因为这个匹配即属于路径映射，也属于扩展映射，导致容器无法判断。
***

## class 字节码文件
class [字节码](http://www.cnblogs.com/ivantang/p/6236711.html)文件是一组以8位字节为基础单位的二进制流，各个数据项目严格按照顺序紧凑地排列在Class文件之中，中间没有添加任何分隔符，这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据，没有空隙存在。当遇到需要占用8位字节以上的空间的数据项时，则会按照高位在前的方式分割成若干个8位字节进行存储。

## JVM 内部原理的相关特性
JVM([Java虚拟机](http://www.cnblogs.com/ivantang/p/5530787.html))一种用于计算设备的规范，可用不同的方式（软件或硬件）加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据[JVM规格](http://www.cnblogs.com/ivantang/p/5531580.html)描述将解释器移植到特定的计算机上，就能保证经过编译的任何Java代码能够在该系统上运行。Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、[堆栈](http://www.cnblogs.com/ivantang/p/5531501.html)、寄存器等,还具有相应的指令系统。

为什么要分代?
[分代](http://www.cnblogs.com/ivantang/p/5530889.html)的垃圾回收策略，是基于这样一个事实：不同的对象的生命周期是不一样的。因此，不同生命周期的对象可以采取不同的收集方式，以便提高回收效率。

[JVM内存模型](http://www.cnblogs.com/ivantang/p/5530945.html)是Java的核心技术之一，现在很多编程语言都引入了类似Java JVM的[内存](http://www.cnblogs.com/ivantang/p/5531534.html)模型和垃圾收集器的[机制](http://www.cnblogs.com/ivantang/p/5531496.html)。

#### HotSpot
Java [HotSpot](http://www.cnblogs.com/ivantang/p/5531587.html) 虚拟机是Sun公司的Java平台一个高效的[虚拟机实现](http://www.cnblogs.com/ivantang/p/5531592.html)。Java HotSpot技术提供Java标准平台的基础设施，提供对快速开发、部署关键业务的桌面和企业应用程序的解决方案。Java SE可应用在Solaris操作环境、Linux和Windows下，也可以应用在其它通过Java技术认证的平台下。

#### java 沙箱
组成Java沙箱的基本组件如下：
* 类加载体系结构
* class文件检验器
* 内置于Java虚拟机（及语言）的安全特性
* 安全管理器及Java API

详细说明见[这里](http://zhaohe162.blog.163.com/blog/static/3821679720119311111880/)。

#### class 文件校验器
通过四趟扫描，保证了class文件正确 
* 第一趟：class文件的结构检查
* 第二趟：类型数据的语义检查
* 第三趟：字节码验证
* 第四趟：符号引用的验证

详细说明见[这里](http://blog.csdn.net/u013361114/article/details/25034077)

***

## Java 多线程
#### ThreadLocal
ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的，用于关联线程和线程的上下文。

ThreadLocal的作用是提供线程内的局部变量，这种变量在线程的生命周期内起作用，减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。<commit_msg>Update java.md<commit_after>
## JDK 安装配置

#### Ubuntu下安装配置OpenJDK
http://blog.csdn.net/gavin_dinggengjia/article/details/7363863

1、下载安装jdk
$sudo apt-get install openjdk-6-jdk
2、查看当前系统中的JVM
$sudo update-alternatives --display java
3、安装JVM路径
$sudo update-alternative s --install /usr/bin/java java /usr/lib/jvm/java-1.6.0-jdk/bin/java 60
4、更换系统 JVM
$sudo update-alternatives –config java
5、配置环境变量
$vim /etc/profile
添加以下几行： 

    export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk
    export JRE_HOME=$JAVA_HOME/jre  
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH  
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH 
    
$source /etc/profile 使配置立刻生效

6、验证配置完成
$echo $JAVA_HOME
$java -version

#### linux 安装 jdk
1, 将源码文件 jdk-8u152-linux-x64.tar.gz 解压到 /usr/local 下
2, 配置环境变量
  在/etc/profile文件中，配置环境变量，编辑文件，在最后添加：

    export JAVA_HOME=/usr/java/jdk1.8.0_65 
    export JRE_HOME=$JAVA_HOME/jre 
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib 
    export PATH=$JAVA_HOME/bin:$PATH

  保存退出后，执行source /etc/profile是修改的环境变量生效。
  注： Debian 默认安装 OPENJDK，路径：
    
    lrwxrwxrwx 1 root root 22 11月  2 22:17 /usr/bin/java -> /etc/alternatives/java

#### ubuntu下安装eclipse
http://blog.csdn.net/gavin_dinggengjia/article/details/7364375

#### dt.jar、tools.jar [作用](http://blog.csdn.net/ns_code/article/details/18547959)
* tools.jar：工具类库，它跟我们程序中用到的基础类库没有关系。我们注意到在Path中变量值bin目录下的各个exe工具的大小都很小，一般都在27KB左右，这是因为它们实际上仅仅相当于是一层代码的包装，这些工具的实现所要用到的类库都在tools.jar中，用压缩软件打开tools.jar,你会发现有很多文件是和bin目录下的exe工具相对性的。编译和运行需要的都是toos.jar里面的类分别是   

	sun.tools.java.*;	   
	sun.tools.javac.*;	

* dt.jar：运行环境类库，主要是Swing包。

* rt.jar 是JAVA基础类库，默认就在Root Classloader的加载路径里面的，而在Claspath配置该变量是不需要的；同时jre/lib目录下的其他 jar:jce.jar、jsse.jar、charsets.jar、resources.jar 都在Root Classloader中。

***

## web.xml

[格式定义](http://blog.csdn.net/liaoxiaohua1981/article/details/6759206)：

#### 初始化过程
* 在启动Web项目时，容器(比如Tomcat)会读web.xml配置文件中的两个节点 listener 和 contex-param。   
* 接着容器会创建一个 ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。  
* 接着容器会将读取到&lt;context-param&gt; 转化为键值对,并交给 ServletContext。 
* 容器创建 listener 中的类实例,即创建监听（备注：listener定义的类可以是自定义的类但必须需要继承 ServletContextListener）。   
* 在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法，在这个方法中可以通过

    event.getServletContext().getInitParameter("contextConfigLocation") 
  来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源，比如说数据库连接的关闭。 
* 得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。 
    
> 由上面的初始化过程可知容器对于web.xml的加载过程是 context-param -> listener  -> filter  -> servlet 。

#### 如何使用
页面中
     
        ${initParam.contextConfigLocation}
Servlet中
        
        String paramValue=getServletContext().getInitParameter("contextConfigLocation")
        
#### context-param

    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>contextConfigLocationValue></param-value>  
    </context-param>  
    
作用：该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
    param-name 设定上下文的参数名称。必须是唯一名称
    param-value 设定的参数名称的值


#### url-pattern
> Servlet 2.5规范允许<servlet-mapping>的<url-pattern>子元素出现多次，之前的规范只允许一个<servlet-mapping>元素包含一个<url-pattern>子元素。详细看[这里](http://blog.csdn.net/woshizoe/article/details/7696367)

##### Servlet 的 url 映射    
当Servlet容器接收到一个请求，它首先确定该请求应该由哪一个Web应用程序来响应。这是通过比较请求URI的开始部分与Web应用程序的上下文路径来确定的。映射到Servlet的路径是请求URI减去上下文的路径，Web应用程序的Context对象在去掉请求URI的上下文路径后，将按照下面的路径映射规则的顺序对剩余部分的路径进行处理，并且在找到第一个成功的匹配后，不再进行下一个匹配。

* 容器试着对请求的路径和Servlet映射的路径进行精确匹配，如果匹配成功，则调用这个Servlet来处理请求。
* 容器试着匹配最长的路径前缀，以斜杠（/）为路径分隔符，按照路径树逐级递减匹配，选择最长匹配的Servlet来处理请求。
* 如果请求的URL路径最后有扩展名，如.jsp，Servlet容器会试着匹配处理这个扩展名的Servlet。
* 如果按照前面3条规则没有找到匹配的Servlet，容器会调用Web应用程序默认的Servlet来对请求进行处理，如果没有定义默认的Servlet，容器将向客户端发送HTTP 404错误信息（请求资源不存在）。

##### 使用下面的语法来定义映射: 

* 以/开始并且以 /* 结束的字符串用来映射路径       
* 以*.为前缀的字符串用来映射扩展名         
* 以一个单独的/指示这个Web应用程序默认的Servlet    
* 所有其他的字符被用于精确匹配   

> [问题](http://blog.sina.com.cn/s/blog_7d0b04e70101mclr.html)： 为什么定义”/*.action”这样一个看起来很正常的匹配会错？  
  因为这个匹配即属于路径映射，也属于扩展映射，导致容器无法判断。
***

## class 字节码文件
class [字节码](http://www.cnblogs.com/ivantang/p/6236711.html)文件是一组以8位字节为基础单位的二进制流，各个数据项目严格按照顺序紧凑地排列在Class文件之中，中间没有添加任何分隔符，这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据，没有空隙存在。当遇到需要占用8位字节以上的空间的数据项时，则会按照高位在前的方式分割成若干个8位字节进行存储。

## JVM 内部原理的相关特性
JVM([Java虚拟机](http://www.cnblogs.com/ivantang/p/5530787.html))一种用于计算设备的规范，可用不同的方式（软件或硬件）加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据[JVM规格](http://www.cnblogs.com/ivantang/p/5531580.html)描述将解释器移植到特定的计算机上，就能保证经过编译的任何Java代码能够在该系统上运行。Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、[堆栈](http://www.cnblogs.com/ivantang/p/5531501.html)、寄存器等,还具有相应的指令系统。

为什么要分代?
[分代](http://www.cnblogs.com/ivantang/p/5530889.html)的垃圾回收策略，是基于这样一个事实：不同的对象的生命周期是不一样的。因此，不同生命周期的对象可以采取不同的收集方式，以便提高回收效率。

[JVM内存模型](http://www.cnblogs.com/ivantang/p/5530945.html)是Java的核心技术之一，现在很多编程语言都引入了类似Java JVM的[内存](http://www.cnblogs.com/ivantang/p/5531534.html)模型和垃圾收集器的[机制](http://www.cnblogs.com/ivantang/p/5531496.html)。

#### HotSpot
Java [HotSpot](http://www.cnblogs.com/ivantang/p/5531587.html) 虚拟机是Sun公司的Java平台一个高效的[虚拟机实现](http://www.cnblogs.com/ivantang/p/5531592.html)。Java HotSpot技术提供Java标准平台的基础设施，提供对快速开发、部署关键业务的桌面和企业应用程序的解决方案。Java SE可应用在Solaris操作环境、Linux和Windows下，也可以应用在其它通过Java技术认证的平台下。

#### 执行引擎
java 虚拟机字节码[执行引擎](http://www.cnblogs.com/sheeva/p/6347577.html)是jvm最核心的组成部分之一，它做的事情很简单：输入的是字节码文件，处理过程是字节码解析的等效过程，输出的是执行结果。

在jvm的内存结构里，存在这一块称为虚拟机栈的内存区域，虚拟机栈中的元素就是栈帧。每个栈帧主要包含4个部分：

局部变量表
操作数栈
动态连接
方法返回地址

#### java 沙箱
组成Java沙箱的基本组件如下：
* 类加载体系结构
* class文件检验器
* 内置于Java虚拟机（及语言）的安全特性
* 安全管理器及Java API

详细说明见[这里](http://zhaohe162.blog.163.com/blog/static/3821679720119311111880/)。

#### class 文件校验器
通过四趟扫描，保证了class文件正确 
* 第一趟：class文件的结构检查
* 第二趟：类型数据的语义检查
* 第三趟：字节码验证
* 第四趟：符号引用的验证

详细说明见[这里](http://blog.csdn.net/u013361114/article/details/25034077)

***

## Java 多线程
#### ThreadLocal
ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的，用于关联线程和线程的上下文。

ThreadLocal的作用是提供线程内的局部变量，这种变量在线程的生命周期内起作用，减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。
{'fraction_non_alphanumeric': 0.12482233926929187, 'fraction_numerical': 0.036284591589332, 'mean_word_length': 6.434431323803604, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 21, 'xml': 6}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1017021', 'n_tokens_mistral': 7713, 'n_tokens_neox': 8340, 'n_words': 424}