线程数

Java 程序员必备的一些流程图

橙三吉。 提交于 2019-11-28 23:59:26
1.spring的生命周期 2.TCP三次握手,四次挥手 3.线程池执行流程图 4.JVM内存结构 5.Java内存模型 6.springMVC执行流程图 7.JDBC执行流程 8.spring cloud组件架构 9.dubbo 调用 整理了一些Java基础流程图/架构图,做一下笔记,大家一起学习。 1.spring的生命周期 Spring作为当前Java最流行、最强大的轻量级容器框架,了解熟悉spring的生命周期非常有必要; 首先容器启动后,对bean进行初始化 按照bean的定义,注入属性 检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean,如BeanNameAware等 以上步骤,bean对象已正确构造,通过实现BeanPostProcessor接口,可以再进行一些自定义方法处理。如:postProcessBeforeInitialzation。 BeanPostProcessor的前置处理完成后,可以实现postConstruct,afterPropertiesSet,init-method等方法, 增加我们自定义的逻辑, 通过实现BeanPostProcessor接口,进行postProcessAfterInitialzation后置处理 接着Bean准备好被使用啦。 容器关闭后,如果Bean实现了DisposableBean接口

线程池核心线程数和最大线程数设置依据

帅比萌擦擦* 提交于 2019-11-28 22:18:59
根据线程数设置公式 最大线程数 就是性能最高线程数 因为此时性能已经是最高,再设置比他大的线程数反而性能变低,没有意义 估算最大流量,合理设置阻塞队列长度 核心线程数也是基于性能考虑 估算平时的流量需要的线程数,设置核心线程数 来源: https://my.oschina.net/u/3847203/blog/3099313

ThreadPoolExecutor 源码分析

*爱你&永不变心* 提交于 2019-11-28 20:25:20
public class ThreadPoolExecutor extends AbstractExecutorService { } ThreadPoolExecutor继承了AbstractExecutorService,该抽象类为线程池提供了默认实现。后面讲到线程池代码时详细说明。 构造函数 ThreadPoolExecutor有很多重载的构造函数,所有构造函数最终都调用了一个构造函数,只是有些构造函数有默认参数而已,看下最终调用的构造函数 public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null ||

JUC-ThreadPool线程池

爷,独闯天下 提交于 2019-11-28 20:18:59
一、为什么用线程池 例子:10年前单核CPU电脑,假的多线程,像马戏团小丑玩多个球,CPU需要来回切换。 现在是多核电脑,多个线程各自跑在独立的CPU上,不用切换效率高。 线程池的优势: 线程池做的工作只要是控制运行的线程数量, 处理过程中将任务放入队列 ,然后在线程创建后启动这些任务, 如果线程数量超过了最大数量,超出数量的线程排队等候 ,等其他线程执行完毕,再从队列中取出任务来执行。 它的主要特点为: 线程复用;控制最大并发数;管理线程。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。 第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会销耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 二、线程池如何使用 1 、架构说明 Java中的线程池是通过Executor框架实现的,该框架中用到了Executor,Executors,ExecutorService,ThreadPoolExecutor这几个类 2 、使用线程池的三种方法 (1)Executors.newFixedThreadPool(int) 执行长期任务性能好,创建一个线程池, 一池有N个固定的线程,有固定线程数的线程 public static

jmeter实操及性能测试基础知识整理 - 不断更新

牧云@^-^@ 提交于 2019-11-28 19:57:49
主要基于jmetet工具 有任何疑问直接留言,可以相互讨论,有大佬愿意帮小弟补充一下也欢迎,求个测试大佬师傅带 线程组菜单: 线程数:并发数量 Rame-Up时间(秒):多久跑完线程数,比如线程是10,Rame-Up时间是10秒,就是10秒内跑完10个线程,1秒一个 循环次数:让上面的线程数和Ramp-Up循环跑多少次,延长并发时间,总请求数 = 线程组*循环次数 调度器:设置测试持续时间和延迟启动时间,可以用来做负载测试,长时间运行 聚合报告结果: Label:请求菜单的名称 样本:总共请求数 平均值:平均响应时间 异常%:测试出现的错误请求数量百分比,出现错误看服务端的日志,配合开发定位原因 吞吐量:简称tps,每秒处理的请求数,服务器处理能力,越高越说明服务器处理能力好 结果分析: 点这个三角叹号,下列会显示执行日志 最大tps值:不断增加并发量,加上tps达到一定开始下降,那么最大值的时候就是系统最佳tps值 最大并发量:不断增加并发量,看相应结果,出现请求超时,就是最大的并发量 来源: https://www.cnblogs.com/beile/p/11425074.html

tomcat常用配置详解和优化方法

瘦欲@ 提交于 2019-11-28 17:28:55
tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuliu_forever/article/details/52607177 https://www.cnblogs.com/dengyungao/p/7542604.html https://www.cnblogs.com/ysocean/p/6893446.html#_label1 常用配置详解 1 目录结构 /bin:脚本文件目录。 /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载)。 /conf:存放配置文件,最重要的是server.xml。 /logs:存放日志文件。 /server/webapps:来管理Tomcat-web服务用的。仅对TOMCAT可见,对所有的WEB APP都不可见(使用Catalina类加载器加载)。 /shared/lib:仅对所有WEB APP可见,对TOMCAT不可见(使用Shared类加载器加载)。 /temp:Tomcat运行时候存放临时文件用的。 /webapps:web应用发布目录。 /work:Tomcat把各种由jsp生成的servlet文件放在这个目录下。删除后,启动时会自动创建。 2

线程池原理

你说的曾经没有我的故事 提交于 2019-11-28 14:58:52
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.acc = System.getSecurityManager() == null ? null : AccessController.getContext(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize;

jmeter常用的性能测试监听器

瘦欲@ 提交于 2019-11-28 13:17:45
概述 jmeter中提供了很多性能数据的监听器,我们通过监听器可以来分析性能瓶颈 本文以500线程的阶梯加压测试结果来描述图表。 常用监听器 1:Transactions per Second 监听动态TPS,用来分析吞吐量。其中横坐标是运行时间,纵坐标是TPS值。红色表示通过的TPS,绿色表示失败的。 最大TPS大约在140左右,从1分26秒左右,开始有未通过的事物 2:Hits per Second 动态监听单位时间的点击率,也就是触发的请求数。其中横坐标是运行时间,纵坐标是HPS值。 点击率波动较大,且不能持续上升。说明性能很不稳定 3:Response Times Over Time 监听整个事物运行期间的响应时间。其中横坐标是运行时间,纵坐标是响应时间(单位是毫秒) 响应时间在4950ms左右开始稳定下来,后续又经历一次大的波动 4:Response Times vs Threads 线程活动期间的响应时间监听。其中横坐标是活动的线程数(也就是并发数),纵坐标是响应时间(单位是毫秒) 5: Active Threads Over Time 监听单位时间内活动的线程数。其中横坐标是单位时间(单位是毫秒),纵坐标是活动线程数(也就是并发数) 6:Response Times Percentiles 监听响应时间分布的百分比。其中横坐标是请求数的百分比,纵坐标是响应时间

线程池的C++实现(一)

混江龙づ霸主 提交于 2019-11-28 12:10:11
  现代的软件一般都使用了多线程技术,在有些软件里面,一个线程被创建出来执行了仅仅一个任务,然后就被销毁了。线程的创建与销毁是需要消耗资源,这样为了执行单一任务而被创建出来的线程越多,性能也就越差。如果能意识到线程仅仅是负责指令流的执行,并重复利用同一个线程去执行多个函数,将线程的创建和销毁的次数控制在有限次内,频繁创建与摧毁线程这种不必要的开销就能够有效避免。   线程池就是这样一种将线程的创建与摧毁控制在一定次数内,并利用同一线程反复执行不同人任务的技术,当然,其中的线程数不止一条。线程池中线程的个数一般和硬件线程数量一致时(暂时不考虑当前线程和线程池以外的线程数),因为 当进程中的线程数与硬件线程数一致时能达到最佳并发 ,C++语言中,硬件线程数可以由函数std::thread::hardware_concurrency()的返回值得到,函数返回的非0即为硬件线程数。   线程池内的线程一般在初始化时一起创建,在指定退出时一起退出。其中 要执行任务的线程与外部线程通过一个线程安全的容器来实现交互,外部线程作为生产者往容器中添加任务,池中的线程作为消费者拿出线程中的任务去执行 。当容器中没有任务时,池中的线程会阻塞直到得到通知并且容器中存放了任务(阻塞的线程不会得到系统调度器的调度)。   说了这么多,来看看线程池怎么实现的吧。先来看看头文件ThreadPool.h:

Jmeter之仿真高并发测试(集合点)

我的梦境 提交于 2019-11-28 08:20:53
场景: 大家在使用Jmeter测试的时候应该发现了, (1)线程启动了就会直接发送测试请求;–如果要模拟在一瞬间高并发量测试的时候,需要调高线程数量,这很耗测试机器的性能,往往无法支持较大的并发数,无法控制每次测试的瞬间并发量; (2)如果使用了constant throughput timer,可以模拟较长时间的并发测试,但是仍无法满足稳定的瞬间高并发测试; 解决: 1、使用集合点; 作用:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力。 引用虫师的话“红军排长说:等一等!集结了所有战友后,大家再一起冲啊!这样给敌人的压力是最大的。” 操作步骤 添加集合点,在Jmeter里是synchronized timer; 面板说明及设置 (1)面板说明 1)名称:自定义名称 2)[Number of Simulated Users to Group by] Define how many simulated users trigger the release of the synchronizing block(default value of '0'means all users). 即a.每集合够多少个模拟用户(线程)后发送一次测试请求; b.如果设置为0,等同于设置为线程租中的线程数; c.确保设置的值不大于它所在线程组包含的用户数(线程数)--