《Java程序性能优化》学习笔记 JVM和并发优化
第四章 并行程序优化
1.非阻塞同步避免了基于锁的同步的缺陷,无锁算法没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销。
CAS算法:包含3个参数CAS(v,e,n)。V表示要更新的变量,E表示预期值,N表示新值
2.JDK的java.util.concurrent.atomic包下,有一组使用无锁算法实现的原子操作类,如AtomicInteger/AtomicIntegerArray/AtomicLongArray等,
分别包装了对整数、整数数组、长整形数组等的多线程安全操作。
如:
public class AtomicTest {
public static final int MAX_THREADS=3;
public static final int TASK_COUNT=3;
public static final int TARGET_COUNT=10000;
private AtomicInteger account=new AtomicInteger(0);//无锁的原子操作数量
private int count=0;
//有锁的加法
private synchronized int add() {
return count++;
}
//有锁的操作
private synchronized int getCount() {
return count;
}
//实现有锁操作的内部类
public class SynchThread implements Runnable{
protected String name;
protected long starttime;
AtomicTest out;
public SynchThread(AtomicTest o,long starttime) {
out=o;
this.starttime=starttime;
}
@Override
public void run() {
int v=out.add();//有锁的加法
while (v<TARGET_COUNT) {
v=out.add();//达到目标值前,不停的循环
}
long endtime=System.currentTimeMillis();//系统当前时间 精确到ms
System.out.println("SynchThread spend:"+(endtime-starttime)+"ms");
}
}
//实现原子操作的内部类
public class AtomicThread implements Runnable{
protected long starttime;
public AtomicThread(long starttime){
this.starttime=starttime;
}
@Override
public void run() {
int v=account.incrementAndGet();
while(v<TARGET_COUNT){
v=account.incrementAndGet();
}
long endtime=System.currentTimeMillis();
System.out.println("AtomicThread spend:"+(endtime-starttime)+"ms");
}
}
/**
* JUnit方法测试
* @throws InterruptedException
*/
@Test
public void testAtomic() throws InterruptedException {
ExecutorService exe=Executors.newFixedThreadPool(MAX_THREADS);//初始化三个线程
long starttime=System.currentTimeMillis();
AtomicThread atomic=new AtomicThread(starttime);
for(int i=0;i<TARGET_COUNT;i++){
exe.submit(atomic);//提交三个线程开始工作
}
Thread.sleep(1000);//重新分配
}
// @Test
public void testSynch() throws InterruptedException {
ExecutorService exe=Executors.newFixedThreadPool(MAX_THREADS);
long starttime=System.currentTimeMillis();
SynchThread synch=new SynchThread(this,starttime);
for(int i=0;i<TARGET_COUNT;i++){
exe.submit(synch);
}
Thread.sleep(1000);
//检测线程池是否关闭
System.out.println(exe.isTerminated());
}
}
第五章 JVM调优
1.JVM虚拟机将其内存数据分为程序计数器、虚拟机栈,本地方法栈,Java堆,和方法去等部分。
2.Java虚拟机栈,在Java 虚拟机规范中,定义了两种异常与占空间相关,即StackOverError和OutOfMemoryError。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度,则抛出SOE,如果Java栈可以动态扩展,而在扩展栈的过程中,没有足够的内存空间来支持栈的扩展,则抛出OutOfMemoryError。
栈的大小直接决定了函数调用的可达深度。
如:
public class StackOverTest {
private int count=0;
public void recursion(){//没有出口的递归函数
count ++; //计数加一
recursion();
}
@Test
public void stest(){
try{
recursion();//递归调用
}catch(Throwable t){
//打印栈的深度
System.out.println("the depth of stack is "+count);
t.printStackTrace();
}
}
}
使用-Xss修改栈的大小后,函数调用深度明显上升。
《Java程序性能优化》学习笔记 JVM和并发优化的更多相关文章
- Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- mysql性能优化学习笔记-参数介绍及优化建议
MySQL服务器参数介绍 mysql参数介绍(客户端中执行),尽量只修改session级别的参数. 全局参数(新连接的session才会生效,原有已经连接的session不生效) set global ...
- mysql性能优化学习笔记(1)优化目的、方向及数据库准备
前言: 最近参加面试,问到了很多关于mysql的优化方面的问题,回答的不是很好,也是因为原先做的项目流量不是很大,所以对mysql优化不是太了解,所以趁着周末,恶补一下. 本文来源于慕课网sqlerc ...
- [JAVA] java程序性能优化
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- Java程序性能优化技巧
Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...
- 《Java程序性能优化:让你的Java程序更快、更稳定》
Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧
随机推荐
- spark中操作hdfs
1 获取路径 val output = new Path("hdfs://master:9000/output/"); val hdfs = org.apache.hadoop.f ...
- Appserv环境下搭建的PHP环境升级PHP版本(支持微信端口以及thinkphp)
Appserv 2.5.10 升级PHP from version 5.2 to 5.3 最近,在使用Appserv 2.5.10 中的PHP开发微信时,遇到下面错误 Fatal error C ...
- std::thread
std::shared_ptr<std::thread> m_spThread; m_spThread.reset(new std::thread(std::bind(&GameS ...
- 7、8上的cell上的一个按钮,当点击按钮时,要拿到这个cell,可以用代理,也可以用superview
/** cell上的付款按钮事件 */ - (IBAction)paymentButtonClick:(UIButton *)sender { /** * @author SongXing, 15-0 ...
- JS 下拉菜单
HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- MySQL中varchar类型在5.0.3后的变化
1.mysql varchar类型变化:mysql 5.0.3 之前: 0--255字节 varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字. MySQL 5.0.3 之 ...
- Altera的几个常用的Synthesis attributes
各厂商综合工具,对HDL综合时都定义了一些综合属性这些属性可指定a declaration,a module item,a statement, or a port connection 不同的综合方 ...
- 基础知识系列☞Abstract和Virtual→及相关知识
转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...
- 他们在军训,我在搞 OI(一)
Day 1 理论上,我现在不应该坐在电脑前打字,因为早在今天上午 6:20 全体新高一同学就坐车前往军(无)训(尽)基(炼)地(狱)了,而今天上午 6:20 我还在被窝里呢…… 没错,我旷掉了军训,然 ...
- A PHP extension for Facebook's RocksDB
A PHP extension for Facebook's RocksDB 31 commits 2 branches 0 releases 2 contributors C++ 90.5% C 8 ...