java软件项目的生命周期期java项目的过程有哪些

版权声明:本文为博主原创文章,未经博主允许不得转载。 /canot/article/details/

1)当浏览器第一次访问Servlet时,服务器会根据浏览器访问的路径,例如/Demo2,在项目的web.xml文件中 找到该Servlet的全路径,进行反射创建。(用户没有设置loadOnStartup的时候或者loadOnStartup < 0 的时候)
如果loadOnStartup > 0则web容器启动的时候做实例化处理,顺序是由小到大,正整数小的先被实例化
loadOnStartup = 0 web容器启动的时候做实例化处理,相当于是最小整数,因此web容器启动时,最先被实例化
4)如果浏览器再次访问相同的Servlet,从服务端维护的Servlet实例集合中取得对应的实现,为浏览器响应
5)同一个Servlet实例,在服务端只有一个,即Servlet是单例的。
6)服务器在决定销毁Servlet实例之前,调用destory()方法,每个Servlet实例只会调用一次,在重新部署情况下会销毁之前的

 首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

Servlet 和 filter 被所有请求共享。那是 Java 的一个优点,使得多个不同线程(读取 HTTP 请求)可以使用同一个实例。否则为每个请求重新创建线程的开销实在过于昂贵。但永远不要将任何 request 或 session 域中的数据赋值给 servlet 或 filter 的实例变量。它将会被所有其他 session 中的所有请求共享。那是非线程安全的!
每个线程会共享同一个Servlet的实例变量,所以要对敏感数据加锁
产生线程安全条件如下:
通过加锁的方式,对敏感数据块进行代码同步处理方法也就是多线程中的线程锁
还有一种处理方法就是 实现SingleThreadModel来解决线程安全
此方法已经被废除。主要是有二个不足之处:
a)SingleThreadModel接口的值与web服务器最多接收的线程数有关,可能会出现大值变小值的情况
b)SingleThreadModel接口如果发现某个线程正在占用该Servlet实例,会自动创建一个新的Servlet实例为浏览器服务,
这就违背了Servlet单例的原则

2、由于Servlet只会调用构造方法一次,因此Servlet是单例的,在Servlet容器中,一个Servlet类只有一个Servlet实例存在。
3、Servlet处理请求是方式是多线程的,也就是说,一个请求会开启一个独立线程来处理。因此,在Servlet的处理方法应该注意线程安全。
4、Servlet可以配置参数,在Servlet类里可以读取参数。

JSP执行过程,以及生命周期

(3) 将产生的Servlet 的源代码经过编译后,并加载到内存并进行实例化;

转译时期:JSP网页转译成Servlet类。

请求时期:Servlet类执行后,响应结果至客户端。 

转译期间主要做了两件事情:将JSP网页转译为 Servlet 源代码(.java),此段称为转译时

1、转换 验证JSP页面,没有出现错误,就创建一个包含servlet类的java文件;

2、编译 把java文件编译成类(.class)文件 并报告语法错误

3、加载和实例化 编译成功则将servlet类加载到内存中,并对其进行实例化;


在创建阶段系统通过以下的几个步骤来完毕对象的创建过程

  • l  为对象分配存储空间
  • l  超类成员变量按顺序初始化,递归调用超类的构造方法
  • l  子类成员变量按顺序初始化,子类构造方法调用

一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段

对象至少被一个强引用持有着。

当一个对象处于不可见阶段时,说明程序本身不再持有该对象的不论什么强引用,尽管该这些引用仍然是存在着的。

简单说就是程序的运行已经超出了该对象的作用域了。

举比例如以下图:本地变量count在25行时已经超出了其作用域,则在此时称之为count处于不可视阶段。当然这样的情况编译器在编译的过程中会直接报错了。


图2. 不可见阶段演示样例

对象处于不可达阶段是指该对象不再被不论什么强引用所持有。

与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的不论什么强引用,这样的情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。

当垃圾回收器发现该对象已经处于“不可达阶段”而且垃圾回收器已经对该对象的内存空间又一次分配做好准备时,则对象进入了“收集阶段”。假设该对象已经重写了finalize()方法,则会去运行该方法的终端操作。

这里要特别说明一下:不要重载finazlie()方法!原因有两点:

  • l  会影响JVM的对象分配与回收速度

在分配该对象时,JVM须要在垃圾回收器上注冊该对象,以便在回收时可以运行该重载方法;在该方法的运行时须要消耗CPU时间且在运行完该方法后才会又一次运行回收操作,即至少须要垃圾回收器对该对象运行两次GC。

  • l  可能造成该对象的再次“复活”

在finalize()方法中,假设有其他的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又又一次变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用兴许的代码管理。

当对象运行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。

7.对象空间又一次分配阶段

垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间又一次分配阶段”。

我要回帖

更多关于 软件项目的生命周期 的文章

 

随机推荐