从Tomcat无法正常关闭讲讲Java线程关闭问题

正常情况下,会优先采用catalina.sh stop来停止Tomcat实例,这样可以让服务有机会处理完请求,并做好善后工作。 但如果通过catalina.sh stop命令无法关闭Tomcat实例,则只能kill -9了。

 

为什么在给Tomcat发出stop命令以后,Tomcat实例无法关闭?

 

可能有两种原因:

  • Tomcat的主线程没有结束(也即main函数没有执行结束);
  • Tomcat中启动的webapps有非daemon线程阻[......]

Read more

Posted in 日常文章 | Tagged , | 评论关闭

为什么Null是不好的

原文出自:http://www.javacodegeeks.com/2014/09/why-null-is-bad.html,有兴趣可以去细看,里面详细说明了Null不好的原因。

 

这里只提其中的结论及简单的原因,为什么Null是不好的?作者认为,如果是函数返回null的情况,这造成了函数功能的模糊,使用者无法清楚的知道什么情况下返回null。

 

而对于可能返回null的函数的使用者,则必须包含专门的异常处理代码,如:

Employee empl[......]

Read more

Posted in Java | Tagged | Leave a comment

Java类型擦除与bridge方法

Java语言为了提供编译时严格的类型检查和支持泛型编程引入了泛型类型,为了实现泛型,Java编译器加入类型擦除,如:

1. 将泛型类型的所有类型参数替换成限定值,如果类型参数没有限定,则替换成Object。因此生成的二进制码只包含原始类、接口和方法;

2. 如果需要插入强制类型转换以保证类型安全;

3. 在扩展带有泛型类型的基类时,生成bridge方法以维持多态性。

类型擦除确保Java程序不会为参数化的类型创建新的类,所以说,泛型是不会增加运行时开销的。

&nbs[......]

Read more

Posted in Java | Tagged | Leave a comment

Java对象的内存占用

源自:http://www.javaspecialists.eu/archive/Issue029.html,使用了这位同学的方法来测试对象的内存占用

 

Javaer经常会发现,有时候存储的数据本身占用内存不多,但是使用了Java的各种数据结构以后,内存占用却不少,特别是对象的量级比较大的情况。我曾经就用过Map来做数据统计,发现内存占用超过了自己计算出来的不少。

 

这主要是因为Java类本身需要占用内存,而Java的collections实现,里[......]

Read more

Posted in Java | Tagged | Leave a comment

Java Process超时问题处理

Java中有时候会需要调用shell来处理一些任务,但在Java7,8之前,Process并没有提供超时的接口,只有一个永久等待的waitFor。 一般情况下,这运行得很好,但是一旦脚本出现问题,Java线程就会假死,一直处于等待状态。

最近线上就遇到了这么一个问题!

调研一下,Apache的Exec开源项目中采用的处理方法是,新开一个watchdog线程来计算超时时间,watchdog线程循环等待,当等待超过设定的超时时间,则触发InterruptedException,而主线程捕[......]

Read more

Posted in Java | Tagged | Leave a comment

java.util.concurrent包之原子类(记录)

java.util.concurrent.atomic中提供的一组类,使得我们可以对几个基本数据类型、引用进行原子操作,而无需进行使用同步原语,这种锁无关的操作一方面能带来效率的提升,另一方面也避免了死锁等问题。

这些类提供的原子操作基于CAS原语实现的,CAS原语操作可以原子的比较一个内存位置的内容及一个期望值,如果两者相同,则用一个指定值替换这个内存位置中的内容,并且提供结果指示这个操作是否成功。当前的处理器基本都提供了CAS的硬件实现,只直接借助硬件指令实现CAS操作。在Java中,[......]

Read more

Posted in Java | Tagged | Leave a comment

Java单例模式实现中的双重检查锁

 

译文,原文出自:Double Checked Locking on Singleton Class in Java

 

单例类在Java开发者中应用非常普遍,但它给初级开发者带来了相当多的挑战。他们要面对的其中一个挑战便是让一个单例类保持唯一?比如说保持一个单例类在任何情况下都不会多次实例化。双重检查锁(Double Checked Locking)是一种确保整个应用的生命周期中只有一个单例类的实例的方式。正如其名字一样,在双重检查锁的实现方式中,要对一[......]

Read more

Posted in Java | Tagged | Leave a comment

基于NIO的高度可扩展服务器架构(续)

组件结构

大多数高度可扩展的Java服务器都是在反应器模式的基础上创建的。鉴于此,反应器模式的类需要通过添加额外的用于连接管理、缓冲区管理、负载平衡等的类来增强其功能。这样一个服务器的入口类是Acceptor,其整体部署如下图所示:

component

Acceptor

服务器的每个新的client端请求都会被绑定到服务端口的单一的Acceptor所接受,Acceptor是一个单线程活动类。因为Acceptor的唯一职责是处理耗时非常短的客户端连接请求,所以通常使用阻塞型I/O模型即可满足要求。Acc[......]

Read more

Posted in J2EE | Tagged | Leave a comment

基于NIO的高度可扩展服务器架构

(此为译文)

1. Content

2. Thread Architecture

3. The Reactor Pattern

4. Component Architecture

5. Acceptor

6. Dispatcher

7. Dispatcher-Level EventHandler

8. Application-Level EventHandler

9. Conclusion

 

如果你需要编写一个高度可扩[......]

Read more

Posted in Java | Tagged | Leave a comment

Java字符串切分:StringTokenizer与String.split()

每天学一点Java——字符串操作

 

首先,从功能上看:

(1) StringTokenizer只能以char作为切割符,尽管你传递了一个String的参数,但它是选择其中一个一个的char来匹配,同时StringTokenizer一次只返回一个子串;

(2) String.split,根据正则表达式进行匹配,用过的都知道它的功能更加的强大,同时split方法返回的是所有的子串数组。

一个小Tips:String对象的substring函数虽然返回的是字符[......]

Read more

Posted in Java | Tagged | Leave a comment
« Older