《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修改栈的大小后,函数调用深度明显上升。


本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/3913003.html,如需转载请自行联系原作者

相关文章
|
14天前
|
存储 Java
深入理解Java虚拟机:JVM内存模型
【4月更文挑战第30天】本文将详细解析Java虚拟机(JVM)的内存模型,包括堆、栈、方法区等部分,并探讨它们在Java程序运行过程中的作用。通过对JVM内存模型的深入理解,可以帮助我们更好地编写高效的Java代码,避免内存溢出等问题。
|
1天前
|
Java 编译器 开发者
Java并发编程中的锁优化策略
【5月更文挑战第13天】在Java并发编程中,锁是一种重要的同步机制,用于保证多线程环境下数据的一致性。然而,不当的使用锁可能会导致性能下降,甚至产生死锁等问题。本文将介绍Java中锁的优化策略,包括锁粗化、锁消除、锁降级等,帮助开发者提高程序的性能。
|
5天前
|
存储 算法 Java
深入浅出JVM(十八)之并发垃圾收集器G1
深入浅出JVM(十八)之并发垃圾收集器G1
|
5天前
|
存储 算法 Java
深入浅出JVM(十七)之并发垃圾收集器CMS
深入浅出JVM(十七)之并发垃圾收集器CMS
|
5天前
|
算法 Java
深入浅出JVM(十六)之三色标记法与并发可达性分析
深入浅出JVM(十六)之三色标记法与并发可达性分析
|
5天前
|
Java 索引
深入浅出JVM(五)之Java中方法调用
深入浅出JVM(五)之Java中方法调用
|
5天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
10 0
|
5天前
|
缓存 Java 数据库
Java并发编程中的锁优化策略
【5月更文挑战第9天】 在高负载的多线程应用中,Java并发编程的高效性至关重要。本文将探讨几种常见的锁优化技术,旨在提高Java应用程序在并发环境下的性能。我们将从基本的synchronized关键字开始,逐步深入到更高效的Lock接口实现,以及Java 6引入的java.util.concurrent包中的高级工具类。文中还会介绍读写锁(ReadWriteLock)的概念和实现原理,并通过对比分析各自的优势和适用场景,为开发者提供实用的锁优化策略。
8 0
|
6天前
|
SQL 缓存 算法
优化你的Java代码:性能调优技巧
优化你的Java代码:性能调优技巧
13 0
|
6天前
|
Java 编译器 开发者
Java并发编程中的锁优化策略
【5月更文挑战第8天】在Java并发编程中,锁是实现线程同步的关键机制。为了提高程序的性能,我们需要对锁进行优化。本文将介绍Java并发编程中的锁优化策略,包括锁粗化、锁消除、锁降级和读写锁等方法,以帮助开发者提高多线程应用的性能。