线程数

Linux平台下_tomcat的安装与优化

时光怂恿深爱的人放手 提交于 2020-01-15 23:26:42
一.Tomcat介绍 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。 诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过, Tomcat处理静态HTML的能力不如Apache服务器。 二.Tomcat安装 安装前准备: 在安装Tomcat之前必须先安装JDK,JDK全称是 Java Development Kit,是SUN公司免费提供的java语言的软件开发工具包,其中包含Java虚拟机(JVM),编写好的java源程序经过编译可生产java字节码,只要安装了JDK,就可以利用JVM解释这些 字节码文件,从而保证了Java的跨平台性。

1.1 Java基础

▼魔方 西西 提交于 2020-01-15 07:27:49
目录 1.1.1 Java程序运行原理分析 1.1.2线程状态 1.1.3线程中止 1.1.4内存屏障和CPU缓存 1.1.5线程通信 1.1.6线程封闭 1.1.7线程池 1.1.1 Java程序运行原理分析 1、 class文件内容 魔数 :0xCAFEBABE 版本 :JDK版本 访问标志 :类的访问修饰符(public) 常量池 当前类 超级类 接口 字段 方法 属性 2、 JVM运行时数据区 方法区 :类信息、常量、静态变量、编译后的代码 堆内存 :创建的对象、OutOfMemoryError 虚拟机栈 :多个线程 一个线程一个私有空间 一个线程执行多个方法 一个方法对应多个栈帧 栈内存默认最大是1M 为JAVA代码准备的 本地方法栈 :与虚拟机栈功能类似 为Native方法准备的 程序计数器 :当前线程字节码指令执行位置 栈帧 :局部变量表、操作数栈、动态链接、方法返回地址、附加信息 线程共享 ( 主内存 ):方法区、堆内存 线程独占 ( 工作区 ):虚拟机栈、本地方法栈、程序计数器 1.1.2线程状态 线程的 6 个状态 New :尚未启动的状态(没有调用start方法) Runnable :CPU正在执行、可运行(等待CPU调动) Blocked :线程阻塞等待锁( synchronized ) Waiting :等待( 没有等待时间 ,比如wait/join)

理解ThreadPoolExecutor线程池的corePoolSize、maximumPoolSize和poolSize

二次信任 提交于 2020-01-15 02:28:28
我们知道,受限于硬件、内存和性能,我们不可能无限制的创建任意数量的线程,因为每一台机器允许的最大线程是一个有界值。也就是说ThreadPoolExecutor管理的线程数量是有界的。线程池就是用这些有限个数的线程,去执行提交的任务。然而对于多用户、高并发的应用来说,提交的任务数量非常巨大,一定会比允许的最大线程数多很多。为了解决这个问题,必须要引入排队机制,或者是在内存中,或者是在硬盘等容量很大的存储介质中。J.U.C提供的ThreadPoolExecutor只支持任务在内存中排队,通过BlockingQueue暂存还没有来得及执行的任务。 任务的管理是一件比较容易的事,复杂的是线程的管理,这会涉及线程数量、等待/唤醒、同步/锁、线程创建和死亡等问题。ThreadPoolExecutor与线程相关的几个成员变量是:keepAliveTime、allowCoreThreadTimeOut、poolSize、corePoolSize、maximumPoolSize,它们共同负责线程的创建和销毁。 corePoolSize : 线程池的基本大小,即在没有任务需要执行的时候线程池的大小 , 并且只有在工作队列满了的情况下才会创建超出这个数量的线程 。这里需要注意的是:在刚刚创建ThreadPoolExecutor的时候,线程并不会立即启动,而是要等到有任务提交时才会启动

深入理解IIS的多线程工作机制

牧云@^-^@ 提交于 2020-01-14 19:29:18
首先让我们来看看IIS里面的这2个数字:最大并发连接数,队列长度。先说这2个数字在哪里看。 最大并发连接数:在IIS中选中一个网站,右键网站名称,在右键菜单中找到并点击【管理网站】->【高级设置】。打开对话框如下图: 队列长度:在IIS中选中【应用程序池】,在应用程序池列表中,右键你想查看的,在右键菜单中选择【高级设置】。打开如下对话框: 这两个数字表面上看是影响我们站点的并发处理能力的,但是具体是如何影响一个网站的并发处理能力的呢?要完全理解IIS的并发处理能力,除了这2个数字,实际上还有一个非常关键的数字:IIS最大并发工作线程数。 1. IIS最大并发工作线程数 在以前很长一段时间,我一直以为IIS的【最大并发连接数】就是影响IIS最大并发工作线程数。我以为将【最大并发连接数】设置为1万,那么当1万个请求同时到来的时候,IIS会开启1万个线程进行处理,如果同时到来2万个请求,由于最大并发连接数只有1万,那么剩余1万个请求就会放在队列里面,当前面的1万个线程中某个完成了请求之后,再从队列里面取一个请求。但,这个理解是完全错误的,相信很多朋友也跟我有同样的理解。 现在,首先让我们来理解什么是【IIS最大并发工作线程数】。这个数字在IIS里面是没有界面进行设置的,我以前根本就不知道有这个数字。这个数字跟操作系统相关,我的win7系统的IIS的值是10,VS2012自带的IIS

jmeter APP接口压力测试

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-14 04:58:51
第一步:获取开发文档,了解接口地址和参数名 第二步:jmeter中添加需要测试的接口 a.设计APP的接口框架: b.http请求默认值设置如下: c.接口中应需要用到sign字段,加密字符串与时间戳,所以需要自己编写加密的代码。 在eclipse中编写需要加密的代码,调试成功后,在elipse中到处jar包 将导出的jar放到Jmeter安装目录下的lib文件夹下; 因为sign字段是由:时间戳+$+key加密而成,所以我们先需要获取时间戳: 因为所有接口中的sign规则相同,所以将需要的3个字段在测试计划中添加即可 添加完成后,在jmeter中添加beanshell Sampler,导入该jar包,将需要的字符串引用该方法即可,首先定义各个字符串,将字符串拼接后引用加密的方法,加密后的字符存到sign1中,设计如下: 在接口中引用该sign1字段: d.接口的请求参数值需要从数据库中随机获取,那么设计如下: 添加JDBC Connection Configuration设置 再添加JDBC Request,首先需要将JDBC Connection Configuration中的 与jdbc Request中的 设置相同;然后将从数据库中获取需要的参数值,将所有的数据存储到result对象中, 在BeanShell中获取存储id值的对象,并随机读取 在请求参数中引用

线程池参数设置(二)

南楼画角 提交于 2020-01-13 16:58:05
在如今的多核处理器时代,多线程技术发挥着巨大的作用,尤其对于大批量处理同类型IO密集型的任务,例如全库全表查找数据时,多线程是提升速度和性能的利器。 近期发布的另一篇文章已经详细介绍了线程池的技术原理。但平时的开发工作中,我们可能更加关注的是线程池的使用,线程数设置多大啊?队列大小设置多大啊,等问题。 这篇文章主要是针对前段时间对线程池的使用过程中,总结了几点参数设置方面的建议,希望对大家有用。 使用多线程时,会面临 线程数,队列大小(corePoolSize maxPoolSize queueCapacity) 三个重要参数的大小设置问题。 我根据自己前期的工作总结发现参数设置主要考虑下面几个方面: 1. 线程池中执行的任务性质。 计算密集型的任务比较占cpu,所以一般线程数设置的大小 等于或者略微大于 cpu的核数;但IO型任务主要时间消耗在 IO等待上,cpu压力并不大,所以线程数一般设置较大,例如 多线程访问数据库,数据库有128个表,可能就直接考虑使用128个线程。 2. CPU使用率。 当线程数设置较大时,会有如下几个问题:第一,线程的初始化,切换,销毁等操作会消耗不小的cpu资源,使得cpu利用率一直维持在较高水平。第二,线程数较大时,任务会短时间迅速执行,任务的集中执行也会给cpu造成较大的压力。第三, 任务的集中支持,会让cpu的使用率呈现锯齿状

线程池的使用

99封情书 提交于 2020-01-13 01:06:33
线程池的创建(I) 我们可以通过 ThreadPoolExecutor 创建一个线程池 public ThreadPoolExecutor ( int corePoolSize , int maximumPoolSize , long keepAliveTime , TimeUnit unit , BlockingQueue < Runnable > workQueue , RejectedExecutionHandler handler ) 创建线程池时有几个核心参数需要了解下: corePoolSize :线程池的核心数量。当一个任务提交到线程池时,线程池会创建一个线程来执行任务,即使当前有空闲的线程能够执行新任务,线程池还是会创建新的线程,直到需要执行的任务数大于核心数量就不再创建 maximumPoolSize :线程池最大数量。线程池所能允许创建的最大线程数,如果队列满了,并且已创建的线程小于最大线程数,线程池还会继续创建线程 keepAliveTime :线程活动保持时间。线程池中的线程工作结束后的保持存活的时间,超过这个时间还没有任务执行,线程就会被销毁 TimeUnit : 时间单位。线程活动保持时间的时间单位 workQueue :任务队列,用于保存等待执行的任务的阻塞队列,当任务的数量大于核心数量时,就会将任务暂时保存在任务队列中,如果队列也满了且没超过最大数量

JMeter实现相对并发和绝对并发

折月煮酒 提交于 2020-01-11 20:32:46
1.相对并发是指在一个时间段内发生的事务 举例如下:在jmeter的测试计划中添加线程组,设置线程属性,2秒之内启动10个线程,其对应的相对并发为5(线程数/启动时间),在没有添加其他逻辑控制器或定时器的情况下,线程属性中设置循环次数为3次,则sampler总共执行30次(线程数*循环次数) 2.绝对并发是指在同一时刻发生的事情 jmeter又如何实现绝对并发的呢?一般采用同步定时器(Synchronizing Timer)实现绝对并发,也就是同一个时刻达到了某一集合点才发出请求。 Synchronizing Timer参数解释: Number of Simultaneous Users to Group by:集合点数,集合到对应的用户量才发送请求,要求设置的值不能大于线程数,即用户数。 Timeout in milliseconds:等待超时时间,在指定的毫秒时间内没达到集合点数将停止等待(并非终止运行),默认值为0表示无超时时间。 超时时间计算公式: 超时时间> 请求集合点数量 ** 1000 / (线程数 / 启动时间) 来源: CSDN 作者: qq_38776582 链接: https://blog.csdn.net/qq_38776582/article/details/103938502

Java进阶07-线程池

a 夏天 提交于 2020-01-11 01:33:29
线程池 定义 1. 线程池是什么? 线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担。线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory。即便没有这样的情况,大量的线程回收也会给GC带来很大的压力。 为了避免重复的创建线程,线程池的出现可以让线程进行复用。通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用。 使用 1. 线程池创建 线程池概念来源于Java中的Executor,它是一个接口,还有一个子类接口ExecutorService,一个抽象类AbstractExecutorService,真正的实现类为ThreadPoolExecutor。ThreadPoolExecutor的构造函数提供了一系列参数来配置线程池。 public ThreadPoolExecutor ( int corePoolSize , int maximumPoolSize ,

Python的麻烦的多线程

眉间皱痕 提交于 2020-01-10 14:50:21
对于python的多线程,也就是threading模块,从开始学到现在,依旧觉得麻烦,对,依旧这么感觉。时隔已久,来整理一下。 线程对象的方法: Start() 开始线程的执行 Run() 定义线程的功能的函数 Join(timeout=None) 程序挂起,直到线程结束;如果给了timeout,则最多阻塞timeout秒 getName() 返回线程的名字 setName() 设置线程的名字 isAlive() 布尔标志,表示这个线程是否还在运行 isDaemon() 返回线程的daemon标志 setDaemon(daemonic) 把线程的daemon标志设为daemonic(一定要在start()函数前调用) t.setDaemon(True) 把父线程设置为守护线程,当父进程结束时,子进程也结束。 threading类的方法: threading.enumerate() 正在运行的线程数量 两种创建多线程的方式 使用Thread()函数创建线程。 import threading import time # 多线程A def fun(i): print(str(i) + "\t" + time.strftime('%X')) for i in range(10): t = threading.Thread(target=fun, args=(i,)) t.start()