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);
}
}
java性能调优03的更多相关文章
- Java性能调优笔记
Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...
- Java性能调优(一):调优的流程和程序性能分析
https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...
- Java性能调优:利用JMC分析性能
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...
- Java性能调优:利用JFR生成性能日志
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...
- 第六章 Java性能调优工具(待续)
Java性能调优工具 Windows工具 JDK命令行工具 JConsole工具 Visual VM多合一工具 Visual VM对QQL的支持 MAT内存分析工具 MAT对QQL的支持 JProfi ...
- java 性能调优和GC
JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/f ...
- Java性能调优概述
目录 Java性能调优概述 性能优化有风险和弊端,性能调优必须有明确的目标,不要为了调优而调优!!!盲目调优,风险远大于收益!!! 程序性能的主要表现点 执行速度:程序的反映是否迅速,响应时间是否足够 ...
- Java性能调优攻略全分享,5步搞定!(附超全技能图谱)
对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...
- Java性能调优实战,覆盖80%以上调优场景
Java 性能调优对于每一个奋战在开发一线的技术人来说,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 日渐复杂的系统,错综复杂的性能调优,都对Java工程师的技术广度和技术深度提出了更 ...
随机推荐
- java反射(四)--反射与简单java类
一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...
- mac 支持rz sz
安装 lrzsz brew install lrzsz 配置 iTerm2 安装完成后我们需要在 iTerm2 中使用的话,还需要一些配置 进入到 /usr/local/bin 目录下,下载两个脚本文 ...
- Centos7 安装vscode
1.官网下载vscode https://vscode.cdn.azure.cn/stable/0f3794b38477eea13fb47fbe15a42798e6129338/code-1.36.0 ...
- React-Native初识-安卓篇(一)
前言:React-Native简称RN,可以用来构建Android和IOS的应用程序,在接下来的两个半月里,我会记录下本人在学习RN开发项目中的点滴. 本篇目录: 1.React-Native初识 2 ...
- 修改TOMCAT服务的端口
1.进入tomcat配置文件的目录 [root@db200 conf]# cd /usr/local/tocat8/conf/ 2.打开配置文件 vim server.xml 找到Connector ...
- MS Word2016加载EndnoteX6插件
我的软件环境是:Win10 x64.MS Office 2016 x64.Endnote X6 32位. 在安装完MSO和Endnote后,Word中未能自动加载Endnote插件.现将启用方法记录如 ...
- 总结web开发的四大域
一.HttpSession域: 1.作用域范围: 一次会话. 数据产生后,使用后,如果还需要继续使用的情况下,HttpSession域 2.HttpSession作用: 在第一次调用request.g ...
- MySQL慢SQL语句常见诱因
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11429037.html 1. 无索引.索引失效导致慢查询 如果在一张几千万数据的表中以一个没有索引的列 ...
- 一张图告诉你js为什么要加分号
当js代码被压缩或者通过其他方式改变你的编码结构时,分号能够给编译器和解析器提供精准的语句拆分. 如图中m 和 c 的例子就能解释为什么这样做.
- 【leetcode】941. Valid Mountain Array
题目如下: Given an array A of integers, return true if and only if it is a valid mountain array. Recall ...