这几天感冒造成了很大的麻烦。咱现在言归正传,讲JVM的原理与调优,这一部分很基础,很容易被遗忘,现在简单的续写一下:
J2SE发展到现在经历了精益求精的过程,垃圾回收算法演变过程是这样的:从引用数法,标识清除法,复制法,标识整理法,增量收集,分代法。好,咱们现在实用的垃圾回收的最新机制就是分代法。下面我们对此算法进行比较详细的分析:
分代法把可用内存分为年轻代,年老代和持久代。
年轻代分为了两个区:一个Eden区和两个Survivor区(可以配置多个,可以增加对象在年轻代中的存在时间),首先大部分的对象都是在Eden区生成,当Eden满了之后,就会把依旧存活的对象复制到其中一个Survivor区,当这个Survivor区满了之后,就会把依旧存活的对象复制到另外一个Survivor区。这个也满了,那就得复制到年老代了。
年老代:在年轻代里经历了垃圾回收后依旧存活的对象就会被放入此处,对象生命周期比较长。
持久代:里面存放静态化,在系统启动时即被load进的Java类或者方法。持久代大小通过-XX:MaxPermSize=<N>进行设置。
垃圾回收的方式有两种:Scavenge GC和FULL GC两种。
当在Eden中申请空间失败就会出发Scavenge GC,对Eden进行GC。FULL GC:在Tenured被写满,Perm被写满,System.gc()显式调用或者上一次GC后Heap的空间分配有变化。都会调用FULL GC。
垃圾回收的类型有串行收集器,并行收集器和并发收集器,咱们现在的服务器大部分都是多核多路了。所以并发收集器是我们研究的重点。使用-XX:+UseConcMarkSweepGC打开并发收集器,并发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收线程,跟踪可达对象。在每个年老代垃圾回收周期中,在收集初期并发收集器 会对整个应用进行简短的暂停,在收集中还会再暂停一次。第二次暂停会比第一次稍长,在此过程中多个线程同时进行垃圾回收工作。
假如大家对以上内容感兴趣,我们可以细致探讨。因为这次主要讲的是兰蔻御用的运维全过程,所以我们不细致展开。
然后我们看更改后的拓扑图:
这是我们拓展的应用方案。前端是apache后端带两个tomcat,做负载均衡,apache管理所有静态内容,比如图片,js,css等等。动态的交给tomcat来打理。这方面的资料网上很多。我这儿就不累述,但是在实际应用中我发现,apache的反向代理模式的session在高并发的情况下传递有问题,尤其再没有1000G交换机的情况下,后来我应用了mod_jk的方式来解决的问题。还有一点要说的。就是Windows下用SFU来做NFS服务器,mount在linux上,图片通过mount直接写入Windows的分区,中文问题没有解决,我们不得不把linux更换成Windows。
本文转自guoli0813 51CTO博客,原文链接:http://blog.51cto.com/guoli0813/275524,如需转载请自行联系原作者