合并请求VS并行请求

减少HTTP请求,是雅虎前端性能优化35条军规的第1条,2006年雅虎提出了这35条军规,从那以后,就深深地影响到了一批又一批的前端开发者,即使在12年后的今天,影响力依旧不减…

但是,雅虎军规中还有1条是:拆分资源以最大化利用浏览器并行下载的能力。现在问题就来了,减少HTTP请求,但网页所需的资源并不能减少(否则网页就不再是之前的网页了),所以减少HTTP请求,主要是通过合并资源来实现的,一边是建议合并资源,一边是建议拆分资源,显然是有冲突的地方,那么到底该怎么做呢?网上有些文章也讨论过这个问题,但大多是停留在想当然的理论分析上,而且忽略了TCP传输机制的影响。

Read more

常用数据结构

常用数据结构

名称底层结构线程安全有序值唯一
LinkedList双向链表x不唯一
ArrayList数组x不唯一
Vector数组不唯一
HashTable数组+链表x不为空
HashSet数组+链表xx唯一
TreeSet红黑树x唯一
HashMap数组+链表/红黑树xx不唯一
TreeMap红黑树x不唯一
ConcurrentHashMap数组+链表/红黑树x不唯一

四种引用和使用场景

强引用(StrongReference)

如果一个对象具有强引用,那垃圾回收器(Garbage Collection,GC)绝不会回收它。当内存空间不足,JVM 宁愿抛出 OutOfMemoryError,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

Read more

获取 request 及其线程安全性分析

原文Spring中获取request的几种方法,及其线程安全性分析

前言

本文将介绍在使用 Spring MVC 开发中,获取 request 对象的几种方法,并讨论其线程安全性。

概述

在使用 Spring MVC 开发 Web 系统时,经常需要在处理请求时使用 request 对象。比如:获取客户端 IP 地址、请求的 URL、header 中的属性(Cookie、授权信息)、body 中的数据等。

由于在 Spring MVC 中,处理请求的 Controller、Service 等对象都是单例的,因此获取 request 对象时最需要注意的问题,便是 request 对象是否线程安全:当有大量并发请求时,能否保证不同请求/线程中使用不同的 request 对象。

Read more

JVM

Java 虚拟机(JVM)

JVM

Java 源码,经过编译器编译后生成 .class 字节码文件:

编译

Java 源码编译由以下三个过程组成:

  • 分析和输入到符号表
  • 注解处理
  • 语义分析和生成class文件

源码编译

JVM 将字节码文件翻译成特定平台下的机器码然后运行:

字节码翻译

注:编译生成的是字节码,字节码不能直接运行,必须通过 JVM 翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由 JVM 翻译成的机器码却不一样。

注:跨平台的是 Java 程序,不是 JVM。JVM 是用 C/C++ 开发的,不能跨平台,不同平台下需要安装不同版本的 JVM。

Read more

下载等待

  1. 广告。增加停留时间就意味着用户有更多的机会看到令自己感兴趣的广告并点击,然后就有更高的收入了;
  2. 推荐。可以立即推荐有关的下载,有的人下载完东西就直接关闭了网站,不会看到相关的下载信息,就没有更多的浏览量;
  3. 条款。我们在下载的时候一般都会涉及到相关条款(免责条款),如果在下载页面放置基本不会有人注意,但放在这里,很多纠纷就能够说过去;
  4. 缓冲。防止误下载;防止盗链;给服务器寻找资源做缓冲(更优下载路线),倒计时一完成就能过够开始下载,不用再看着空白页面等待。

Redis、Memcached

共同点

Memcached 和 Redis 都很类似:都是内存型数据库,数据保存在内存中,通过 TCP 直接存取,速度快,并发高,但数据类型有限,查询功能不强,一般用作缓存。

Read more

MySQL 大表优化方案

前言

当 MySQL 单表记录数过大时,增删改查性能都会急剧下降,可以参考以下优化手段:

  • 单表优化
  • 读写分离
  • 缓存
  • 拆分
  • NoSQL
Read more