Bug1024

十年后端,现在 All in AI。这里记录我的 AI 工程实践、平台架构思考与工程师成长。每月一篇,宁缺毋滥。

Java Http客户端之OkHttp

HTTP客户端 java.net 包中提供了一些基本的方法,使用过 http 协议来访问网络资源,但是操作起来比较繁琐不够灵活,因此诞生了一些优秀的HTTP客户端工具,包括 Apache HttpClient、OkHttp,在笔者接触过的项目里又以 OkHttp 使用更加广泛,所以本次重点介绍 OkHttp ...

2020年6月6日 · 4 分钟 · Bug1024

Netty学习笔记

UNIX网络编程IO模型分类 阻塞IO 非阻塞IO IO复用(select/poll/epoll) 信号驱动 异步IO poll相比select优势 FD数目不受限制 IO效率不随着FD数目增加而线性下降 使用mmap加速内核与用户空间的消息传递 API更为简单 套接字read接口阻塞场景 有数据可读 可用数据已经读取完毕 发送空指针或者IO异常 伪异步IO(线程池方案)的问题 服务端处理缓慢,返回应答耗费60s,平时只需要10ms 线程读取故障节点由于读取输入流堵塞,因而会被阻塞60s 所有可用线程都被阻塞,后续消息只能在队列中排队等待 线程池通常采用阻塞队列实现,队列满之后,后续入队的操作将被阻塞 前端只有一个Acceptor接收客户端请求,新的客户端请求将会被拒绝,产生连接超时 几乎所有连接超时,调用方则认为系统已经崩溃 为何不使用原生NIO编程 API复杂,需要熟练掌握Selector,ServerSocketChannel,ByteBuffer等 需要具备其他技能铺垫,例如多线程编程,网络编程 可靠性低,工作量与难度都很大 JDK NIO本身也可能有bug Why Netty API简单 功能强大,预置多种安编码解码,支持多种协议 定制能力强,可通过ChannelHandler对框架灵活扩展 性能高 成熟稳定,社区活跃,经历大规模商业应用考验 TCP粘包和拆包 服务端一次性收到两个数据包,D1和D2粘合在一起,成为粘包 服务端分两次读取两个数据包,第一次读取了完整的D1和D2部分内容,第二次读取到了D2剩余内容,成为拆包 如果TCP滑动窗口笔记小,数据包又比较大,那么容易发生多次拆包 产生的原因: ...

2018年4月15日 · 3 分钟 · Bug1024

2017年总结

转眼又一年,北漂的第一年。与往年类似,又到了年终总结的日子。 过去一年达成的目标 成功转型Java,参与了亿级流量的业务系统重构,对于分布式服务的有了更全面的认识 开始学习PHP内核,初步掌握了开发简单扩展的能力 系统地重新学习了MySQL与Redis,对于数据持久化和缓存应用有了更深的了解 GitHub连击200天达成,最长记录从1月1日持续到8月5日,累计217天 搭建了独立的博客,共写了57篇博客 跑步连续100天达成,每周平均打一次篮球,体重与上一年持平 背了1000个左右的英语单词 编程 最重要的一件便是跟着团队转型从事做Java开发,曾经我是排斥Java的,因为在我看来那是拙笨的代表,而我个人是喜欢轻巧的,但到了最后我还是接受了Java,现在看来Java更多的是一种稳重。 ...

2018年1月1日 · 3 分钟 · Bug1024

PHP7

新特性 标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型 返回值类型声明 类似于参数类型声明,返回类型声明指明了函数返回值的类型 null合并运算符 考虑到日常使用到大量三元表达式和isset()的情况,添加了null合并运算符??这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数 太空船操作符(组合比较符) <=>用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1 通过define()定义常量数组 Array 类型的常量现在可以通过define() 来定义。在PHP5.6中仅能通过const定义 匿名类 现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义 高性能 PHP7是一个比较底层升级,比起PHP5的变化比较大,通过减少内存分配次数,多使用栈内存,缓存数组hash值,字符串解析成参数改为宏展开,使用大块连续内存代替小块碎片内存等等,使得性能有很大提升,具体就性能优化层面,大致可以汇总如下: ...

2017年12月16日 · 2 分钟 · Bug1024

MySQL调优

硬件层相关优化 修改服务器BIOS设置 选择DAPC(Performance Per Wait Optimized)模式,发挥CPU最大性能 Memory Frequency(内存频率)选择Maximum Performance(最佳性能) 内存设置菜单中,启用Node Interleaving,避免NUMA问题 磁盘I/O相关 使用SSD盘 如果是磁盘阵列存储,建议阵列卡配备CACHE和BBU模块,可提升IOPS raid级别尽量选择raid10,而不是raid5 文件系统层优化 使用deadline/noop这两种I/O调度器,别用cfq 使用xfs文件系统,别用ext3,ext4勉强可用,如果业务量大的话一定要用xfs 文件系统mount参数中增加noatime/nodiratime/nobarrier几个选项,其中nobarrier是xfs文件系统特有的 内核参数优化 优化vm.swappiness参数,降低swap使用率。RHEL7/centos7以上慎重设置为0,可能导致OOM 调整vm.dirty_background_ratio/vm.dirty_ratio,确保将脏数据持续刷到磁盘中,避免瞬间I/O过高,产生等待 调整net.ipv4.tcp_tw_recycle/net.ipv4.ctp_tw_reuse都设置为1,减少TIME_WAIT,提高TCP效率 MySQL参数优化 建议设置默认引擎为InnoDB,强烈不建议使用MyISAM引擎 调整innodb_buffer_pool_size的大小,如果单实例且绝大多数是InnoDB引擎表的话,可考虑设置为物理内存的50%-70% 设置innodb_file_per_table=1,使用独立表空间 调整innodb_data_file_path = ibdata1:1G:autoextend,不用默认的10M,在高并发场景下性能有很大提升 设置innodb_log_file_size=256M,设置innodb_log_file_in_group=2,可基本满足大部分应用场景 调整max_connection/max_connection_error,根据业务量大小进行设置 open_file_limit/innodb_open_files/table_open_cache/table_definitiion_cache可设置大约为max_connection的10倍左右大小 key_buffer_size/max_heap_table_size不用设置过大 sort_buffer_size/join_buffer_size/read_buffer_size/read_rmd_buffer_size也不要设置过大 MySQL高可用方案 MHA MHA(MySQL-Master-HA)是目前广泛使用的MySQL主从复制的高可用方案。MHA设计目标是自动实现主实例宕机后,从机切换为主,并尽量降低切换时延(通常在10-30s内切换完成)。同时,由MHA保证在切换过程中的数据一致性。MHA对MySQL的主从复制集群非常友好,没有对集群做任何侵入性的修改。 MHA的一个重点特性是:在主实例宕机后,MHA可以自动的判断主从复制集群中哪个从实例的relaylog是最新的,并将最新从实例的差异log“应用”到其余的从实例中,从而保证每个实例的数据一致。通常情况下,MHA需要10s左右检测主实例异常,并将主实例关闭从而避免脑裂。然后再用10s左右将差异的log event同步,并启用新的Master。整个MHA的RTO时间大约在30s。 ...

2017年12月9日 · 3 分钟 · Bug1024

Raid级别

RAID(Redundent Array of Inexpensive Disks),廉价冗余磁盘阵列,后来RAID中的I被改作了Independent,就成了“独立冗余磁盘阵列”,但这只是名称的变化,实质性的内容并没有改变。可以把RAID理解成一种使用磁盘驱动器的方法,它将一组磁盘驱动器用某种逻辑方式联系起来,作为逻辑上的一个磁盘驱动器来使用。 ...

2017年12月3日 · 3 分钟 · Bug1024

分库分表

众所周知,当业务量达到一定程度时,单库单表已经无法hold住压力,这个时候往往需要根据业务进行分库分表。 分表类型 垂直拆分 即大表拆小表,将不经常使用或者长度较大的字段拆分出去放到“副表”中 水平拆分 即横向分表,将表中不同的数据行按照一定规律分布到不同的数据库表中 分表规则 通常根据主键或者业务id等字段进行hash和取模,得到相应的db和table,当然也可以将id和库的Mapping关系记录在一个单独的库中,优点是Mapping算法可以随意更改, 缺点是引入额外的单点。此外,还有根据时间维度进行分表的。 ...

2017年11月21日 · 1 分钟 · Bug1024

技术成长

工作3年多了,自己也算得上是一个合格的crud工程师。身边总是会听到类似的话语,写业务代码没有什么技术含量。不过确实也是如此,业务代码无非就是为了实现产品功能,写多了对自身水平提升帮助不大。 因此作为一个业务开发为主的工程师,在日常开发之余更应该去思考如何提高技术水平。借鉴了一些别人分享的人生经验,结合我自己的经历和理解,做了一个微小的的整理工作。 ...

2017年11月13日 · 3 分钟 · Bug1024

Java基础知识点

基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 post请求的区别 Interface 与 abstract 类的区别 IOC的优点是什么 IO 和 NIO的区别,NIO优点 Java 8 / Java 7 为我们提供了什么新功能 什么是竞态条件? 举个例子说明。 JRE、JDK、JVM 及 JIT 之间有什么不同 MVC的各个部分都有那些技术来实现?如何实现? RPC 通信和 RMI 区别 什么是 Web Service(Web服务) JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。 一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制 简单说说你了解的类加载器。是否实现过类加载器 解释一下什么叫AOP(面向切面编程) 请简述 Servlet 的生命周期及其相关的方法 请简述一下 Ajax 的原理及实现步骤 简单描述Struts的主要功能 什么是 N 层架构 什么是CORBA?用途是什么 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言” 什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配 什么是懒加载(Lazy Loading) 什么是尾递归,为什么需要尾递归 什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection) 关键字 finalize 什么是finalize()方法 finalize()方法什么时候被调用 析构函数(finalization)的目的是什么 final 和 finalize 的区别 final final关键字有哪些用法 final 与 static 关键字可以用于哪里?它们的作用是什么 final, finally, finalize的区别 final、finalize 和 finally 的不同之处? 能否在运行时向 static final 类型的赋值 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 一个类被声明为final类型,表示了什么意思 throws, throw, try, catch, finally分别代表什么意义 Java 有几种修饰符?分别用来修饰什么 volatile volatile 修饰符的有过什么实践 volatile 变量是什么?volatile 变量和 atomic 变量有什么不同 volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗 能创建 volatile 数组吗? transient变量有什么特点 super什么时候使用 public static void 写成 static public void会怎样 说明一下public static void main(String args[])这段声明里每个关键字的作用 请说出作用域public, private, protected, 以及不写时的区别 sizeof 是Java 的关键字吗 static static class 与 non static class的区别 static 关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法 静态类型有什么特点 main() 方法为什么必须是静态的?能不能声明 main() 方法为非静态 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用 静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢 成员方法是否可以访问静态变量?为什么静态方法不能访问成员变量 switch switch 语句中的表达式可以是什么类型数据 switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上 while 循环和 do 循环有什么不同 操作符 &操作符和&&操作符有什么区别? a = a + b 与 a += b 的区别? 3*0.1 == 0.3 将会返回什么?true 还是 false? float f=3.4; 是否正确? short s1 = 1; s1 = s1 + 1;有什么错? 数据结构 基础类型(Primitives) 基础类型(Primitives)与封装类型(Wrappers)的区别在哪里 简述九种基本数据类型的大小,以及他们的封装类 int 和 Integer 哪个会占用更多的内存? int 和 Integer 有什么区别?parseInt()函数在什么时候使用到 float和double的默认值是多少 如何去小数四舍五入保留小数点后两位 char 型变量中能不能存贮一个中文汉字,为什么 类型转换 怎样将 bytes 转换为 long 类型 怎么将 byte 转换为 String 如何将数值型字符转换为数字 我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象 能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗 类型向下转换是什么 数组 如何权衡是使用无序的数组还是有序的数组 怎么判断数组是 null 还是为空 怎么打印数组? 怎样打印数组中的重复元素 Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList 数组和链表数据结构描述,各自的时间复杂度 数组有没有length()这个方法? String有没有length()这个方法 队列 队列和栈是什么,列出它们的区别 BlockingQueue是什么 简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处。 ArrayList、Vector、LinkedList的存储性能和特性 String StringBuffer ByteBuffer 与 StringBuffer有什么区别 HashMap HashMap的工作原理是什么 内部的数据结构是什么 HashMap 的 table的容量如何确定?loadFactor 是什么? 该容量如何变化?这种变化会带来什么问题? HashMap 实现的数据结构是什么?如何实现 HashMap 和 HashTable、ConcurrentHashMap 的区别 HashMap的遍历方式及效率 HashMap、LinkedMap、TreeMap的区别 如何决定选用HashMap还是TreeMap 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办 HashMap 是线程安全的吗?并发下使用的 Map 是什么,它们内部原理分别是什么,比如存储方式、 hashcode、扩容、 默认容量等 HashSet HashSet和TreeSet有什么区别 HashSet 内部是如何工作的 WeakHashMap 是怎么工作的? Set Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()? 它们有何区别? TreeMap:TreeMap 是采用什么树实现的?TreeMap、HashMap、LindedHashMap的区别。TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素? TreeSet:一个已经构建好的 TreeSet,怎么完成倒排序。 EnumSet 是什么 Hash算法 Hashcode 的作用 简述一致性 Hash 算法 有没有可能 两个不相等的对象有相同的 hashcode?当两个对象 hashcode 相同怎么办?如何获取值对象 为什么在重写 equals 方法的时候需要重写 hashCode 方法?equals与 hashCode 的异同点在哪里 a.hashCode() 有什么用?与 a.equals(b) 有什么关系 hashCode() 和 equals() 方法的重要性体现在什么地方 Object:Object有哪些公用方法?Object类hashcode,equals 设计原则? sun为什么这么设计?Object类的概述 如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。 可以在 hashcode() 中使用随机数字吗? LinkedHashMap LinkedHashMap 和 PriorityQueue 的区别是什么 List List, Set, Map三个接口,存取元素时各有什么特点 List, Set, Map 是否继承自 Collection 接口 遍历一个 List 有哪些不同的方式 LinkedList LinkedList 是单向链表还是双向链表 LinkedList 与 ArrayList 有什么区别 描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么? 插入数据时,ArrayList, LinkedList, Vector谁速度较快? ArrayList ArrayList 和 HashMap 的默认大小是多数 ArrayList 和 LinkedList 的区别,什么时候用 ArrayList? ArrayList 和 Set 的区别? ArrayList, LinkedList, Vector的区别 ArrayList是如何实现的,ArrayList 和 LinkedList 的区别 ArrayList如何实现扩容 Array 和 ArrayList 有何区别?什么时候更适合用Array 说出ArraList,Vector, LinkedList的存储性能和特性 Map Map, Set, List, Queue, Stack Map 接口提供了哪些不同的集合视图 为什么 Map 接口不继承 Collection 接口 Collections 介绍Java中的Collection FrameWork。集合类框架的基本接口有哪些 Collections类是什么?Collection 和 Collections的区别?Collection、Map的实现 集合类框架的最佳实践有哪些 为什么 Collection 不从 Cloneable 和 Serializable 接口继承 说出几点 Java 中使用 Collections 的最佳实践? Collections 中 遗留类 (HashTable、Vector) 和 现有类的区别 什么是 B+树,B-树,列出实际的使用场景。 接口 Comparator 与 Comparable 接口是干什么的?列出它们的区别 对象 拷贝(clone) 如何实现对象克隆 深拷贝和浅拷贝区别 深拷贝和浅拷贝如何实现激活机制 写clone()方法时,通常都有一行代码,是什么 比较 在比较对象时,"==" 运算符和 equals 运算有何区别 如果要重写一个对象的equals方法,还要考虑什么 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对 构造器 构造器链是什么 创建对象时构造器的调用顺序 不可变对象 什么是不可变象(immutable object) 为什么 Java 中的 String 是不可变的(Immutable) 如何构建不可变的类结构?关键点在哪里 能创建一个包含可变对象的不可变对象吗 如何对一组对象进行排序 方法 构造器(constructor)是否可被重写(override) 方法可以同时即是 static 又是 synchronized 的吗 abstract 的 method是否可同时是 static,是否可同时是 native,是否可同时是synchronized Java支持哪种参数传递类型 一个对象被当作参数传递到一个方法,是值传递还是引用传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 我们能否重载main()方法 如果main方法被声明为private会怎样 GC 概念 GC是什么?为什么要有GC 什么时候会导致垃圾回收 GC是怎么样运行的 新老以及永久区是什么 GC 有几种方式?怎么配置 什么时候一个对象会被GC? 如何判断一个对象是否存活 System.gc() Runtime.gc()会做什么事情? 能保证 GC 执行吗 垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? Minor GC 、Major GC、Young GC 与 Full GC分别在什么时候发生 垃圾回收算法的实现原理 如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存? 垃圾回收的最佳做法是什么 GC收集器有哪些 垃圾回收器的基本原理是什么? 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么 Serial 与 Parallel GC之间的不同之处 CMS 收集器 与 G1 收集器的特点与区别 CMS垃圾回收器的工作过程 JVM 中一次完整的 GC 流程是怎样的? 对象如何晋升到老年代 吞吐量优先和响应优先的垃圾收集器选择 GC策略 举个实际的场景,选择一个GC策略 JVM的永久代中会发生垃圾回收吗 收集方法 标记清除、标记整理、复制算法的原理与特点?分别用在什么地方 如果让你优化收集方法,有什么思路 JVM 参数 说说你知道的几种主要的jvm 参数 -XX:+UseCompressedOops 有什么作用 类加载器(ClassLoader) Java 类加载器都有哪些 JVM如何加载字节码文件 内存管理 JVM内存分哪几个区,每个区的作用是什么 一个对象从创建到销毁都是怎么在这些部分里存活和转移的 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法 JVM中哪个参数是用来控制线程的栈堆栈小 简述内存分配与回收策略 简述重排序,内存屏障,happen-before,主内存,工作内存 Java中存在内存泄漏问题吗?请举例说明 简述 Java 中软引用(SoftReferenc)、弱引用(WeakReference)和虚引用 内存映射缓存区是什么 jstack,jstat,jmap,jconsole怎么用 32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?32 位和 64 位的 JVM,int 类型变量的长度是多数? 怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位 JVM自身会维护缓存吗?是不是在堆中进行对象分配,操作系统的堆还是JVM自己管理堆 什么情况下会发生栈内存溢出 双亲委派模型是什么 多线程 基本概念 什么是线程 多线程的优点 多线程的几种实现方式 用 Runnable 还是 Thread 什么是线程安全 Vector, SimpleDateFormat 是线程安全类吗 什么 Java 原型不是线程安全的 哪些集合类是线程安全的 多线程中的忙循环是什么 如何创建一个线程 编写多线程程序有几种实现方式 什么是线程局部变量 线程和进程有什么区别?进程间如何通讯,线程间如何通讯 什么是多线程环境下的伪共享(false sharing) 同步和异步有何异同,在什么情况下分别使用他们?举例说明 Current ConcurrentHashMap 和 Hashtable的区别 ArrayBlockingQueue, CountDownLatch的用法 ConcurrentHashMap的并发度是什么 CyclicBarrier 和 CountDownLatch有什么不同?各自的内部原理和用法是什么 Semaphore的用法 Thread 启动一个线程是调用 run() 还是 start() 方法?start() 和 run() 方法有什么区别 调用start()方法时会执行run()方法,为什么不能直接调用run()方法 sleep() 方法和对象的 wait() 方法都可以让线程暂停执行,它们有什么区别 yield方法有什么作用?sleep() 方法和 yield() 方法有什么区别 Java 中如何停止一个线程 stop() 和 suspend() 方法为何不推荐使用 如何在两个线程间共享数据 如何强制启动一个线程 如何让正在运行的线程暂停一段时间 什么是线程组,为什么在Java中不推荐使用 你是如何调用 wait(方法的)?使用 if 块还是循环?为什么 生命周期 有哪些不同的线程生命周期 线程状态,BLOCKED 和 WAITING 有什么区别 画一个线程的生命周期状态图 ThreadLocal 用途是什么,原理是什么,用的时候要注意什么 ThreadPool 线程池是什么?为什么要使用它 如何创建一个Java线程池 ThreadPool用法与优势 提交任务时,线程池队列已满时会发会生什么 newCache 和 newFixed 有什么区别?简述原理。构造函数的各个参数的含义是什么,比如 coreSize, maxsize 等 线程池的实现策略 线程池的关闭方式有几种,各自的区别是什么 线程池中submit() 和 execute()方法有什么区别? 线程调度 Java中用到的线程调度算法是什么 什么是多线程中的上下文切换 你对线程优先级的理解是什么 什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing) 线程同步 请说出你所知的线程同步的方法 synchronized 的原理是什么 synchronized 和 ReentrantLock 有什么不同 什么场景下可以使用 volatile 替换 synchronized 有T1,T2,T3三个线程,怎么确保它们按顺序执行?怎样保证T2在T1执行完后执行,T3在T2执行完后执行 同步块内的线程抛出异常会发生什么 当一个线程进入一个对象的 synchronized 方法A 之后,其它线程是否可进入此对象的 synchronized 方法B 使用 synchronized 修饰静态方法和非静态方法有什么区别 如何从给定集合那里创建一个 synchronized 的集合 锁 Java Concurrency API 中 的 Lock 接口是什么?对比同步它有什么优势 Lock 与 Synchronized 的区别?Lock 接口比 synchronized 块的优势是什么 ReadWriteLock是什么? 锁机制有什么用 什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题 解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁 什么时候应该使用可重入锁 简述锁的等级方法锁、对象锁、类锁 Java中活锁和死锁有什么区别? 什么是死锁(Deadlock)?导致线程死锁的原因?如何确保 N 个线程可以访问 N 个资源同时又不导致死锁 死锁与活锁的区别,死锁与饥饿的区别 怎么检测一个线程是否拥有锁 如何实现分布式锁 有哪些无锁数据结构,他们实现的原理是什么 读写锁可以用于什么应用场景 Executors类是什么? Executor和Executors的区别 什么是Java线程转储(Thread Dump),如何得到它 如何在Java中获取线程堆栈 说出 3 条在 Java 中使用线程的最佳实践 在线程中你怎么处理不可捕捉异常 实际项目中使用多线程举例。你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的 请说出与线程同步以及线程调度相关的方法 程序中有3个 socket,需要多少个线程来处理 假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到 如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长 如何确保 main() 方法所在的线程是 Java 程序最后结束的线程 非常多个线程(可能是不同机器),相互之间需要等待协调才能完成某种工作,问怎么设计这种协调方案 你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它 异常 基本概念 Error 和 Exception有什么区别 UnsupportedOperationException是什么 NullPointerException 和 ArrayIndexOutOfBoundException 之间有什么相同之处 什么是受检查的异常,什么是运行时异常 运行时异常与一般异常有何异同 简述一个你最常见到的runtime exception(运行时异常) finally finally关键词在异常处理中如何使用 如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗 try里有return,finally还执行么?那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后 在什么情况下,finally语句不会执行 throw 和 throws 有什么区别? OOM你遇到过哪些情况?你是怎么搞定的? SOF你遇到过哪些情况? 既然我们可以用RuntimeException来处理错误,那么你认为为什么Java中还存在检查型异常 当自己创建异常类的时候应该注意什么 导致空指针异常的原因 异常处理 handle or declare 原则应该如何理解 怎么利用 JUnit 来测试一个方法的异常 catch块里别不写代码有什么问题 你曾经自定义实现过异常吗?怎么写的 什么是 异常链 在try块中可以抛出异常吗 JDBC 通过 JDBC 连接数据库有哪几种方式 阐述 JDBC 操作数据库的基本步骤 JDBC 中如何进行事务处理 什么是 JdbcTemplate 什么是 DAO 模块 使用 JDBC 操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能 列出 5 个应该遵循的 JDBC 最佳实践 IO File File类型中定义了什么方法来创建一级目录 File类型中定义了什么方法来判断一个文件是否存在 流 为了提高读写性能,可以采用什么流 Java中有几种类型的流 JDK 为每种类型的流提供了一些抽象类以供继承,分别是哪些类 对文本文件操作用什么I/O流 对各种基本数据类型和String类型的读写,采用什么流 能指定字符编码的 I/O 流类型是什么 序列化 什么是序列化?如何实现 Java 序列化及注意事项 Serializable 与 Externalizable 的区别 Socket socket 选项 TCP NO DELAY 是指什么 Socket 工作在 TCP/IP 协议栈是哪一层 TCP、UDP 区别及 Java 实现方式 说几点 IO 的最佳实践 直接缓冲区与非直接缓冲器有什么区别? 怎么读写 ByteBuffer?ByteBuffer 中的字节序是什么 当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少 如何使用扫描器类(Scanner Class)令牌化 面向对象编程(OOP) 解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling) 多态的实现原理 封装、继承和多态是什么 对象封装的原则是什么? 类 获得一个类的类对象有哪些方式 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 说出几条 Java 中方法重载的最佳实践 抽象类 抽象类和接口的区别 抽象类中是否可以有静态的main方法 抽象类是否可实现(implements)接口 抽象类是否可继承具体类(concrete class) 匿名类(Anonymous Inner Class) 匿名内部类是否可以继承其它类?是否可以实现接口 内部类 内部类分为几种 内部类可以引用它的包含类(外部类)的成员吗 请说一下 Java 中为什么要引入内部类?还有匿名内部类 继承 继承(Inheritance)与聚合(Aggregation)的区别在哪里 继承和组合之间有什么不同 为什么类只能单继承,接口可以多继承 存在两个类,B 继承 A,C 继承 B,能将 B 转换为 C 么?如 C = (C) B 如果类 a 继承类 b,实现接口c,而类 b 和接口 c 中定义了同名变量,请问会出现什么问题 接口 接口是什么 接口是否可继承接口 为什么要使用接口而不是直接使用具体类?接口有什么优点 泛型 泛型的存在是用来解决什么问题 泛型的常用特点 List<String>能否转为List<Object> 工具类 日历 Calendar Class的用途 如何在Java中获取日历类的实例 解释一些日历类中的重要方法 GregorianCalendar 类是什么 SimpleTimeZone 类是什么 Locale类是什么 如何格式化日期对象 如何添加小时(hour)到一个日期对象(Date Objects) 如何将字符串 YYYYMMDD 转换为日期 Math Math.round()什么作用?Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? XML XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?DOM 和 SAX 解析器有什么不同? Java解析XML的方式 用 jdom 解析 xml 文件时如何解决中文问题?如何解析 你在项目中用到了 XML 技术的哪些方面?如何实现 动态代理 描述动态代理的几种实现方式,分别说出相应的优缺点 设计模式 什么是设计模式(Design Patterns)?你用过哪种设计模式?用在什么场合 你知道哪些商业级设计模式? 哪些设计模式可以增加系统的可扩展性 单例模式 除了单例模式,你在生产环境中还用过什么设计模式? 写 Singleton 单例模式 单例模式的双检锁是什么 如何创建线程安全的 Singleton 什么是类的单例模式 写出三种单例模式实现 适配器模式 适配器模式是什么?什么时候使用 适配器模式和代理模式之前有什么不同 适配器模式和装饰器模式有什么区别 什么时候使用享元模式 什么时候使用组合模式 什么时候使用访问者模式 什么是模板方法模式 请给出1个符合开闭原则的设计模式的例子 开放问题 用一句话概括 Web 编程的特点 Google是如何在一秒内把搜索结果返回给用户 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入 树(二叉或其他)形成许多普通数据结构的基础。请描述一些这样的数据结构以及何时可以使用它们 某一项功能如何设计 线上系统突然变得异常缓慢,你如何查找问题 什么样的项目不适合用框架 新浪微博是如何实现把微博推给订阅者 简要介绍下从浏览器输入 URL 开始到获取到请求界面之后 Java Web 应用中发生了什么 请你谈谈SSH整合 高并发下,如何做到安全的修改同一行数据 12306网站的订票系统如何实现,如何保证不会票不被超卖 网站性能优化如何优化的 聊了下曾经参与设计的服务器架构 请思考一个方案,实现分布式环境下的 countDownLatch 请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存 在你的职业生涯中,算得上最困难的技术挑战是什么 如何写一篇设计文档,目录是什么 大写的O是什么?举几个例子 编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用 解释一下网络应用的模式及其特点 设计一个在线文档系统,文档可以被编辑,如何防止多人同时对同一份文档进行编辑更新 说出数据连接池的工作机制是什么 怎么获取一个文件中单词出现的最高频率 描述一下你最常用的编程风格 如果有机会重新设计你们的产品,你会怎么做 如何搭建一个高可用系统 如何启动时不需输入用户名与密码 如何在基于Java的Web项目中实现文件上传和下载 如何实现一个秒杀系统,保证只有几位用户能买到某件商品。 如何实现负载均衡,有哪些算法可以实现 如何设计一个购物车?想想淘宝的购物车如何实现的 如何设计一套高并发支付方案,架构如何设计 如何设计建立和保持 100w 的长连接 如何避免浏览器缓存。 如何防止缓存雪崩 如果AB两个系统互相依赖,如何解除依 如果有人恶意创建非法连接,怎么解决 如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算) 如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现 如果让你实现一个并发安全的链表,你会怎么做 应用服务器与WEB 服务器的区别?应用服务器怎么监控性能,各种方式的区别?你使用过的应用服务器优化技术有哪些 大型网站在架构上应当考虑哪些问题 有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的 最近看什么书,印象最深刻的是什么 描述下常用的重构技巧 你使用什么版本管理工具?分支(Branch)与标签(Tag)之间的区别在哪里 你有了解过存在哪些反模式(Anti-Patterns)吗 你用过的网站前端优化的技术有哪些 如何分析Thread dump 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念 你是如何处理内存泄露或者栈溢出问题的 你们线上应用的 JVM 参数有哪些 怎么提升系统的QPS和吞吐量 知识面 解释什么是 MESI 协议(缓存一致性) 谈谈 reactor 模型 Java 9 带来了怎样的新功能 Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用 简单讲讲 Tomcat 结构,以及其类加载器流程 虚拟内存是什么 阐述下 SOLID 原则 请简要讲一下你对测试驱动开发(TDD)的认识 CDN实现原理 Maven 和 ANT 有什么区别 UML中有哪些常用的图 Linux Linux 下 IO 模型有几种,各自的含义是什么。 Linux 系统下你关注过哪些内核参数,说说你知道的 Linux 下用一行命令查看文件的最后五行 平时用到哪些 Linux 命令 用一行命令输出正在运行的 Java 进程 使用什么命令来确定是否有 Tomcat 实例运行在机器上 什么是 N+1 难题 什么是 paxos 算法 什么是 restful,讲讲你理解的 restful 什么是 zab 协议 什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别 什么是领域驱动开发(Domain Driven Development) 介绍一下了解的 Java 领域的 Web Service 框架 Web Server、Web Container 与 Application Server 的区别是什么 微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里 描述 Cookie 和 Session 的作用,区别和各自的应用范围,Session工作原理 你常用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具有哪些 简述下数据库正则化(Normalizations) KISS,DRY,YAGNI 等原则是什么含义 分布式事务的原理,优缺点,如何使用分布式事务? 布式集群下如何做到唯一序列号 网络 HTTPS 的加密方式是什么,讲讲整个加密解密流程 HTTPS和HTTP的区别 HTTP连接池实现原理 HTTP集群方案 Nginx、lighttpd、Apache三大主流 Web服务器的区别 是否看过框架的一些代码 持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些 数值提升是什么 你能解释一下里氏替换原则吗 你是如何测试一个应用的?知道哪些测试框架 传输层常见编程协议有哪些?并说出各自的特点 编程题 计算加班费 加班10小时以下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工作26天,一天正常工作8小时) ...

2017年11月1日 · 26 分钟 · Bug1024

MySQL数据类型

前言 框架用的多了,已经不会写野生的SQL语句了,于是决定系统地阅读一下MySQL的官方文档。 常用类型比较 类型 范围 存储空间 备注 BIT(M) [1, 64]越界后默认值为1 (M+7)/8 bytes TINYINT(M) signed[-128, 127] unsigned[0, 255] 1bytes SMALLINT(M) signed[-32768, 32767] unsigned[0, 65535] 2bytes MEDIUMINTINT(M) signed[-8388608, 8388607] unsigned[0, 16777605] 3bytes INT(M) signed[-2147483648, 2147483647] unsigned[0, 4294967295] 4bytes BIGINT(M) signed[-9223372036854775808, 9223372036854775807] unsigned[0, 18446744073709551615] 8bytes DECIMAL[(M[,D])] [~ -1E+66, ~1E+66] 8bytes M数字的总数(精度),D是小数点后的数字(刻度), M最大65,溢出后默认值为10,D最大30,溢出后默认值为0 DOUBLE[(M[,D])] [-1.7976931348623157E+308, 1.7976931348623157E+308] 8bytes FLOAT[(p)] [-3.402823466E+38,3.402823466E+38] 4bytes, 0 <= p <= 24;8bytes, 25 <= p <= 53 CHAR(M) 当0 <= M <= 255时为M × w bytes 其中w为指定字符集下每个字符的大小 VARCHAR(M) L + 1 bytes, L < =255;L + 2 bytes, L > 255 TEXT [0, 65535] L + 2 bytes MEDIUMTEXT [0, 167776150] L + 3 bytes LONGTEXT [0, 4294967295] L + 4 bytes YEAR [1901, 2155] 1bytes DATE [1000-01-01,9999-12-31] 3bytes TIME [-838:59:59, -838:59:59] 3bytes 5.6.4开始 5.6.4开始 3 bytes + fractional seconds storage DATETIME [1000-01-01 00:00:00, 9999-12-31 23:59:59] 8bytes 5.6.4开始 5 bytes + fractional seconds storage TIMESTAMP [1970-01-01 08:00:01, 2038-01-19 11:14:07] 4bytes 5.6.4开始 4 bytes + fractional seconds storage 备注:5.6.4开始,时间类型支持微秒(最大6位),所占的存储空间原来基础上加上微秒部分

2017年10月29日 · 1 分钟 · Bug1024