Java核心概念温习

Java核心概念温习

Posted by bluesky blog on January 28, 2016

目录



复习Java里的一些核心概念,每个点拎出来,都可以写成一本书了,起一个抛砖引玉的作用,每个知识点后面附上相关资料。

NIO

从Java1.4以后,就推出了新的I/O,和之前的比,主要有什么区别呢?

  • 非阻塞式

简单的说,之前旧的I/O,在读取数据时,程序一直在等待,等待数据读取完毕后,然后开始执行后面的操作。而非阻塞式的I/O,读取数据时,程序不用等,等数据读取完成后,通知程序,程序可以再来处理这些数据。

  • 块式读取

以前的I/O就是一次一个字节的处理数据,而现在的NIO,则一个一个数据块来处理,速度上快很多。

详细资料:http://www.ibm.com/developerworks/cn/education/java/j-nio/

RPC

RPC(Remote Procedure Call)远程过程调用,它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节。

首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息。最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

在Hadoop中,经常需要做RPC的调用,如何Namenode、Datanode之间,Jobtracker与Tasktracker之间等。

参考资料:http://yanguz123.iteye.com/blog/2013670

依赖注入

使用注入的好处是,

  • 松耦合

  • 易测性

  • 更强的内聚性

  • 更轻盈的代码

最常见的依赖注入框架就是Spring,它采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。

参考资料:

http://objccn.io/issue-11-6/

https://github.com/android-cn/blog/tree/master/java/dependency-injection

多线程

从Java1.5开始,添加了java.util.concurrent 包,能够让 Java 的并发编程变得简单轻松,在此之前,实现多线程,要么通过实现Runable接口,要么通过继承Thread类本身。这个包里主要包含了以下类:

  • Executor 具体Runnable任务的执行者
  • ExecutorService 一个线程池管理者,其实现类有多种,能把Runnable,Callable提交到池中让其调度。
  • Semaphore 一个计数信号量
  • ReentrantLock 一个可重入的互斥锁定 Lock,功能类似synchronized,但要强大的多。
  • Future 是与Runnable,Callable进行交互的接口,比如一个线程执行结束后取返回的结果等等,还提供了cancel终止线程。
  • BlockingQueue 阻塞队列。
  • CompletionService ExecutorService的扩展,可以获得线程执行结果的
  • CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
  • CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
  • Future Future 表示异步计算的结果。
  • ScheduledExecutorService 一个 ExecutorService,可安排在给定的延迟后运行或定期执行的命令。

参考资料: http://www.cnblogs.com/sarafill/archive/2011/05/18/2049461.html

GC

JVM根据运行于其中的对象的生存时间大致的分为3种。并且将这3种不同的对象分别存放在JVM从系统分配到的不同的内存空间。这种对象存放空间的管理方式叫做Generation管理方式。

  1. Young Generation:用于存放“早逝”对象(即瞬时对象)。例如:在创建对象时或者调用方法时使用的临时对象或局部变量。
  2. Tenured Generation:用于存放“驻留”对象(即较长时间被引用的对象)。往往体现为一个大型程序中的全局对象或长时间被使用的对象。
  3. Perm Generation:用于存放“永久”对象。这些对象管理着运行于JVM中的类和方法。

java命令运行时,可以将gc日志打印出来,如:输入 -verbose:gc 参数

[GC 4802K->4383K(5312K), 0.0078566 secs] //执行了Minor collections
[Full GC 4383K->4383K(5312K), 0.0385521 secs]   //执行了Major collections
[GC 5248K->4814K(8216K), 0.0121798 secs] //空间仍然不够,扩展了年轻代和年老代的空间

以第一行为例

GC 表示执行了Minor collections

4802K->4383K 表示GC执行前和执行后,堆中活动对象的大小

(5312K) 表示总的堆的大小(不算持久代,而且只算2个Survivor中的1个,即用户可用堆的大小)

0.0078566 secs 表示GC所用的时间。主要,也是首先看这个,然后再看GC/Full GC是否过于频繁。

另,Java自带的监控工具有:Jconsole 、Jmap

https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/

http://blog.csdn.net/winniepu/article/details/4829087