CMS 和 G1
CMS将整个堆分成了新生代、老年代两大部分,新生代分为Eden和Survivor,新的对象通常情况下都在Eden区域创建,收集一次以后如果对象还在则会转移到Survivor区域,收集多次达到一定次数对象还在的话就会转移到老年代。分代收集是为了更好地管理和回收对象,因为每个代对对象管理的方法不一样。
G1使用非连续空间,所以它能够管理更大的堆,同时能够并发完成大部分GC的工作,这期间不会发生STW;G1管理的每个区域都称之为region,它的固定大小通常为2m。
热加载:后台线程定期检测类的变化,如果有变化,就重新加载类,不会清空session;
热部署:后台线程定时检测应用的变化,如果有变化,就会清空session;
线程池:ScheduledThreadPoolExecutor,周期性执行
方法:
1 | exec.scheduleWithFixedDelay( |
ContainerBackgroundProcessor
,ContainerBase
内部类,实现Runnable
接口;
执行当前容器里的backgroundProcess()
,并且递归调用子容器的backgroundProcess()
,如果子容器的backgroundProcessorDelay大于0,表明子容器有自己的线程,所以此时就不用父类来调用;
这个方法是接口中的默认方法,所以顶层engine启动后台线程以后,它会启动顶层engine以及子engine的周期性任务。
由于ContainerBase是所有组件基类,所以其他组件都可以由自己的周期性任务。
Java I/O模型:一个进程的地址空间分为用户空间和内核空间,用户线程不能直接访问内核空间。
同步阻塞I/O:用户线程发起read调用,然后阻塞让出CPU,接着内核等待网卡数据到来,把数据从网卡拷贝到内核空间,最后把数据拷贝到用户空间,把用户线程唤醒;
同步非阻塞I/O:用户线程不断发起read调用,如果没有数据,内核就返回失败,直到数据到了内核空间。在等待数据从内核空间拷贝到用户空间这个时间里,线程还是阻塞的,等数据到了用户空间再把线程叫醒。
I/O多路复用:首先:线程发起select调用,询问内核是否准备好,等准备好,用户线程再发起read调用;多路复用是指select可以向内核查多个数据通道(Channel)的状态。
异步I/O:用户线程发起read调用的同时注册一个回调函数,内核将数据准备好后,再调用指定的回调函数完成处理。在这个过程中,用户线程一直阻没有塞。
NioEndpoint实现了多路复用。
连接器:ProtocolHandler组件+Adapter组件;
ProtocolHandler组件:
Adapter组件:
适配器模式,将传进来的Request转成ServletRequest,然后执行Service方法。
ELK是现在流行的数据采集、监控、分析系统,其本质是由三个开源组件ElasticSearch+Logstash+Kibana组成,常用于系统监控,日志分析等场景。
ElasticSearch:基于Json的分布式分析和搜索引擎,水平扩展,高可靠性,管理便捷,后面简称ES。
LogStash:动态数据收集管道,拥有可扩展的插件系统,强大的与ES的协同功能。
Kibana:以图表的形式呈现数据,具有可扩展的用户界面管理和配置Elastic Stack。
由于logstash比较重量级,所以有时候也会直接通过Beats输入到ES,但是更多的是beats+logstash的结合使用,即ES和Logstash放在同一台机器,用logstash做文本格式化,用轻量级的beat在端点采集日志传输到logstash。