了解搜索语法 从左至右,依次是 watch star fork,下面分别说下他们的具体作用。 下图是Github中各个功能介绍: watchwatch翻译过来可以称之为观察,点击watch可以看到如下的列表。 starstar 翻译过来应该是星星,但是这个翻译没任何具体意义,这里解释为关注或者点赞更合适,当你点击 star,表示你喜欢这个项目或者通俗点,可以把他理解成朋友圈的点赞吧,表示对这个项目的支持。不过相比朋友圈的点赞,github 里面会有一个列表,专门收集了你所有 start 过的项目,点击 github 个人头像,可以看到 your star的条目,点击就可以查看你 star 过的所有项目了。如下图 fork当选择 fork,相当于你自己有了一份原项目的拷贝,当然这个拷贝只是针对当时的项目文件,如果后续原项目文件发生改变,你必须通过其他的方式去同步。一般来说,我们不需要使用 fork 这个功能,除非有一些项目,可能存在 bug 或者可以继续优化的地方,你想帮助原项目作者去完善这个项目或者单纯的想在原来项目基础上己维护一个属于自己项目(比如我 fork 的 Androi ...
hexo主题魔改备忘录 本文记录博主的魔改hexo-anzhiyu主题,以便后期的升级和维护 Hexo 博客文章统计图 本教程来自 eurkon 新建页面在 [Blogroot]\source\ 目录下新建 charts 文件夹,并在新建的 charts 文件夹下新建 index.md 文件,添加以下内容: 1234---title: 文章统计date: 2020-03-01 08:00:00--- 引入 ECharts.js页面引入1<script src="https://npm.elemecdn.com/echarts@4.9.0/dist/echarts.min.js"></script> 全局引入以 anzhiyu主题为例,可以在 [Blogroot]\_config.anzhiyu.yml 的 inject 配置项中引入 echart.js 文件 123inject: head: - <script src="https://npm.elemecdn.com/echarts@4.9.0/di ...
AnZhiYu主题中大部分标签移植于店长的hexo-butterfly-tag-plugins-plus,转载请注明来自安知鱼 按钮 btns标签语法参数配置样式预览示例源码1234{% btns 样式参数 %}{% cell 标题, 链接, 图片或者图标 %}{% cell 标题, 链接, 图片或者图标 %}{% endbtns %} 圆角样式:rounded, circle 增加文字样式:可以在容器内增加 <b>标题</b> 和 <p>描述文字</p> 布局方式:默认为自动宽度,适合视野内只有一两个的情况。 参数 含义 wide 宽一点的按钮 fill 填充布局,自动铺满至少一行,多了会换行 center 居中,按钮之间是固定间距 around 居中分散 grid2 等宽最多 2 列,屏幕变窄会适当减少列数 grid3 等宽最多 3 列,屏幕变窄会适当减少列数 grid4 等宽最多 4 列,屏幕变窄会适当减少列数 ...
提问的智慧声明许多项目在他们网站的帮助文档中链接了本指南。这很好,这正是我们想要的用途。但如果你是该项目管理员并试图创建指向本指南的超链接,请在超链接附近的显著位置注明: 本指南不提供此项目的实际支持服务! 我们已经深刻领教到缺少上述声明所带来的痛苦:我们将不停地被那些认为发布这本指南就意味着有责任解决世上所有技术问题的傻瓜苦苦纠缠。 如果你因寻求某些帮助而阅读本指南,并在离开时还觉得可以从本文作者这里得到直接帮助,那你就是我们之前说的那些傻瓜之一。别问我们问题,我们只会忽略你。我们在这本指南中想教你如何从那些真正懂得你所遇到的软件或硬件问题的人处取得协助,而 99% 的情况下那不会是我们。除非你确定本指南的作者之一刚好是你所遇到的问题领域的专家,否则请不要打扰我们,这样大家都会开心一点。 简介在黑客的世界里,当你拋出一个技术问题时,最终是否能得到有用的回答,往往取决于你所提问和追问的方式。本指南将教你如何正确地提问以获得你满意的答案。 现在开源(Open Source)软件已经相当盛行,您通常可以从其他更有经验的用户那里获得与黑客一样好的答案,这是件好事;和黑客相比,用户们往往对那些 ...
专栏汇总专栏汇总:Tomcat 源码分析专栏汇总:RabbitMQ 源码解析专栏汇总:Dubbo 源码分析专栏汇总:Zookeeper 教程专栏汇总:Swing 教程专栏汇总:C++教程教程专栏汇总:Go 语言教程专栏汇总:Lua 教程专栏汇总:Node.js 教程专栏汇总:Google GSON 教程专栏汇总:Swagger教程专栏汇总:Gradle 教程专栏汇总:Nginx 教程专栏汇总:Maven 教程专栏汇总:Ant 教程专栏汇总:JUnit 教程专栏汇总:SVN 教程专栏汇总:Git 教程专栏汇总:MySQL InnoDB 面试题专栏汇总:MySQL 拾遗专栏汇总:MySQL 教程专栏汇总:SQLite教程专栏汇总:Scala 教程专栏汇总:Groovy 教程专栏汇总:JSP教程专栏汇总:设计模式 教程专栏汇总:十大经典排序算法专栏汇总:MongoDB 教程专栏汇总:GC 性能优化专栏汇总:Memcached 教程专栏汇总:Redis 教程专栏汇总:Java 9 新特性专栏汇总:Java8 新特性专栏汇总:Java并发
在前面的文章中,我们分析了 tomcat 类加载器的相关源码,也了解了 tomcat 支持类的热加载,意味着 tomcat 要涉及类的重复卸装/装载过程,这个过程是很敏感的,一旦处理不当,可能会引起内存泄露 卸载类我们知道,class 信息存放在元数据区(1.7是 Perm 区),这一块的内存相比堆而言,只占据非常小的空间,但是如果处理不当,还是有可能会导致内存溢出。这让我回想起几年前的一个故障,线上环境启用了 tomcat 的自动 reload 功能,出现过 java.lang.OutOfMemoryError: PermGen space 问题,排查的结果是因为 tomcat 在自动重载应用的时候,没有正常卸载类,导致 Perm 区内存没能被释放而发生溢出。tomcat 会尽量避免这类问题的发生,但是不能百分之百保证不会出现,所以还是建议不要随意开启 reloadable 功能 卸载类的条件很苛刻,必须同时满足以下3点:1. 该类所有的实例已经被回收2. 加载该类的 ClassLoder 已经被回收3. 该类对应的 java.lang.Class 对象没有任何地方被引用 ...
在前面的文章中,我们分析了 tomcat 类加载器的相关源码,也了解了 tomcat 支持类的热加载,意味着 tomcat 要涉及类的重复卸装/装载过程,这个过程是很敏感的,一旦处理不当,可能会引起内存泄露 卸载类我们知道,class 信息存放在元数据区(1.7是 Perm 区),这一块的内存相比堆而言,只占据非常小的空间,但是如果处理不当,还是有可能会导致内存溢出。这让我回想起几年前的一个故障,线上环境启用了 tomcat 的自动 reload 功能,出现过 java.lang.OutOfMemoryError: PermGen space 问题,排查的结果是因为 tomcat 在自动重载应用的时候,没有正常卸载类,导致 Perm 区内存没能被释放而发生溢出。tomcat 会尽量避免这类问题的发生,但是不能百分之百保证不会出现,所以还是建议不要随意开启 reloadable 功能 卸载类的条件很苛刻,必须同时满足以下3点:1. 该类所有的实例已经被回收2. 加载该类的 ClassLoder 已经被回收3. 该类对应的 java.lang.Class 对象没有任何地方被引用 ...
在 web 开发中,我们经常会用到 Session 来保存会话信息,包括用户信息、权限信息,等等。在这篇文章中,我们将分析 tomcat 容器是如何创建 session、销毁 session,又是如何对 HttpSessionListener 进行事件通知 tomcat session 设计分析tomcat session 组件图如下所示,其中 Context 对应一个 webapp 应用,每个 webapp 有多个 HttpSessionListener, 并且每个应用的 session 是独立管理的,而 session 的创建、销毁由 Manager 组件完成,它内部维护了 N 个 Session 实例对象。在前面的文章中,我们分析了 Context 组件,它的默认实现是 StandardContext,它与 Manager 是一对一的关系,Manager 创建、销毁会话时,需要借助 StandardContext 获取 HttpSessionListener 列表并进行事件通知,而 StandardContext 的后台线程会对 Manager 进行过期 Session 的清理工 ...
前言 本文基于 spring boot 1.5.9 spring boot 支持目前主流的 servlet 容器,包括 tomcat、jetty、undertow,可以在我们的项目中方便地集成这些 servlet 容器,减少了开发、运维的工作量。而传统的应用开发,需要经过繁锁的操作步骤:安装 tomcat –> 修改 tomcat 配置 –> 部署 war 包 –> 启动 tomcat –> 运维……,这个工作量不小,尤其是集群部署、应用迁移的时候。而采用 spring boot 之后,一切变得如此简单,打包 –> java -jar –> 运维,只需要一个 jar 包便可以随意部署安装。这篇文章,将对 spring boot 集成 tomcat 的源码进行分析,探索其内部的原理 SPI在分析源码前,我们先来了解下 spring 的 SPI 机制。我们知道,jdk 为了方便应用程序进行扩展,提供了默认的 SPI 实现(ServiceLoader),dubbo 也有自己的 SPI。spring 也是如此,他为我们提供了 SpringFactories ...
前言上一篇文章中我们分析了 Service、Engine、Host、Pipeline、Valve 组件的启动逻辑,在 HostConfig 中会实例化 StandardContext,并启动 Context 容器,完成 webapp 应用程序的启动,这一块是最贴近我们开发的应用程序。在这一篇文章中,我们将要分析 tomcat 是如何解析并初始化应用程序定义的 Servlet、Filter、Listener 等 首先我们思考几个问题:1. tomcat 如何支持 servlet3.0 的注解编程,比如对 javax.servlet.annotation.WebListener 注解的支持? 如果 tomcat 利用 ClassLoader 加载 webapp 下面所有的 class,从而分析 Class 对象的注解,这样子肯定会导致很多问题,比如 MetaSpace 出现内存溢出,而且加载了很多不想干的类,我们知道 jvm 卸载 class 的条件非常苛刻,这显然是不可取的。因此,tomcat 开发了字节码解析的工具类,位于 org.apache.tomcat.util.bcel, ...
在上一篇文章中,我们分析了tomcat的初始化过程,是由Bootstrap反射调用Catalina的load方法完成tomcat的初始化,包括server.xml的解析、实例化各大组件、初始化组件等逻辑。那么tomcat又是如何启动webapp应用,又是如何加载应用程序的ServletContextListener,以及Servlet呢?我们将在这篇文章进行分析 我们先来看下整体的启动逻辑,tomcat由上往下,挨个启动各个组件: 针对如此复杂的组件关系,tomcat 又是如何将各个组件串联起来,实现统一的生命周期管控呢?在这篇文章中,我们将分析 Service、Engine、Host、Pipeline、Valve 组件的启动逻辑,进一步理解tomcat的架构设计 1、Bootstrap启动过程和初始化一样,由Bootstrap反射调用Catalina的start方法 12345public void start() throws Exception { if( catalinaDaemon==null ) init(); Method method = cata ...
Lifecycle在其他框架中也很常见,比如spring,它常用于具有生命周期的组件,由Lifecycle控制组件的初始化、启动、销毁等动作,方便应用程序获取、释放某些资源,或者是触发某些特定的事件。Tomcat也是如此,在学习整个启动流程之前,我们先行了解下Lifecycle的实现机制,便于理解整个流程。 LifecycleLifecycle接口是一个公用的接口,定义了组件生命周期的一些方法,用于启动、停止Catalina组件。它是一个非常重要的接口,组件的生命周期包括:init、start、stop、destory,以及各种事件的常量、操作LifecycleListener的API,典型的观察者模式 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071public interface Lifecycle { // --------------------- ...
Lifecycle在其他框架中也很常见,比如spring,它常用于具有生命周期的组件,由Lifecycle控制组件的初始化、启动、销毁等动作,方便应用程序获取、释放某些资源,或者是触发某些特定的事件。Tomcat也是如此,在学习整个启动流程之前,我们先行了解下Lifecycle的实现机制,便于理解整个流程。 LifecycleLifecycle接口是一个公用的接口,定义了组件生命周期的一些方法,用于启动、停止Catalina组件。它是一个非常重要的接口,组件的生命周期包括:init、start、stop、destory,以及各种事件的常量、操作LifecycleListener的API,典型的观察者模式 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071public interface Lifecycle { // --------------------- ...
总体架构tomcat的总体架构如下图所示(摘自http://blog.csdn.net/jiaomingliang/article/details/47393141) 如上图所示,tomcat由Server、Service、Engine、Connerctor、Host、Context组件组成,其中带有s的代表在一个tomcat实例上可以存在多个组件,比如Context(s),tomcat允许我们部署多个应用,每个应用对应一个Context。这些组件在tomcat的conf/server.xml文件中可以找到,对tomcat的调优需要改动该文件server.xml 123456789101112131415161718192021222324<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redi ...