12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970Siege是一款高性能的Http压力测试工具。Siege支持身份验证、cookies、http、https和ftp协议。安装Siege如果要支持https,需要先下载安装openssl, 下载地址:https://github.com/openssl/openssl1.开始安装opensslgit clone https://github.com/openssl/opensslcd openssl./config --prefix=/usr/local/opensslmakemake installopenssl version2.开始安装siege下载地址:http://download.joedog.org/siege/siege-4.0.4.tar.gztar zxvf siege-4.0.4.tar.gzcd siege ...
翻译自 deepakgaikwad。如需转载本文,请先参见文章末尾处的转载要求。
许多应用程序在压力测试阶段或在生产环境中都会遇到性能问题。如果我们看一下性能问题背后的原因,会发现很多是由数据处理不当造成。数据处理在应用面对大数据量时是非常关键的。这里有一些实用的数据处理技巧可以帮助更好地提升Java应用程序性能。
减少数据传输在任何Java应用程序中,方法调用要么是为调用方完成某项任务,要么是对输入数据进行处理。这两个目标都需要在调用者和处理方法之间进行数据交换。关于最小化函数传入和输出的数据量有一个经验之谈:数据越小好处越多。比如越小的数据处理就越少,需要清理的对象越少,内存的占用也更少等等。程序设计应当努力减少不同方法、层次和应用程序之间,甚至组织之间的数据传递。通过下面将要讨论的源端数据处理可以达成这个目标。
延迟加载延迟数据加载是指直到实际需要最后一刻才从数据存储中获取数据。在面对重量级对象时这是非常有益的。例如有一个存储在数据库中的文件实体,文件包含blob以及与其他属性。blob大小可以从几KB到几十兆。中间层逻辑在显示文件内容之前都只依赖于其他属性。使用延迟加载可 ...
系统架构
未读切分是最基本,且最多变的思路之一,说基本,是因为在学习程序设计的第一天就应该知道,说多变,是因为在未来的很多年里,你会不停的应用这个方法来解决问题。不幸的是,切分这个思路并没有得到应有的重视。
大概是因为这个词比较土,说起来也比较普通,远不如并行,集群,负载平衡这些词听起来大。所以碰到一个问题的时候,往往被拿出来的解决方案会是以上3个大词之一,很少有人去认真的考虑切分问题。但事实上,这3个大词所需要的技术,其实也是建立在良好可切分的系统之上的。
最近碰到了2个项目,都是典型案例。
案例1 ,小公司,发展的不错。一台服务器眼看不够用了,于是就买了第二台,希望能做一个"负载均衡"系统。很多人大概认为负载均衡,是类似自来水一样的技术,只要打开笼头,清水就汩汩涌出。往往忘记了水龙头后面的水管和自来水公司。
一个服务器上放了很多个服务,是很难应用负载均衡这种技术的。必须先要把服务拆开,找到性能薄弱的点,对这个点进行负载均衡,才能得到比较好的效果。否则很可能用了80%的力气,但是只得到20%的结果。
案例2,某外企。之前我们给他们做过咨 ...
本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”。
第1部分 ASCII,Unicode和UTF-8 介绍1. ASCII码
我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格”SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2、非ASCII编码
英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中 ...
JDK release-wise multi-threading concepts根据JDK 1.x发行版,此初始发行版中仅提供了很少的类。具体来说,这些类/接口是:
12345java.lang.Threadjava.lang.ThreadGroupjava.lang.Runnablejava.lang.Processjava.lang.ThreadDeath
和一些异常类例如
123java.lang.IllegalMonitorStateExceptionjava.lang.IllegalStateExceptionjava.lang.IllegalThreadStateException。
它还没有几个同步的集合,例如java.util.Hashtable。
JDK 1.2和JDK 1.3没有与多线程相关的明显变化。(如果我错过任何事情,请纠正我)。
JDK 1.4中,几乎没有JVM级别更改,可以通过一次调用挂起/恢复多个线程。但是没有出现重大的API更改。
JDK 1.5是继JDK 1.x之后的第一个重要版本。它包括多个并发实用程序。Executor,se ...
1.Overview生成随机值是非常常见的任务。这就是Java提供java.util.Random类的原因。
但是,此类在多线程环境中表现不佳。
以简化的方式,在多线程环境中,Random性能不佳的原因是由于争用–假设多个线程共享同一个Random实例。
为了解决该限制,Java 在JDK 7中引入了java.util.concurrent.ThreadLocalRandom类–用于在多线程环境中生成随机数。
让我们看看ThreadLocalRandom是如何执行的以及如何在实际应用程序中使用它。
ThreadLocalRandom Over RandomThreadLocalRandom是ThreadLocal和Random类的组合,它们与当前线程隔离。因此,通过简单地避免对 Random实例的任何并发访问,它可以在多线程环境中实现更好的性能。
一个线程获得的随机数不受另一线程的影响,而java.util.Random则全局提供随机数。
另外,与Random 不同,ThreadLocalRandom不支持显式设置种子。相反,它将重写从Random继承的setSeed(long s ...
java并发教程
未读定义线程安全性出奇的棘手。快速的Google搜索会发现许多类似的“定义”:
线程安全代码是即使许多线程同时执行也可以运行的代码。如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,则它是线程安全的。并且还有更多类似的定义。
您是否不认为上述定义实际上并没有传达任何有意义的信息,甚至会增加一些混乱。尽管不能排除那样的定义,因为它们没有错。但是事实是它们没有提供任何实际帮助或观点。我们如何区分线程安全的类和不安全的类?我们什至“安全”是什么意思?
什么是线程安全的正确性?线程安全性的任何合理定义的核心是正确性的概念。因此,在了解线程安全性之前,我们应该首先了解“ correctness”。
正确性表示一个类符合其规范。
您将同意,良好的类规范将在任何给定时间具有有关类状态的所有信息,并且如果对它执行了某些操作,则它是后置条件。由于我们经常没有为类编写足够的规范,我们怎么可能知道它们是正确的?我们不能,但是一旦我们说服自己“ 代码可以工作 ” ,那也不会阻止我们继续使用它们。这种“代码置信度 ”与我们许多人接近正确性的程度差不多。
乐观地将“正确性”定义为可以识别的事物之后,我们 ...
1.Overview在没有必要的同步的情况下,编译器,运行时或处理器可能会应用各种优化。尽管这些优化在大多数情况下是有益的,但有时它们可能会引起一些细微的问题。
缓存和重新排序是在并发上下文中可能使我们感到惊讶的优化措施之一。Java和JVM提供了许多方法来控制内存顺序,而 volatile 关键字就是其中一种。
在本文中,我们将重点介绍Java语言中这个基本但经常被误解的概念-volatile关键字。首先,我们将从底层计算机体系结构的工作背景入手,然后再熟悉Java中的内存顺序。
2.共享多处理器架构处理器负责执行程序指令。因此,他们需要从RAM中检索程序指令和所需的数据。
由于CPU每秒能够执行大量指令,因此从RAM中获取数据并不是理想的选择。为了改善这种情况,处理器使用了一些技巧,例如乱序执行,分支预测,推测执行,当然还有缓存。
这是以下内存层次结构起作用的地方:
当不同的内核执行更多的指令并处理更多的数据时,它们会用更多相关的数据和指令填充其缓存。这将以提高缓存一致性挑战为代价提高整体性能。
简而言之,我们应该三思而后行一个线程更新缓存的值时会发生什么。
3.When t ...
1.Overview在本文中,我们将研究java.util.concurrent包中的两个构造:LongAdder和LongAccumulator。
两者都被创建为在多线程环境中非常高效,并且都利用非常巧妙的策略来实现无锁且仍保持线程安全。
LongAdder让我们考虑一些逻辑,该逻辑经常增加一些值,而使用AtomicLong可能会成为瓶颈。这使用了比较交换操作,在激烈的竞争中,这可能会导致大量的CPU周期浪费。
另一方面,LongAdder使用非常巧妙的技巧来减少线程之间的争用(当线程递增时)。
当我们想增加LongAdder的实例时,我们需要调用 increment() method。该实现保留了可以按需增长的一系列计数器。
因此,当更多线程正在调用 increment()时,数组将更长。数组中的每个记录都可以单独更新-减少了争用。因此,LongAdder是从多个线程递增计数器的非常有效的方法。
让我们创建LongAdder类的实例,并从多个线程中对其进行更新:
12345678910111213LongAdder counter = new LongAdder();Execu ...
markdown
未读OverviewThe basic syntax outlined in John Gruber’s original design document added many of the elements needed on a day-to-day basis, but it wasn’t enough for some people. That’s where extended syntax comes in.
Several individuals and organizations took it upon themselves to extend the basic syntax by adding additional elements like tables, code blocks, syntax highlighting, URL auto-linking, and footnotes. These elements can be enabled by using a lightweight markup language that builds upon the b ...