几个JAVA 及WEB开发基础回顾
1 关于多线程和线程安全
- jsp/servlet默认以多线程模式运行;所以默认的jsp/servlet以及struts中的action都不是线程安全的。
- 每个客户端请求时,都会有自己的线程创建;但jsp/servlet一般只在首次被请求是实例化,之后则被多个线程共享使用,驻留在容器的线程池中。
-jsp的9个内置对象中,除application外都是线程安全的,是么?为何?
-servlet中的实例变量是非线程安全的常见起因。
-jmm: java memory model
jmm系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条
线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷
贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变
量,线程之间无法相互直接访问堆栈中的变量。
- 如何解决?应该尽量避免在servlet中使用实例变量;如果特殊场合必须使用,则采用同步synchronized的方式,或者让servlet实现singlethreadmodel接口,但后两者都会在并发请求的时候增加系统开销,降低性能;所以最好还是尽量避免。
注:如果是在spring中,还可以在配置action的bean时,显示设置action为线程安全,即设置 singleton=true ;这样每次调用都会生成新的action实例,所以并不推荐和提倡这样做。
2 java异常处理机制,以及error,exception,throwable等之间的关系
3 java集合框架:是否线程安全,是否有序,相互之间的关系,collection与collections
4 java的内存管理,gc, 内存泄露和溢出 ;栈内存,堆内存
- 溢出:主要指实际使用空间超过预先设定的空间
溢出类型:
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space
- 泄露:动态分配的堆空间内存,在使用完后因为程序缺陷没有及时消除对象的引用,导致无用对象长久驻留在堆中
泄露类型:
常发性,偶发性,一次性,隐式
end:
06-07年的时候,我对这些是相当的熟悉,甚至能准确地答出jvm在各个步骤的具体行为,甚至著名的桶模型我也理解得到位,很清晰; 但如今,我显然是不行了,一方面注意力不在这个层面,更多地关心业务领域和逻辑以及系统本身的设计等,另一方面记忆力也有限,已经装了很多别的东西了,很难把这些还记忆得非常清楚。 但反过来讲,搞技术的,任何基础都很重要,至少你保持住基础别人会觉得放心,觉得你还有潜力,就算项目做不好,多实践多努力很快就ok了;但相反基础显得“不好”,人家肯定怀疑你的能力,是不是太务虚没实力,不管你是否scjp还是sca什么的。。。!
1 楼
bluky999
2011-08-08
几个JAVA语言编程时的性能注意事项:
如果可能:
1 尽量使用final修饰class;
2 尽量使用StringBuffer代替String,避免生成太多的String对象;
3 尽量使用局部变量而不是静态或实例变量。