![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
高性能编程
weixin_43871142
这个作者很懒,什么都没留下…
展开
-
3.2.5 线上问题归纳、定位及处理
线上问题归纳总的来说基本线上问题分为五类:处理慢导致的问题线程过多导致的问题个别线程占用资源过多活锁死锁线上问题定位基本流程看日志log。若日志中没有发现异常。top看CPU、内存情况。jcmd查看运行的java程序。jstack pid > a.log 把线程情况存入a.log文件中。vi a.log 进入文件shift + :搜索自己类的路径,查看是哪个...原创 2020-03-10 19:41:04 · 518 阅读 · 0 评论 -
3.2.4 内存爆炸、CPU 100%问题分析、定位、解决
问题定位:若有不明白之处建议先看下前面的博客预防(让JVM更好的运作):内存相关参数:堆的最大值Xmax和最小值Xmin 4核8G的服务器一般设置堆大小为4G,目的在于给系统资源预留空间,例如使用jamp、jstat、jstack命令需要一定的系统资源,防止系统卡死无法排查问题。GC相关参数:前台应用(使用操作的程序):使用CMS + ParNewGC其他应用:不显式调整,使用默...原创 2020-03-10 13:13:00 · 601 阅读 · 0 评论 -
2.3.2 netty在网易内部的优化
1. handle创建在外部,所有的请求使用一个对象。需要在该handle对象上部添加一个@ChannelHandler.Sharable,让Netty知道这是一个共享对象。但要注意在netty中handle复用的话,那么里面不能有共享的数据,会产生线程安全问题。2. 在网络速度有余力的情况下将Netty发送缓冲区和接收缓冲区调大。ServerBootStrap b = new Serve...原创 2020-03-09 23:02:35 · 128 阅读 · 0 评论 -
2.3.1 推送系统功能实现及系统优化
推送系统设计若自定义网络协议会遇到的问题在推送系统设计中,为了避免频繁创建连接/释放连接带来的性能损耗,以及消息获取的实时性,采用长连接的形式。但要注意会有粘包和拆包存在,其原因就在于客户端和服务端都有一个缓冲区。使用WebSocket简单的推送系统代码 – Serverpublic final class WebSocketServer { static int PO...原创 2020-03-09 22:43:35 · 324 阅读 · 0 评论 -
3.2.3 Tomcat参数调优
说在前面,性能最重要的还是代码质量,参数调优只能说是最后的锦上添花参数调优Tomcat调优过程记录1、 测试环境准备jmeter地址: https://jmeter.apache.org/download_jmeter.cgi下载地址:http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apachejmeter 5...原创 2020-03-08 17:44:52 · 152 阅读 · 0 评论 -
3.2.2 Tomcat网络处理线程模型
BIO + 同步ServletAPR + 异步ServeltNIO + 异步ServletNIO 处理流程原创 2020-03-03 21:46:58 · 166 阅读 · 0 评论 -
3.2.1 JVM参数及调优
调优基本概念在调整性能时,JVM有三个组件:堆大小调整垃圾收集器调整JIT编译器大多数调优选项都与调整堆大小和为您的情况选择最合适的垃圾收集器有关。JIT编译器对性能也有很大影响,但很少需要使用较新版本的JVM进行调优。通常,在调优Java应用程序时,重点是以下两个主要目标之一:响应性:应用程序或系统对请求的数据进行响应的速度,对于专注于响应性的应用程序,长的暂停时间是不可接受...原创 2020-03-03 20:31:08 · 219 阅读 · 0 评论 -
3.1.3 JDK内置命令工具
JDK内置命令工具JDK提供了很多强大的工具可以让我们去查看JVM的信息,以及监控JVM的相关内容。JDK内置工具 - javapJDK内置工具 - jpsJDK内置工具 - jstatJDK内置工具 - jcmdJDK内置工具 - jinfoJDK内置工具 - jhatJDK内置工具 - jmapJDK内置工具 - jstackJDK内置工具 - jcon...原创 2020-03-03 16:44:10 · 250 阅读 · 0 评论 -
3.1.2 垃圾回收机制
自动垃圾回收自动垃圾收集是查看堆内存,识别正在使用哪些对象以及哪些对象未被删除以及删除未使用对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象,因此可以回收未引用对象使用的内存。像C这样的编程语言中,分配和释放内存是一个手动过程。在Java中,解除分配内存的过程由垃圾收集器自动处理。如何确定内存需要被...原创 2020-03-03 11:56:17 · 1575 阅读 · 0 评论 -
3.1.1 类加载机制
运行时的数据区类生命周期类加载器验证问题查看类对应的加载器JVM如何知道我们的类在何方类不会重复加载类的卸载双亲委派模型查看类对应的加载器public class ClassLoaderView { public static void main(String[] args) throws ClassNotFoundException { S...原创 2020-03-03 09:59:16 · 184 阅读 · 0 评论 -
2.2.3 零拷贝机制
Netty自己的ByteBufByteBuf是为解决ByteBuffer 的问题和满足网络应用程序开发人员的日常需求而设计的。JDK ByteBuffer 的缺点:无法动态扩容长度是固定的,不能动态扩展和收缩,当数据大于ByteBuffer容量时,会发生索引越界异常。API使用复杂读写的时候需要手动调用flip()和rewind()等方法,使用时需要非常谨慎的使用这些api,否则...原创 2020-03-01 20:02:06 · 198 阅读 · 0 评论 -
2.2.2 责任链设计模式
设计模式-责任链模式责任链模式为请求创建了一个处理对象的链。发起请求和具体处理请求的过程进行解耦:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求传递。实现责任链模式责任链模式简单Demo// -----链表形式调用------netty就是类似的这种形式public class PipelineDemo { /** ...原创 2020-02-27 21:47:44 · 245 阅读 · 0 评论 -
2.2.1 Netty线程模型
Netty简介Netty是一个高性能、高可扩展性的异步事件驱动的网络应用程序框架,它极大地简化了TCP和UDP客户端和服务器开发等网络编程。Netty重要的四个内容:Reactor线程模型:一种高性能的多线程程序设计思路Netty中自己定义的Channel概念:增强版的通道概念ChannelPipeline职责链设计模式:事件处理机制内存管理:增强的ByteBuf缓冲区Netty...原创 2020-02-27 17:08:06 · 813 阅读 · 0 评论 -
2.1.3 NIO非阻塞网络编程三大理念
Java NIO始于Java 1.4,提供了新的Java IO操作非阻塞APi。用意是替代Java IO 和 Java Networking相关的API。NIO中有三个核心组件:Buffer缓冲区Channel通道Selector选择器Buffer缓冲区缓冲区本质上是一个可以写入数据的内存块(类似数组),然后可以再次读取。此内存块包含在NIO Buffer对象中,该对象提供了一...原创 2020-02-16 20:33:54 · 342 阅读 · 0 评论 -
2.1.2 BIO阻塞式网络编程
BIO - 阻塞IO的含义阻塞(blocking) IO: 资源不可用时,IO请求一直阻塞,直到反馈结果(有数据或超时)。非阻塞(non-blocking) IO: 资源不可用时,IO请求离开返回,返回数据标识资源不可用。同步(synchronous) IO: 应用阻塞在发送或接收数据的状态,直到数据成功传输或返回失败。异步(asynchronous) IO: 应用发送或接收数据后...原创 2020-02-16 11:23:10 · 268 阅读 · 0 评论 -
2.1.1 TCP/UDP协议
OSI网络七层模型分成七层的目的就是为了让每一层的开发人员或者说系统设计硬件也好软件也好不需要去关心整个网络层次各层的主要功能物理层:物理设备之间如何传递数据,比较原始的数据电信号或者光信号怎么在电线或者光纤进行通信。数据链路层:通过检验、确认和反馈重发等手段,形成稳定的数据链路。物理层和数据链路层是通过软硬结合地解决两个端点间的通信,而网络是多节点形成的,网络层提供了互联网多节点之...原创 2020-02-15 15:05:01 · 379 阅读 · 0 评论 -
1.3.2 并发编程Map
HashMapHashMap1.数据要存储// table就是HashMap实际存储数组的地方 transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;2.数组的插入和查找 public V put(K key, V value) { // 当插入第一个元素的时候,需要先初始化...原创 2020-02-15 12:34:03 · 210 阅读 · 0 评论 -
1.1.5 线程通信
通信的方式要想实现多个线程之间的协同,如:线程执行先后顺序、获取某个线程执行的结果等等。涉及到线程之间相互通信,分为下面四类:文件共享网络共享共享变量jdk提供的线程协调API细分为: suspend/resume、wait/notify、park/unpark文件共享流程: 线程-1 写入数据到文件系统 线程-2从其中读取数据。public class De...原创 2020-02-15 08:58:42 · 389 阅读 · 0 评论 -
1.1.3 线程中止
不正确的线程中止–StopStop: 中止线程,并且清除监控锁的信息,但是可能导致线程安全问题,JDK不建议使用。Destroy: JDK未实现该方法。public class Demo3 { public static void main(String[] args) { StopThread thread = new StopThread(); ...原创 2020-02-15 08:57:45 · 374 阅读 · 0 评论 -
1.1.2 线程状态
6个状态的定义:java.lang.Thread.StateNew: 尚未启动的线程的线程状态。Runnable: 可运行线程的线程状态,等待CPU的调度。Blocked: 线程阻塞等待监视器锁定的线程状态。Waiting: 等待线程的线程状态。下列不带超时的方式:Object.waiting、Thread.join、LockSupport.portTimed Wa...原创 2020-02-15 08:56:55 · 356 阅读 · 0 评论 -
1.3.1.2 信号量和栅栏和倒计数器
Semaphore又称“信号量”,控制多个线程争抢许可。acquire: 获取一个许可,如果没有就等待。release: 释放一个许可。availablePermits: 方法得到可用的许可数目。典型场景: 代码并发处理限流。hystrix// 信号量机制public class SemaphoreDemo { public static void main(String[]...原创 2020-02-14 21:27:54 · 277 阅读 · 0 评论 -
1.3.1 AQS抽象队列同步器详解
什么是AQSAQS(AbstractQueuedSynchronizer),AQS是JDK下提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架。这个抽象类被设计为作为一些可用原子int值来表示状态的同步器的基类。如果你有看过类似 CountDownLatch 类的源码实现,会发现其内部有一个继承了 AbstractQueuedSynchronizer 的内部类 Sync ...原创 2020-02-14 19:17:20 · 331 阅读 · 0 评论 -
1.2.4 Lock锁接口实现 -- ReentrantLock和ReadWriteLock
Lock的核心API方法描述lock获取锁的方法,若锁被其他线程获取,则等待(阻塞)lockInterruptibly在锁的获取过程中可以中断当前线程tryLock尝试非阻塞地获取锁,立即返回unlock释放锁提示:根据Lock接口的源码注释,Lock接口的实现,具备和同步关键字同样的内存语言。首先我们根据方法的内容自己来实现一个简单的Loc...原创 2020-02-14 16:29:17 · 254 阅读 · 0 评论 -
1.2.3 Java锁相关 - synchronized详解
Java中锁的概念自旋锁:为了不放弃CPU执行事件,循环的使用CAS技术对数据尝试进行更新,直至成功。悲观锁:假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁。乐观锁:假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读最新数据,修改后重试修改。独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁。(单写)共享锁(读):给资源加上读锁后只能读不能...原创 2020-02-14 14:59:39 · 241 阅读 · 0 评论 -
1.1.7 线程池原理
为什么要用线程池线程不是越多越好?线程在Java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+销毁时间> 执行任务时间就很不合算。Java对象占有堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程越多,会消耗很多的内存。操作系统需要频繁切换线程上下文(大家都想被运行),影响性能。...原创 2020-02-14 10:38:33 · 491 阅读 · 0 评论 -
1.2.1 线程安全之可见性问题
多线程中的问题所见非所得无法内眼去检查程序的准确性不同的运行平台有不同的表现错误很难重现工作内存缓存内存模型的含义内存模型描述程序的可能行为。Java编程语言内存模型通过检查执行跟踪中的每个读操作,并根据某些规则检查该读操作观察到的写操作是否有效来工作。只要程序的所有执行产生的结果都可以由内存模型预测。具体的实现者任意实现,包括操作的重新排序和删除不必要的同步。内存模型决...原创 2020-02-14 10:19:20 · 1392 阅读 · 0 评论 -
1.1.6 线程封闭之ThreadLocal和栈封闭
线程封闭概念多线程访问共享可变数据时,涉及到线程间数据同步的问题。并不是所有时候,都要用到共享数据,所以线程封闭概念就提出来了。数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的技术称为线程封闭。线程封闭具体的体现有:ThreadLocal、局部变量。ThreadLocalThreadLocal是Java里一种特殊的变量。它是一个线程级别变量,每个线...原创 2020-02-14 10:17:39 · 283 阅读 · 0 评论 -
1.1.4 CPU缓存和内存屏障
CPU缓存由于CPU的运算速度高出CPU和内存之间的数据传输速度一个级别,CPU厂商为了尽可能的利用CPU的性能,在CPU和内存之间添加了高速缓存,尽可能地避免处理器访问主内存的时间开销。分三级缓存:L1 cache , L2 cache , L3 cache。其中L1 cache 和 L2 cache是每个CPU核心都拥有的,而L3 cache 是所有的CPU所共享的。并且L1 L2 L...原创 2020-02-14 10:15:27 · 255 阅读 · 0 评论 -
1.1.1 Java程序运行原理的分析
首先需要了解JVM运行时数据区,里面分线程共享区域:所有线程能访问这块内存数据,随虚拟机或GC而创建或销毁。方法区:JVM用来存储加载的类信息、静态变量、常量和编译后的代码等数据,虚拟机规范中这是一个逻辑区划,具体的实现根据不同的虚拟机来实现。堆内存:还可以细分为新生代、老年代,JVM启动时创建,存放对象的实例。垃圾回收器主要就是管理堆内存,如果堆内存满了,就会出现一个OutO...原创 2020-02-14 10:11:51 · 276 阅读 · 0 评论