《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程序更快.更稳定, 卓越网更便宜,不错的书吧
随机推荐
- json对象和json字符串有啥区别啊
json对象可以通过javascript存取属性!json对象装成json字符串经常用于前后台传输数据! 如果你在前台使用,那么Json对象可以通过xx.name来调用,如果是字符串,那么就是字符串了 ...
- c#中的23种设计模式
C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...
- apt-get常用命令
apt-get常用命令 一,什么的是apt-get 高级包装工具(英语:Advanced Packaging Tools,简称:APT)是Debian及其衍生发行版(如:ubuntu)的软件包管理器. ...
- 锋利的jQuery-4--trigger()和triggerHandler()
trigger()方法触发事件后,会执行浏览器默认操作. $("input").trigger("focus") 以上的代码不仅会执行input绑定的focus ...
- Linux创建线程
#include"stdio.h" #include"pthread.h" #include"unistd.h" ; void *creat ...
- Hello world,Hello 2014,Bye 2013
序 想要写点什么的时候发现不知道写什么了,用一句话来总结2013的话,就是2013是既熟悉又陌生的一年,熟悉是同样的开发工作,陌生是从河南到北京的环境改变,当时大学的卧谈会,谈论毕业了要做什么,想要在 ...
- 暑假热身 A. GCC
GCC编译器是一个由GNU项目维护的编译系统,它支持多种编程语言的编译.但是它并不包含数学运算符“!”.在数学中,这个符号代表阶乘.表达式n!的意思是从1到n的所有整数的乘积. 例如,4!=4*3*2 ...
- php如何将数组保存为文件的方法? 三个方法让你快速把数组保存成为文件存储
php 缓存数组形式的变量,实际上就是将 php 将数组写入到一个文本文件或者后缀名为 .php 存储起来,使用的时候直接调用这个文件.那么如何使用 php 将数组保存为文本格式的文件呢?下面分享三种 ...
- 【架构】浅谈web网站架构演变过程
浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管 ...
- Maximum Gap
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...