java性能调优03

1、java中的四种引用类型(级别由高到低为:强引用,软引用,弱引用和虚引用)

  1.1 强引用:默认创建的变量都是强引用,垃圾回收机制不会将其回收,当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止

  1.2 软引用(SoftReference):内存不足时,垃圾回收器就会回收它

  1.3 弱引用(WeakReference):只要进行垃圾回收,就会把其回收

  1.4 虚引用(PhantomReference):在任何时候都 可能被回收

//引用队列
ReferenceQueue<ReferenceObject> referenceQueue = new ReferenceQueue<ReferenceObject>();
//强引用
ReferenceObject referenceObject=new ReferenceObject("强引用");
//软引用
SoftReference<ReferenceObject> softReference=new SoftReference<ReferenceObject>(new ReferenceObject("软引用"));
//弱引用
WeakReference<ReferenceObject> weakReference=new WeakReference<ReferenceObject>(new ReferenceObject("弱引用"),referenceQueue);
//虚引用
PhantomReference<ReferenceObject> phantomReference=new PhantomReference<ReferenceObject>(new ReferenceObject("虚引用"), referenceQueue);
System.out.println("强引用:"+referenceObject);//强引用:ReferenceObject [name=强引用]
System.out.println("软引用:"+softReference.get());//软引用:ReferenceObject [name=软引用]
System.out.println("弱引用:"+weakReference.get());//弱引用:ReferenceObject [name=弱引用]
System.out.println("虚引用:"+phantomReference.get());//虚引用:null

System.gc();//虚引用被回收了  弱引用被回收了
System.out.println("========gc==========");
System.out.println("强引用:"+referenceObject);//强引用:ReferenceObject [name=强引用]
System.out.println("软引用:"+softReference.get());//软引用:ReferenceObject [name=软引用]
System.out.println("弱引用:"+weakReference.get());//弱引用:null
System.out.println("虚引用:"+phantomReference.get());//虚引用:null

System.out.println("========内存不知时gc==========");
byte[] bigByte=new byte[2015*1250*590];//软引用被回收了

2、future模式

  核心思想:通过开启子线程来代替主线程处理比较耗时的操作,子线程处理完后通知主线程来获取数据

/**
 * Data
 * @Description 请求接口
 */
public interface Data {
    String getResult();
}

/**
 * RealData
 * @Description 真实数据比较耗时
 */
public class RealData implements Data {

    private final String result;

    public RealData(String send) throws InterruptedException {
        StringBuffer buffer=new StringBuffer();
        for(int i=0;i<10;i++){
            buffer.append(send);
            Thread.sleep(100);//模拟真实数据比较耗时
        }
        result=buffer.toString();
    }

    @Override
    public String getResult() {
        return result;
    }
}
/**
 * FutureData
 * @Description 功能详细描述
 */
public class FutureData implements Data {
    private RealData realData;
    private boolean isReady=false;

    public synchronized void setRealData(RealData realData) {
        if (isReady) {
            return;
        }
        this.realData = realData;
        isReady=true;
        notifyAll();
    }

    @Override
    public synchronized String getResult(){
        while (!isReady) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return realData.getResult();
    }
}

/**
 * Client
 * @Description 客户端请求
 */
public class Client {
    public Data request(final String seed) {
        final FutureData data=new FutureData();
        new Thread(){
            @Override
            public void run() {
                try {
                    RealData realData=new RealData(seed);
                    data.setRealData(realData);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        return data;
    }
}

/**
 * Test
 * @Description future模式测试类
 */
public class Test {
    public static void main(String[] args) throws InterruptedException {
        Client client=new Client();
        Data data=client.request("北风网");
        System.out.println("请求结束");
        Thread.sleep(2000);//其他工作
        System.out.println(data.getResult());
    }
}

3、master-worker模式

  核心思想:master接受到任务后分给多个worker去执行,worker执行完后把结果返还给master,再由master将结果合并后返给请求者

/**
 * Worker
 */
public class Worker implements Runnable {
    //任务列表
    Queue<Object> taskQueue;
    //结果集
    Map<String, Object> resultMap;

    public void setTaskQueue(Queue<Object> taskQueue) {
        this.taskQueue = taskQueue;
    }

    public void setResultMap(Map<String, Object> resultMap) {
        this.resultMap = resultMap;
    }

    //worker的具体业务逻辑处理
    public Object Handle(Object input){
        return input;
    }

    @Override
    public void run() {
        while (true) {
            //获取子任务
            Object input=taskQueue.poll();
            if (input==null)break;
            Object re=Handle(input);
            resultMap.put(input.hashCode()+"", re);
        }
    }
}

/**
 * Master
 */
public class Master {
    //任务队列
    private Queue<Object> taskQueue=new ConcurrentLinkedQueue<Object>();
    //worker线程队列
    private Map<String, Thread> threadMap=new HashMap<String, Thread>();
    //子任务结果集
    private Map<String, Object> resultMap=new HashMap<String, Object>();

    //判断所有的子任务是否已经都完成
    public boolean isComplete() {
        for(Entry<String, Thread> entry:threadMap.entrySet()){
            if (entry.getValue().getState()!= Thread.State.TERMINATED) {
                return false;
            }
        }
        return true;
    }

    public Master(Worker worker,Integer workerCount){
        worker.setResultMap(resultMap);
        worker.setTaskQueue(taskQueue);
        for(int i=0;i<workerCount;i++){
            threadMap.put(i+"", new Thread(worker,i+""));
        }
    }

    public void submit(Object job) {
        taskQueue.add(job);
    }

    public Map<String, Object> getResultMap() {
        return resultMap;
    }

    public void execute() {
        for(Entry<String, Thread> entry:threadMap.entrySet()){
            entry.getValue().start();
        }
    }
}

public class PlusWorker extends Worker {
    @Override
    public Object Handle(Object input) {
        int i=(int) input;
        return i*i*i;
    }
}

/**
 * Test
 * @Description 测试master-worker模式
 */
public class Test {
    public static void main(String[] args) {
        Master master=new Master(new PlusWorker(), 5);
        for(int i=0;i<100;i++){
            master.submit(i);
        }
        master.execute();
        Map<String, Object> resultMap=master.getResultMap();
        int sum=0;
        while (resultMap.size()>0|| !master.isComplete()) {
            String key=null;
            for(String k:resultMap.keySet()){
                key=k;
                break;
            }
            if (key!=null&&resultMap.get(key)!=null) {
                sum+=(Integer)resultMap.remove(key);
            }
        }
        System.out.println(sum);
    }
}

4、guardedSuspension模式(保护暂停模式)

  核心思想:当客户端大量请求来请求服务器时,将请求放入到请求队列中,服务器按照队列顺序依次来处理客户端的请求

/**
 * Request
 * @Description 请求
 */
public class Request {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Request(String name) {
        super();
        this.name = name;
    }
    @Override
    public String toString() {
        return "Request [name=" + name + "]";
    }
}

/**
 * RequestQueue
 * @Description 请求队列
 */
public class RequestQueue {
    //请求队列
    private LinkedList<Request> queue=new LinkedList<Request>();

    //服务器获取请求
    public synchronized Request getRequest() throws InterruptedException {
        while (queue.size()==0) {
            this.wait();
        }
        return queue.remove();
    }

    //客户端添加请求
    public synchronized void addRequest(Request request) {
        queue.add(request);
        this.notifyAll();
    }
}

/**
 * ClientThread
 * @Description 客户端请求
 */
public class ClientThread extends Thread {
    private RequestQueue requestQueue;

    public ClientThread(RequestQueue requestQueue,String threadName){
        super(threadName);
        this.requestQueue=requestQueue;
    }

    @Override
    public void run() {
        for(int i=0;i<10;i++){
            Request request=new Request("当前线程"+Thread.currentThread().getName()+"请求"+i);
            requestQueue.addRequest(request);
            try {
                sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("当前线程"+Thread.currentThread().getName()+"请求结束");
    }
}

/**
 * ServerThread
 * @Description 服务器处理请求
 */
public class ServerThread extends Thread{
    //请求队列
    private RequestQueue queue;

    public ServerThread(RequestQueue queue,String threadName){
        super(threadName);
        this.queue=queue;
    }

    @Override
    public void run() {
        while (true) {
            Request request;
            try {
                request = queue.getRequest();
                System.out.println("当前线程"+Thread.currentThread().getName()+"处理请求"+request.toString());
                sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

/**
 *
 * Test
 * @Description 保护暂停模式测试
 */
public class Test {
    public static void main(String[] args) {
        RequestQueue queue=new RequestQueue();
        //服务器开启10个线程处理客户端的请求
        for(int i=0;i<10;i++){
            new ServerThread(queue, "server"+i).start();
        }

        //模拟10个客户端向服务器发起请求
        for(int i=0;i<10;i++){
            new ClientThread(queue, "client"+i).start();
        }
    }
}

5、生产者消费者模式

  核心思想:生产者把生产好的数据放入到中间缓冲区(队列中),消费者冲从中间缓冲中获取数据进行消费

  

/**
 * PcData
 * @Description 数据
 */
public class PcData {
    private final Integer data;

    public PcData(Integer data) {
        this.data = data;
    }

    public Integer getData() {
        return data;
    }

    @Override
    public String toString() {
        return "PcData [data=" + data + "]";
    }
}

/**
 * Productor
 * @Description 生产者
 */
public class Productor implements Runnable{
    /**
     * volatile 声明的变量表示是不稳定的,每次使用它时必须从主存(共享内存)中进行读取,
     *  每次修改后,强迫线程将变化后的值写回到共享内存中
     *  这样保证任何时候,两个不同线程总是看到某个变量的同一个值
     */
    private volatile boolean isRunning=true;

    //数据队列
    private BlockingQueue<PcData> blockingQueue=null;

    private static AtomicInteger count=new AtomicInteger();

    public Productor(BlockingQueue<PcData> blockingQueue){
        this.blockingQueue=blockingQueue;
    }

    public void stop(){
        this.isRunning=false;
    }

    @Override
    public void run() {
        PcData data=null;
        Random random=new Random();
        System.out.println("启动生产者:"+Thread.currentThread().getId());
        while (isRunning) {
            try {
                Thread.sleep(random.nextInt(1000));
                data=new PcData(count.incrementAndGet());
                System.out.println(data+"放入到了队列中");
                //如果空间不足等待2秒
                if (blockingQueue.offer(data, 2, TimeUnit.SECONDS)) {
                    System.out.println(data+"已经放入到了队列中");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

/**
 * Customer
 * @Description 消费者
 */
public class Customer implements Runnable {

    private BlockingQueue<PcData> blockingQueue;

    public Customer(BlockingQueue<PcData> blockingQueue){
        this.blockingQueue=blockingQueue;
    }

    @Override
    public void run() {
        System.out.println("启动消费者:"+Thread.currentThread().getId());
        Random random=new Random();
        while (true) {
            PcData data;
            try {
                data = this.blockingQueue.take();
                if (data!=null) {
                    System.out.println("消费了数据:"+data.toString());
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

/** * Test * @Description 测试生产者消费者模式 */public class Test {    public static void main(String[] args) {        //数据列表        BlockingQueue<PcData> blockingQueue=new LinkedBlockingQueue<PcData>(10);        //生产者        Productor productor01=new Productor(blockingQueue);        Productor productor02=new Productor(blockingQueue);        Productor productor03=new Productor(blockingQueue);        //消费者        Customer customer01=new Customer(blockingQueue);        Customer customer02=new Customer(blockingQueue);        Customer customer03=new Customer(blockingQueue);        //使用线程池节省开销        ExecutorService executorService=Executors.newCachedThreadPool();        executorService.execute(productor01);        executorService.execute(productor02);        executorService.execute(productor03);        executorService.execute(customer01);        executorService.execute(customer01);        executorService.execute(customer01);    }}

  

时间: 2024-10-09 14:34:43

java性能调优03的相关文章

Java性能调优_深入Java程序性能调优(并行开发、JVM调优)

深入Java程序性能调优(阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优)课程讲师:special课程分类:Java核心适合人群:初级课时数量:33课时更新程度:完成用到技术:阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优涉及项目:模式在实际开发中运用深入Java程序性能调优下载: http://pan.baidu.com/s/1ntn0ZTB 密码: ijluJava性能调优:国内关于Java性能调优的课程非常少,如此全面深入介绍Java性能调优,北风算是独家,Special讲师,

Java性能调优笔记

Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多.外部处理系统的性能不足.资源消耗不多但程序的响应速度却仍达不到要求. 资源消耗:CPU.文件IO.网络IO.内存. 外部处理系统的性能不足:所调用的其他系统提供的功能或数据库操作的响应速度不够. 资源消耗不多但程序的响应速度却仍达不到要求:程序代码运行效率不够高.未充分使用资源.程序结构不合理. C

java 性能调优工具

1.jstack 用法jstack [option] pid -l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况 -m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法) 找出进程内最耗费CPU的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid printf "%x\n" pid 得到pid的

java 性能调优和GC

JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/firecoder/article/details/7225654 JAVA GC 日志详解 http://blog.csdn.net/alivetime/article/details/6895537 JAVA 内存参数设置 http://heipark.iteye.com/blog/1356113

JAVA性能调优-在循环条件中不要使用表达式

1.JAVA性能调优-在循环条件中不要使用表达式 我们在学习JAVA性能调优的时候,经常能看到这一的一段话:在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. import java.util.vector; class cel { void method(vector vector) { for (int i= 0; i < vector.size (); i++)  //violation ; //... } } 更正:

JAVA性能调优- try/catch块和循环

1.JAVA性能调优-将try/catch块移出循环 据说把try/catch块放入循环体内,会极大的影响性能.因为使用了try/catch模块的使用,会让JAVA虚拟机做很多额外的工作.就好比对每个人说,"嗨,哥们,路上可能有蛇.于是听到的人只好手拿木棍,小心翼翼的往前走". 把try/catch块放到循环外面,就好比对一大群人说,"嗨,兄弟们,路上可能有蛇.于是听到的人安排部分人员拿木棍往前走,其他人基本不受影响" 这个理论蛮不错的,测试下对性能的实际影响 2.

推荐书籍:《Java性能调优指南》

本书作者是Java性能和Java HotSpot 虚拟机领域的佼佼者,帮助你利用现代软工实践提高性实战生涯中总结能,避免常见错误,从技巧和窍门. 利用G1克服并行.串行和CMS垃圾收集器的局限性了解G1  GC收集的各个阶段,包括年轻代和老年代在G1的引擎下微调您的应用程序确定潜在优化方案,解释实验结果,并付诸行动探索的HotSpot虚拟机内部使用热点VM服务代理分析.分流,并解决不同的热点 <Java性能调优指南>主要展示了如何在当今先进的多核硬件和复杂的操作系统环境下,系统且主动地提高Ja

java性能调优——技客时间

一.java性能调优的标准 cpu:有的应用需要大量计算,他们会长时间.不间断地占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题.例如,代码递归导致的无限循环,正则表达式引起的回溯,JVM 频繁的 FULL GC,以及多线程编程造成的大量上下文切换等,这些都有可能导致 CPU 资源繁忙. 内存:Java 程序一般通过 JVM 对内存进行分配管理,主要是用 JVM 中的堆内存来存储 Java 创建的对象.系统堆内存的读写速度非常快,所以基本不存在读写性能瓶颈.但

《Java性能调优》学习笔记(1)

性能的参考指标 执行时间 -- 从代码开始运行到结束的时间 CPU时间 -- 函数或者线程占用CPU的时间 内存分配 -- 程序在运行时占用内存的情况 磁盘吞吐量 -- 描述IO的使用情况 网络吞吐量 -- 描述网络的使用情况 响应时间 -- 系统对某用户行为或者时间做出的响应时间 性能的瓶颈资源可能有: 磁盘IO 网络操作 CPU 异常 -- 对Java应用来说,异常的补货和处理是非常消耗资源的,如果程序高频率的对异常处理会对整体性能有影响 数据库 锁竞争 -- 增加上下文切换的开销 内存 性