Java Socket网络编程(多客户端、信息共享、文件传输)

关于Java网络编程,在去年一段时间内由公司的项目需求——将http加上ssl变为https(不过后来因为性能的原因搁置了)稍有了解,但惭愧的是,那段时间并没有一个很好的整体思路来解决这个问题,导致走了很多的弯路。改完了之后也是因为不求甚解,导致干得快、忘得也快。一个很好的机会,和朋友交流过程中提起了这方面,干脆把它撸个干净,建立起一个知识网络。

对照《Java 网络编程(第四版)》。

Read More

JVM调优(四) - 分代GC详解

为什么要分代

分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。

在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。

Read More

JVM调优(三) - GC面临的问题

如何区分垃圾

上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。

所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。

上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。

Read More