☕️ Java

Tomcat vs Jetty

Tomcat 适合处理少数非常繁忙的链接,当链接生命周期非常短的话 tomcat 的总体性能较高。 默认采用 BIO 处理 I/O 请求,在处理静态资源时,性能较差。 架构是基于容器设计的,进行扩展需要了解 tomcat 的整体设计结构,不易扩展。 server: tomcat: threads: min-spare: 10 # 最少的工作线程数,默认值10 max: 200 # 最多的工作线程数,默认200,决定了web容器可以同时处理多少个请求 max-connections: 8192 # 最大连接数,默认8192 accept-count: 100 # 最大等待数 server.tomcat.threads.min-spare: 设定 Tomcat 工作线程池中的最小空闲线程数,即即使这些线程没有正在处理请求,也会保持在池中待命,以便快速响应新的请求。默认值是 10。 server.tomcat.threads.max: 设定 Tomcat 工作线程池中的最大线程数,也就是 Tomcat 能够同时处理请求的最大并发数。一旦达到这个数值,新的请求就需要等待线程池中有线程释放出来。默认值是 200。 server.tomcat.max-connections: 设定 Tomcat 服务器在任何时候可以接受并保持的最大的并发连接数。超过这个数目时,新的连接请求将被拒绝或放入等待队列(如果 accept-count 设置有效的话)。默认值是 8192。 server.tomcat.accept-count: 当所有工作线程都在忙碌,并且 max-connections 已经达到上限时,还可以有多少个等待连接的请求排队。超过这个数目,新的连接请求将被服务器直接拒绝。默认值根据 Tomcat 版本不同可能有所变化,此处设置为 100。 Jetty 架构是基于 Handler 来实现的,主要的功能都可以用 Handler 来实现,扩展简单; 可以同时处理大量连接而且可以长时间保持连接,适合于 web 聊天应用; 架构简单,因此作为服务器,jetty 可以按需加载组件,减少不需要的组件,减少了服务器的内存开销,从而提高服务器性能; 默认采用 NIO 结束在处理 I/O 请求上更占优势,在处理静态资源时,性能较高。 server: jetty: acceptors: 2 # Jetty的接受器线程数 selectors: 4 # Jetty的Selector线程数(仅在NIO Connector中适用) threadPool: minThreads: 10 # Jetty线程池的最小线程数 maxThreads: 200 # Jetty线程池的最大线程数 idleTimeout: 30000 # 线程空闲超时时限(毫秒) acceptQueueSize: 100 # 接受队列大小(连接请求等待队列) # 注意:Jetty的maxConnections配置可能需要通过创建自定义JettyServerCustomizer bean来设置

更多 →

March 30, 2024

定位内存泄露

在故障定位(尤其是 out of memory )和性能分析的时候,经常会用到一些文件辅助我们排除代码问题。这些文件记录了 JVM 运行期间的内存占用、线程执行等情况,这就是常说的 dump 文件。常用的有 heap dump 和 thread dump(也叫 javacore,或 java dump)。可以这么理解:heap dump 记录内存信息的,thread dump 记录 CPU 信息。 heap dump: heap dump 文件是一个二进制文件,它保存了某一时刻 JVM 堆中对象使用情况。HeapDump 文件是指定时刻的 Java 堆栈的快照,是一种镜像文件。 什么是内存溢出 内存管理架构 JVM 根据 generation 代 来进行 GC,根据上图所示,一共被分为 young generation 年轻代、tenured generation 老年代。 比例分配 绝大多数的对象都在 young generation 被分配,也在 young generation 被收回,当 young generation 的空间被填满,GC 会进行 minor collection 次回收,速度非常快。其中,young generation 中未被回收的对象被转移到 tenured generation,当 tenured generation 被填满时,即触发 major collection FULL GC 主回收,整个应用程序都会停止下来直到回收完成。

更多 →

March 30, 2024