当前位置: 首页 > news >正文

凉山网站建设网站建设价目

凉山网站建设,网站建设价目,网站cdn 自己做,哈尔滨建设局官网一、并发无法创建新的本机线程......问题1#xff1a;Java的中创建一个线程消耗多少内存#xff1f;每个线程有独自的栈内存#xff0c;共享堆内存问题2#xff1a;一台机器可以创建多少线程#xff1f;CPU#xff0c;内存#xff0c;操作系统#xff0c;JVM#xff0…一、并发无法创建新的本机线程......问题1Java的中创建一个线程消耗多少内存每个线程有独自的栈内存共享堆内存问题2一台机器可以创建多少线程CPU内存操作系统JVM应用服务器我们编写一段示例代码来验证下线程池与非线程池的区别//线程池和非线程池的区别public class ThreadPool { public static int times 100;//100,1000,10000 public static ArrayBlockingQueue arrayWorkQueue new ArrayBlockingQueue(1000); public static ExecutorService threadPool new ThreadPoolExecutor(5, //corePoolSize线程池中核心线程数 10, 60, TimeUnit.SECONDS, arrayWorkQueue, new ThreadPoolExecutor.DiscardOldestPolicy() ); public static void useThreadPool() { Long start System.currentTimeMillis(); for (int i 0; i times; i) { threadPool.execute(new Runnable() { public void run() { System.out.println(说点什么吧...); } }); } threadPool.shutdown(); while (true) { if (threadPool.isTerminated()) { Long end System.currentTimeMillis(); System.out.println(end - start); break; } } } public static void createNewThread() { Long start System.currentTimeMillis(); for (int i 0; i times; i) { new Thread() { public void run() { System.out.println(说点什么吧...); } }.start(); } Long end System.currentTimeMillis(); System.out.println(end - start); } public static void main(String args[]) { createNewThread(); //useThreadPool(); } }启动不同数量的线程然后比较线程池和非线程池的执行结果非线程池线程池100次16毫秒5ms的1000次90毫秒28ms10000次1329ms164ms结论不要新的Thread()采用线程池非线程池的缺点每次创建性能消耗大无序缺乏管理。容易无限制创建线程引起OOM和死机1.1 使用线程池要注意的问题避免死锁请尽量使用CAS我们编写一个乐观锁的实现示例public class CASLock { public static int money 2000; public static boolean add2(int oldm, int newm) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } if (money oldm) { money money newm; return true; } return false; } public synchronized static void add1(int newm) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } money money newm; } public static void add(int newm) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } money money newm; } public static void main(String args[]) { Thread one new Thread() { public void run() { //add(5000) while (true) { if (add2(money, 5000)) { break; } } } }; Thread two new Thread() { public void run() { //add(7000) while (true) { if (add2(money, 7000)) { break; } } } }; one.start(); two.start(); try { one.join(); two.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(money); } }使用ThreadLocal中要注意ThreadLocalMap使用ThreadLocal的弱引用作为key如果一个ThreadLocal没有外部强引用来引用它那么系统GC的时候这个ThreadLocal势必会被回收这样一来ThreadLocalMap中就会出现key为null的条目就没有办法访问这些键为null的条目的值如果当前线程再迟迟不结束的话这些键为null的条目的值就会一直存在一条强引用链线程参考 - 线程 - ThreaLocalMap - 条目 - 值永远无法回收造成内存泄漏。我们编写一个ThreadLocalMap正确使用的示例//ThreadLocal应用实例public class ThreadLocalApp { public static final ThreadLocal threadLocal new ThreadLocal(); public static void muti2() { int i[] (int[]) threadLocal.get(); i[1] i[0] * 2; threadLocal.set(i); } public static void muti3() { int i[] (int[]) threadLocal.get(); i[2] i[1] * 3; threadLocal.set(i); } public static void muti5() { int i[] (int[]) threadLocal.get(); i[3] i[2] * 5; threadLocal.set(i); } public static void main(String args[]) { for (int i 0; i 5; i) { new Thread() { public void run() { int start new Random().nextInt(10); int end[] {0, 0, 0, 0}; end[0] start; threadLocal.set(end); ThreadLocalApp.muti2(); ThreadLocalApp.muti3(); ThreadLocalApp.muti5(); //int end (int) threadLocal.get(); System.out.println(end[0] end[1] end[2] end[3]); threadLocal.remove(); } }.start(); } } }1.2 线程交互 - 线程不安全造成的问题经典的HashMap的死循环造成CPU100问题我们模拟一个HashMap的死循环的示例//HashMap死循环示例public class HashMapDeadLoop { private HashMap hash new HashMap(); public HashMapDeadLoop() { Thread t1 new Thread() { public void run() { for (int i 0; i 100000; i) { hash.put(new Integer(i), i); } System.out.println(t1 over); } }; Thread t2 new Thread() { public void run() { for (int i 0; i 100000; i) { hash.put(new Integer(i), i); } System.out.println(t2 over); } }; t1.start(); t2.start(); } public static void main(String[] args) { for (int i 0; i 1000; i) { new HashMapDeadLoop(); } System.out.println(end); } }https://coolshell.cn/articles/9606.htmlHashMap的死循环发生后我们可以在线程栈中观测到如下信息/HashMap死循环产生的线程栈Thread-281 #291 prio5 os_prio31 tid0x00007f9f5f8de000 nid0x5a37 runnable [0x0000700006349000] java.lang.Thread.State: RUNNABLE at java.util.HashMap$TreeNode.split(HashMap.java:2134) at java.util.HashMap.resize(HashMap.java:713) at java.util.HashMap.putVal(HashMap.java:662) at java.util.HashMap.put(HashMap.java:611) at com.example.demo.HashMapDeadLoop$2.run(HashMapDeadLoop.java:26)应用停滞的死锁Spring3.1的死锁问题我们模拟一个死锁的示例//死锁的示例public class DeadLock { public static Integer i1 2000; public static Integer i2 3000; public static synchronized Integer getI2() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return i2; } public static void main(String args[]) { Thread one new Thread() { public void run() { synchronized (i1) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (i2) { System.out.println(i1 i2); } } } }; one.start(); Thread two new Thread() { public void run() { synchronized (i2) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (i1) { System.out.println(i1 i2); } } } }; two.start(); } }死锁发生后我们可以在线程栈中观测到如下信息//死锁时产生堆栈Thread-1: at com.example.demo.DeadLock$2.run(DeadLock.java:47) - waiting to lock (a java.lang.Integer) - locked (a java.lang.Integer)Thread-0: at com.example.demo.DeadLock$1.run(DeadLock.java:31) - waiting to lock (a java.lang.Integer) - locked (a java.lang.Integer)Found 1 deadlock.1.3 基于洁悠神的优化示例一个计数器的优化我们分别用同步ReentrantLock的原子三种不同的方式来实现一个计数器体会其中的性能差异//示例代码public class SynchronizedTest { public static int threadNum 100; public static int loopTimes 10000000; public static void userSyn() { //线程数 Syn syn new Syn(); Thread[] threads new Thread[threadNum]; //记录运行时间 long l System.currentTimeMillis(); for (int i 0; i threadNum; i) { threads[i] new Thread(new Runnable() { Override public void run() { for (int j 0; j loopTimes; j) { //syn.increaseLock(); syn.increase(); } } }); threads[i].start(); } //等待所有线程结束 try { for (int i 0; i threadNum; i) threads[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(userSyn - syn : (System.currentTimeMillis() - l) ms); } public static void useRea() { //线程数 Syn syn new Syn(); Thread[] threads new Thread[threadNum]; //记录运行时间 long l System.currentTimeMillis(); for (int i 0; i threadNum; i) { threads[i] new Thread(new Runnable() { Override public void run() { for (int j 0; j loopTimes; j) { syn.increaseLock(); //syn.increase(); } } }); threads[i].start(); } //等待所有线程结束 try { for (int i 0; i threadNum; i) threads[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(userRea - syn : (System.currentTimeMillis() - l) ms); } public static void useAto() { //线程数 Thread[] threads new Thread[threadNum]; //记录运行时间 long l System.currentTimeMillis(); for (int i 0; i threadNum; i) { threads[i] new Thread(new Runnable() { Override public void run() { for (int j 0; j loopTimes; j) { Syn.ai.incrementAndGet(); } } }); threads[i].start(); } //等待所有线程结束 try { for (int i 0; i threadNum; i) threads[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(userAto - Syn.ai : (System.currentTimeMillis() - l) ms); } public static void main(String[] args) { SynchronizedTest.userSyn(); SynchronizedTest.useRea(); SynchronizedTest.useAto(); } } class Syn { private int count 0; public final static AtomicInteger ai new AtomicInteger(0); private Lock lock new ReentrantLock(); public synchronized void increase() { count; } public void increaseLock() { lock.lock(); count; lock.unlock(); } Override public String toString() { return String.valueOf(count); } }结论在并发量高循环次数多的情况可重入锁的效率高于同步但最终原子性能最好。二、通信2.1 数据库连接池的高效问题一定要在最后接近中连接一定要在最后发布中连接2.2 OIO / NIO / AIOOIONIOAIO类型阻塞非阻塞非阻塞使用难度简单复杂复杂可靠性差高高吞吐量低高高结论当性能有严苛要求时应该尽量采用NIO的方式进行通信。2.3 TIME_WAIT(客户端)CLOSE_WAIT(服务器)问题反应经常性的请求失败获取连接情况netstat -n | awk/ ^ tcp / { S [$ NF]} END {for(a in a)print aS [a]}TIME_WAIT表示主动关闭优化系统内核参数可。CLOSE_WAIT表示被动关闭。ESTABLISHED表示正在通信解决方案二阶段完成后强制关闭2.4 串行连接持久连接(长连接)管道化连接结论管道连接的性能最优异持久化是在串行连接的基础上减少了打开/关闭连接的时间。管道化连接使用限制HTTP客户端无法确认持久化(一般是服务器到服务器非终端使用);响应信息顺序必须与请求信息顺序一致;必须支持幂等操作才可以使用管道化连接。三、数据库操作必须要有索引(特别注意按时间查询)单条操作或批量操作注很多程序员在写代码的时候随意采用了单条操作的方式但在性能要求前提下要求采用批量操作方式。四、JVM4.1 CPU标高的一般处理步骤顶部查找出哪个进程消耗的CPU高top -H -p查找出哪个线程消耗的cpu高记录消耗CPU最高的几个线程printfx进行pid的进制转换jstack记录进程的堆栈信息找出消耗CPU最高的线程信息4.2 内存标高(OOM)一般处理步骤jstat命令查看FGC发生的次数和消耗的时间次数越多耗时越长说明存在问题;连续查看jmap -heap查看老生代的占用情况变化越大说明程序存在问题;使用连续的jmap -histolive命令导出文件比对加载对象的差异差异部分一般是发生问题的地方。4.3 GC引起的单核标高单个CPU占用率高首先从GC查起。4.4 常见SY标高线程上下文e月刊频繁线程太多锁竞争激烈4.5 爱荷华州标高如果IO的CPU占用很高排查涉及到IO的程序比如把OIO改造成NIO。4.6 抖动问题原因字节码转为机器码需要占用CPU时间片大量的CPU在执行字节码时导致CPU长期处于高位;现象“C2 CompilerThread1”守护进程“C2 CompilerThread0”守护进程CPU占用率最高;解决办法保证编译线程的CPU占比。作者梁鑫
http://www.pierceye.com/news/728184/

相关文章:

  • 自己做网站不如帮别人做运营网站开发计划怎么写
  • 飘雪影视在线观看免费完整台州网站排名优化价格
  • 网站制作要钱吗seo的培训网站哪里好
  • 图片类网站如何做优化装潢设计培训中心
  • 哪里做网站做得好宿迁网站建设sq918
  • 中企动力 网站建设那些网站是做俄罗斯鞋子
  • jsp怎么做购物网站建设营销型网站多少钱
  • 东莞网站设免费的网站程序哪里好
  • 网站主页用ps做免费网站建站有哪些
  • 锦州网站建设公司湘潭市高新建设局施工报建网站
  • 前端网站开发江阴外贸网站建设
  • 手机网站建设的整体流程seo是什么职位的简称
  • 川畅咨询 做网站多少钱注册企业邮箱要钱吗
  • 网站制作成本包含游戏咨询网站建设目标是什么
  • 江门seo网站推广做网站营销怎么去推广
  • 厦门网站建设系统深圳网站建设骏域网站建设
  • 工商网站备案查询建设新农村网站
  • 建筑网站资料排行榜移动互联网的概念是什么
  • 浙江省建设诚信系统网站网上购物哪个网站最好
  • 做网站电销和生活爱辽宁下载安装
  • 安监网站安全建设信息wordpress电影影视主题
  • 网站打不开服务器错误网站怎么设置支付
  • 做网站的宽度为多少云南省建设工程信息服务平台
  • 网站优化公司大家好桂林网络搭建
  • 做a漫画在线观看网站网站建设这个工作怎么样
  • 商城网站建设缺点培训机构退费
  • 大型网站需要什么样的团队建购物网站 教程
  • 商业设计网站推荐网站注册免费qq
  • 做微信首图的网站阿里网站建设App开发
  • .网站链接策略网页制作手机版