技术专题

java基础知识

2018-08-31  本文已影响26人  飘风云间

java 内存区域、JMM、JAVA线程模型、硬件内存模型

graph TB
    A[任务]-->D[Executors]
    B[任务]-->D
    C[任务]-->D
    D-->E[Thread LWP]
    D-->F[Thread LWP]
    D-->G[Thread LWP]
    E-->H[内核线程]
    F-->I[内核线程]
    G-->J[内核线程]
    H-->K[OS kernel线程调度器]
    I-->K
    J-->K
    K-->L[CPU]
    K-->M[CPU]
    K-->N[CPU]

java的对象创建及内存分配

对象创建

  1. jvm检查常量池里面是否有类加载标示,如果没有先加载类
  2. 内存分配方式是指针碰撞和空闲列表分配
  3. 指针碰撞主要是使用规则的内存块,根据指针和偏移长度分配,但是这种方式受垃圾回收器影响
  4. 空闲列表分配是jvm会存储空闲内存区域列表,根据空闲内存列表进行内存分配
  5. 对象的使用是栈来引用堆中的内存对象

内存分配

volatile关键字

多线程的重要特性

引用(软引用、弱引用、虚引用)

synchronized关键字解析

使用场景

锁定原理

锁优化(jdk1.6)

其他

ReentrantLock实现原理

多线程常见问题

上下文切换

CPU给线程分配时间片,然后进行上下文切换

解决方案

死锁

两个线程分别等待对方释放锁
解决方案

资源限制

CAS原理(常用于无锁化设计)

JAVA并发包(java.util.concurrent)

java中finally详解

java中异常的层级结构

graph BT
    A[IOException]-->B[Exception]
    G[Error]-->F[Throwable]
    B-->F[Throwable]
    C[ClassNotFoundException]-->B
    D[RuntimeException]-->B
    E[CloneNotSupportException]-->B
    H[FileNotFoundException]-->A
    I[NullpointException]-->D
    J[ClassCastException]-->D
    k[EOFException]-->A

JVM定义内存区域划分

JVM参数设置

JAVA基础分析工具

classloader加载

对象加载与反射

enum类型

redis vs memcached

redis数据结构详解

string

默认为是字符串sdc.h结构{int len,int free, char[] def},当使用incr decr时为数值类型

hash

redis hash当长度小于512且每个value均小于64kb时,hash结构为ziplist,ziplist可以使用紧凑的结构实现多个元素的连续存储,因此ziplist可以有更好的提高内存使用效率;当长度大于512时,hash结构为hashtable作为内部的实现方案。redis hash结构的resize使用了物理均摊策略,触发resize后会生成isRehasing标志,期间每一个hget和hset均进行相应的数据entry挪动,并且后台也有线程进行分批次迁移。迁移的过程中,get 先从old table读取,然后从 new table读取,让迁移完成后进行hash执行newtable,然后将isRehashing设置为true。

list

list内部结构默认是双向链表,支持反向查找和遍历,同时记录了链表内记录了链表的长度

set

set是一个value为null的hashmap,通过key的hash进行排重

sorted set

sorted set内部使用hashmap和skiplist进行数据存储,

hyperLogLog、Geo、PubSub、BloomFilter(Bitmap)、RedisSearch、Redis-ML

redis常问知识点

redis keys * scan

redis常见问题总结

netty线程模型

graph TB
    A[serverSocketChannel]-->|多Channel|B[NioEventLoop,Selector]
    A-->|多channel|C[NioEventLoop,Selector]
    B-->|Channel,ByteBuf|D[channelHandlerPipline]
    C-->|Channel,ByteBuf|E[channelHandlerPipline]

netty粘包和拆包

TCP包按照流的方式进行传输,根据数据大小、缓存区不同、TCP/IP报文最大大小、以太网payload帧大小不一致导致的TCP包的拆分和重组。

netty zero-copy

netty的zero-copy是通过ByteBuf的操作实现数据的读取,避免了重新定义newarray

http 协议相关、get、post、tcp/ip

三次握手
sequenceDiagram
    client->>server: sync
    Note left of client: SYNC_SEND
    server-->>client: sync+ack
    Note right of server: SYNC_RCVD
    client->>server: ack
    Note right of server: ESTABLISED
    Note left of client: ESTABLISED
    
四次挥手
sequenceDiagram
    client->>server: fin
    Note left of client: FIN_WAIT-1
    server-->>client: ack
    Note right of server: CLOSE_WAIT
    Note left of client: FIN_WAIT-2
    server->>client: fin
    client-->>server: ack
    Note right of server: CLOSE
    Note left of client: TIME_WAIT

ACID、CAP、BASE

SQL优化、分库分表

spring boot启动流程(SpringApplication.run(args))

  1. 初始化SpringApplication实例,然后调用run方法;初始化实例之前会进行几步操作
    • 根据classpath的特征推断ApplictionContext类型是Web类型还是Standalone类型
    • 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer
    • 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener
    • 推断并设置main方法的定义类
  2. SpringApplication初始化完成并完成设置后,就开始执行run方法;run方法首先遍历执行通过SpringFactoriesLoader查找并加载的SpringApplicationRunListener,并调用他们的start()方法
  3. 创建并配置当前SpringBoot将要使用的Environment(包括配置要使用的PropertySource以及Profile)
  4. 遍历调用所有SpringApplicationRunListener的environmentPrepared方法
  5. 根据设置showBanner
  6. 根据用户是否明确设置了applicationContextClass类型以及初始化推断结果,决定改为当前springBoot应用创建什么样类型的ApplicationContext并创建完成,判断是否添加shutdownHook,判断是否使用自定义的BeanNameGenerator,判断是否使用自定义的ResourceLoader,将准备好的Environment设置给ApplicationContext使用
  7. ApplicationContext创建好之后,会再次借助SpringFactoriesLoader,查找并加载所有可用的ApplicationContextInitializer,并调用其initialize方法对ApplicationContext进行进一步处理
  8. 遍历调用所有的SpringApplicationRunListener的contextPrepared方法
  9. 将@EnableAutoConfiguration获取的所有配置以及其他形式的IOC容器配置加载到ApplicationContext
  10. 遍历调用所有的SpringApplicationRunListener的contextLoaded方法
  11. 调用ApplicationContext的refresh方法,完成Ioc容器的最后一步工序
  12. 查找ApplicationContext中是否注册有CommandLineRuner,如果有遍历执行他们
  13. 正常情况下遍历执行SpringApplicationRunListener方法的finished方法,出现异常也会调用,只是会将异常信息一并传入处理
graph TB
    A((开始))-->B[加载ApplicationContextInitializer和ApplicationListener]
    B-->|SpringApplicationRunListener.start|C[load Environment]
    C-->|SpringApplicationRunListener.environmentPrepared|D[init ApplicationContext,set Environment,load Property]
    D-->|SpringApplicationRunListener.contextPrepared|E[ApplicationContext Load Other Ioc]
    E-->|SpringApplicationRunListener.contextLoaded|F[refresh ApplicationContext]
    F-->|Run CommandLineRuner,SpringApplicationRunListener.finished|G(结束)

Spring IOC与AOP,BEAN的生命周期,spring mvc处理流程

graph TB
    A[Bean实例化]-->B[属性设置]
    B-->C1[BeanNameAware.setBeanName]
    C1-->C2[BeanFactoryAware.setBeanFactory]
    C2-->C3[ApplicationContextAware.setAppliactionContext]
    C3-->D[BeanPostProcess.setBeanPostBeforeInitialization]
    O[continue]-->E[InitializingBean.afterPropertiesSet]
    E-->F[init-method定制的初始化防范]
    F-->H[BeanPostProcess.setBeanPostAfterInitialization]
    H-->|Bean准备就绪|J[DisposeBean.destory]
    J-->K[destory定制的销毁防范]
sequenceDiagram
    Client->>DispatchServlet: request请求
    DispatchServlet->>handlerMapping: 请求Handler
    handlerMapping-->>DispatchServlet: 返回执行链
    DispatchServlet->>handlerAdapter: 请求适配器执行handler
    handlerAdapter->>handler: 执行handler
    handler-->>handlerAdapter: 返回结果
    handlerAdapter-->>DispatchServlet: 返回ModelAndView
    DispatchServlet->>ViewResolver:请求视图解析器
    ViewResolver-->>DispatchServlet: 返回view
    DispatchServlet->>view视图jspfreemarker:视图渲染
    DispatchServlet->>Client: response

缓存淘汰策略LRU\LFU\FIFO

zookeeper使用场景

消息队列常见的问题

dubbo服务化分析

日志分析理解

上一篇 下一篇

猜你喜欢

热点阅读