Entry

初探 performance – 监控网页与程序性能

本小妞迷上赌 提交于 2020-08-09 18:55:19
使用 window.performance 提供了一组精确的数据,经过简单的计算就能得出一些网页性能数据。 配合上报一些客户端浏览器的设备类型等数据,就可以实现简单的统计啦! 额,先看下兼容性如何: http://caniuse.com/#feat=nav-timing 这篇文章中 Demo 的运行环境为最新的 Chrome 的控制台,如果你用的是其他浏览器,自查兼容性哈~ 先来看看在 Chrome 浏览器控制台中执行 window.performance 会出现什么: 简单解释下 performance 中的属性: 先看下一个请求发出的整个过程中,各种环节的时间顺序: // 获取 performance 数据 var performance = { // memory 是非标准属性,只在 Chrome 有 // 财富问题:我有多少内存 memory: { usedJSHeapSize: 16100000, // JS 对象(包括V8引擎内部对象)占用的内存,一定小于 totalJSHeapSize totalJSHeapSize: 35100000, // 可使用的内存 jsHeapSizeLimit: 793000000 // 内存大小限制 }, // 哲学问题:我从哪里来? navigation: { redirectCount: 0, // 如果有重定向的话

Linux时钟实现和管理(Linux Kernel development 3rd)

删除回忆录丶 提交于 2020-08-09 17:34:14
简介 时间间隔 这个概念在内核中非常重要。大量多的延时函数都是依赖于时间。 周期性函数 进程调度 屏幕刷新 延时硬盘读写 系统从开机到现在运行了多久 当前的日期 上面列举的都是用到周期的 过去了多久,时间在系统中该怎么衡量核心问题。 相对时间 从某一刻起后多久开始做某事。 五秒后发射就是相对于现在一段时间。 绝对时间 日期,经历了多久,往往是一个大的时间。 周期任务和延迟任务 周期任务 依赖于系统时钟,系统时钟是一个可编程硬件。每隔固定时间就发起中断。 内核知道每秒多少次中断,根据间隔和中断次数,可以用来衡量时间。 系统时钟是核心 这是一个硬件。 一个可编程硬件,即可以配置,可以有内核控制。 用来计量时间流逝。 隔一段时间发起一次中断,中断捕获就更新时间。然后执行对应的函数。 延迟任务 一般是事件,时间发生多久后执行某个响应函数。 主要依赖于动态定时器 动态定时器 从开始计时的那一刻开始,多久后执行某个任务。 这也是后面的主讲。 案例 软盘驱动在一定时间得不到响应就关闭。 时间衡量 依赖硬件 系统时钟 时钟频率 可配置 转换 1s = 时钟周期 * 时钟频率 时钟周期 = 1s / 时钟频率 总的时间 = 时钟周期 * 次数 根据换算方程可以看到时钟周期和过去时间 动态定时器 定时器 用来倒计时的,倒计时多久执行某个任务。 这个也是主要的核心中的核心。 内核管理和衡量时间 衡量时间

《Erlang程序设计》 第十二章 接口技术

微笑、不失礼 提交于 2020-08-09 17:29:46
第十二章 接口技术 Table of Contents 第十二章 接口技术 12.1 端口 创建端口 发送数据 改变连接进程的PID 关闭端口 为一个外部C程序添加接口 12.2.1 C程序 12.2.2 Erlang程序 12.3 open_port PortName Opt 12.4 内联驱动 12.5 注意 第十二章 接口技术 Erlang运行第三方代码时需要一个与Erlang运行时系统相互独立的外部程序, 两者通过二进制通道进行通信。在Erlang中是通过端口连接进程来作为中间人管理两者之间的通信。 12.1 端口 创建端口 Port = open_port(PortName, PortSettings) 发送数据 Port ! {PidC, {command, Data}} 改变连接进程的PID Port ! {PidC, connect, Pid1} 关闭端口 Port ! {PidC, close} 为一个外部C程序添加接口 为Erlang与C的程序调用实现一个通信协议: 数据包前两个字节表示数据的长度Len, 之后跟上长度为Len的数据 调用第一个函数twice(需要一个参数x), 则数据格式为[1, N]; 调用第二个函数sum(需要两个参数x, y),则数据格式为[2, M, N] 返回值规定为一个字节 12.2.1 C程序 example1.c

rabbitmq生产者重发机制

微笑、不失礼 提交于 2020-08-09 16:35:23
欢迎访问我的个人博客 http://home.znfang.ml 说明 重发机制是在mq中很重要的一部分,消费者可以通过ack或者nack就可以很轻松实现消息重新入队列,然后进行重发,但是生产者也有可能在网络动荡的情况下,投递不成功,这个时候就需要消息重发。虽然rabbitmq提供了事务功能,但是如果开启事务,就太影响性能了。本文参考 littersmall的博文 ,利用spring-boot的定时功能,在本地缓存,从而实现对失败的消息进行重发。完整的项目代码请参考本人 spring-boot练习代码 实现过程 pom依赖 在pom文件中引入rabbitmq依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> yaml文件 在yaml文件中添加以下配置,一定要开启手动确认和手动返回 spring: rabbitmq: host: localhost port: 5672 username: guest password: guest publisher-confirms: true publisher-returns: true msgWithTime 为了进行消息重发,需要重新定义一个结构

Netty网络编程实战

流过昼夜 提交于 2020-08-09 14:51:52
前言 一个完整的Http请求包括客户端(常常为浏览器)请求和服务器响应两大部分,那么你清楚在这个过程中底层都做了哪些事情吗?又如HTTP请求的短连接和长连接底层的区别是什么?再如何基于Netty定制开发符合特定业务场景的HTTP监听器 ... 等等这些问题都是今天我们要解决的问题。 HTTP请求 一次完整的HTTP请求需要经历以下过程: 其中在HTTP1.1及以上版本,开启keep-alive, 步骤1和步骤7只做一次。 步骤2和步骤3中请求的报文结构如下: 步骤4~步骤6的响应报文结构如下: HTTP短连接和长连接 短链接执行流程 HTTP 是无状态的,浏览器和服务器每进行一次 HTTP 操作,就建立一次连接, 但任务结束就中断连接。 长连接执行流程 注: 使用http1.0开启keep-alived或http1.1 时,虽保持了TCP的长连接(默认300s), http请求的信息和状态是不会保存的,客户端仍然需使用额外的手段缓存这些信息如:Session,Cookie等;未改变http请求单向和无状态的特性; 可能的使用场景 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个 TCP 连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话 那么处理速度会降低很多,所以每个操作完后都不断开,处理时直接发送数据包 就 OK 了,不用建立 TCP 连接。

java动态代理——字段和方法字节码的基础结构及Proxy源码分析三

二次信任 提交于 2020-08-09 13:32:10
前文地址: https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 接上文,我们对class字节的结构有了一个整体的了解,并对Proxy的代码做了相应的解析,本文将继续详细看看字段和方法的结构 我们还是回到方法的入口 ProxyGenerator var3 = new ProxyGenerator(var0, var1, var2); final byte [] var4 = var3.generateClassFile(); 进入generateClassFile()方法 第一部分,Object方法的预处理 this .addProxyMethod(hashCodeMethod, Object. class ); this .addProxyMethod(equalsMethod, Object. class ); this .addProxyMethod(toStringMethod, Object. class ); 首先无论是什么类,都是继承自Object的,因此Object中的方法是一定需要的 注意,这里addProxyMethod并非直接写字节码了

java中强软弱虚引用的妙用

时光怂恿深爱的人放手 提交于 2020-08-09 12:53:48
前言 ThreadLocal 在什么情况下可能发生内存泄漏?如果你想清楚这个问题的来龙去脉,看源码是必不可少的,看了源码之后你发现,实际 ThreadLocal 中实际用到 static class Entry extends WeakReference<ThreadLocal<?>> {} ,谜底实际就是使用了弱引用 WeakReference 。 本文内容概要 强引用:Object o = new Object() 软引用:new SoftReference(o); 弱引用:new WeakReference(o); 虚引用:new PhantomReference(o); ThreadLocal 的使用,及使用不当发生内存泄漏的原因 Jdk 1.2 增加了抽象类 Reference 和 SoftReference 、 WeakReference 、 PhantomReference ,扩展了引用类型分类,达到对内存更细粒度的控制。 比如我们的缓存数据,当内存不够用的时候,我希望缓存可以释放内存,或者将缓存存入到堆外等。 但我们怎么区分哪些对象需要回收(垃圾回收算法,可达性分析),回收的时候可以让我们拿到回收的通知,所以 JDK 1.2 带来这几个引用类型。 引用类型 什么时候回收 强引用 强引用的对象,只要 GC root 可达,不会被回收,内存不够用了,会抛出 oom

JDK7和JDK8中HashMap的实现

∥☆過路亽.° 提交于 2020-08-09 12:47:27
JDK1.7和JDK1.8中HashMap的实现: HashMap在JDK1.7 之中是使用的 数组 + 链表 的方式来实现数据的存储 ,当发生Hash值冲突时则在对应节点以链表的形式存储。 JDK1.7中的HashMap HashMap的底层维护着一个数组,数组中的每一个项都是一个Entry(这个Entry其实就是一个键值对) Transient Entry<K,V> [] table; 我们向HashMap中存放的对象实际上是存储在该数组中。而Map中的key,value则是以Entry的形式存放在数组中。 static class Entry<K,V> implements Map.Entry<K,V>{ final K key; //一个键只能具有一个值,后面的值会被最新的值覆盖 V value; //value可以被覆盖 Entry<K,V> next; //链表数组 对应数组位置的链表,如果Hash值相同则以链表形式存储 int hash; //哈希函数 } 总结map.put后的过程: 当向 HashMap中 put一对键值对 时,它会 根据 key的HashCode值计算出一个位置 ,该位置就是此对象在数组中存放的位置。 如果该位置没有对象存在,则直接将该对象放进数组中;如果有对象,则顺着该对象的链表一直找(有对象进行寻找的作用是在于 Map不允许键值对重复)

什么是HashMap(转载:程序员小灰)

旧巷老猫 提交于 2020-08-09 12:16:25
———————————— 众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。 HashMap数组每一个元素的初始值都是Null。 对于HashMap,我们最常使用的是两个方法:Get 和 Put。 1.Put方法的原理 调用Put方法的时候发生了什么呢? 比如调用 hashMap.put("apple", 0) ,插入一个Key为“apple"的元素。这时候我们需要利用一个哈希函数来确定Entry的插入位置(index): index = Hash(“apple”) 假定最后计算出的index是2,那么结果如下: 但是,因为HashMap的长度是有限的,当插入的Entry越来越多时,再完美的Hash函数也难免会出现index冲突的情况。比如下面这样: 这时候该怎么办呢?我们可以利用链表来解决。 HashMap数组的每一个元素不止是一个Entry对象,也是一个链表的头节点。每一个Entry对象通过Next指针指向它的下一个Entry节点。当新来的Entry映射到冲突的数组位置时,只需要插入到对应的链表即可: 需要注意的是,新来的Entry节点插入链表时,使用的是“头插法”。至于为什么不插入链表尾部,后面会有解释。 2.Get方法的原理

RocketMQ学习教程:06.延迟消息【云图智联】

一个人想着一个人 提交于 2020-08-09 11:56:43
延迟消息是实际开发中一个非常有用的功能,本文第一部分从整体上介绍秒级精度延迟消息的实现思路,在第二部分结合RocketMQ的延迟消息实现,进行细致的讲解,点出关键部分的源码。第三步介绍延迟消息与消息重试的关系。 1 延迟消息介绍 基本概念:延迟消息是指生产者发送消息发送消息后,不能立刻被消费者消费,需要等待指定的时间后才可以被消费。 场景案例:用户下了一个订单之后,需要在指定时间内(例如30分钟)进行支付,在到期之前可以发送一个消息提醒用户进行支付。 一些消息中间件的Broker端内置了延迟消息支持的能力,如: NSQ: 这是一个go语言的消息中间件,其通过内存中的优先级队列来保存延迟消息,支持秒级精度,最多2个小时延迟。Java中也有对应的实现,如ScheduledThreadPoolExecutor内部实际上也是使用了优先级队列。 QMQ: 采用双重时间轮实现。 https://www.toutiao.com/i6851807550690722312/ RabbitMQ: 需要安装一个rabbitmq_delayed_message_exchange插件。 RocketMQ: RocketMQ 开源版本延迟消息临时存储在一个内部主题SCHEDULE_TOPIC_XXXX中, 不支持任意时间精度,支持特定的 level,例如定时 5s,10s,1m 等。