java
A 虚拟机
类装载器:

1 类装载器分为2种:
1 系统装载器
1 启动类装载器 加载java的核心库,是用原生代码来实现的,不是继承java.lang.ClassLoader
2 扩展类装载器 加载Java的扩展类,
3 应用程序类装载器 根据java应用的类路劲(CLASSPATH)来加载Java类,一般来说,Java应用的类都是由这个加载器完成的
2 用户自定义装载器;继承java.lang.ClassLoader

类装载器子系统除了定位和导入class文件之外,还必须负责验证类的正确性,为类变量初始化内存以及解析符号引用,执行顺序如下:
1 装载
装载类的第一个步骤,加载类的二进制流
2 链接
验证,保证class流的二进制文件是正确的,文件格式验证,元数据验证,字节码验证,符号引用验证
准备,分配内存,并给静态常亮设置初始值如果不是final修饰的,初始值是默认值,如果是final 会在准备阶段就赋值
解析,符号引用替换为直接引用
3 初始化
给static赋值,初始化是线程安全的
2 方法区




B 多线程
new (新建)-------> runable(就绪) ------->running (运行)------->dead(死亡)
                                                                   |
                    |
                 blocked(阻塞)
1 新建状态(New):当线程对象创建后,进入新建状态,继承thread类和实现runable接口
2 就绪状态(Runnable):当调用线程对象的start()方法,线程进入就绪状态
3 运行状态(Running):当cpu开始调用处于 就绪状态的线程时,线程进入运行状态,调用yield()方法,线程进入到
就绪状态
4 阻塞状态(Blocked):处于运行中的线程由于某种原因暂时放弃对cpu的使用权,停止执行,线程进入阻塞状态
阻塞状态分为3中:
1 等待阻塞:运行中的线程调用wait()方法使线程进入等待池,知道notify()/notifyAll(),线程被唤醒,
放到锁定池,释放同步锁使线程进入就绪状态
2 同步阻塞:线程在获取synchronized同步锁失败
3 其他阻塞:调用线程的sleep()方法或者join()方法或者发出了I/O请求时,线程会进入阻塞状态,当sleep()超时
join()等待线程终止,I/O处理完毕时,线程重新进入就绪状态
5 死亡状态(Dead):线程执行完毕或者因异常退出run方法,该线程结束生命周期


多线程:指的是这个程序(一个进程)运行时产生了不止一个线程
并行与并发:
并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的
资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

线程池:如果多个任务并发,线程的每次创建和销毁很消耗资源,所以使用线程池在服务启动的时候容器中注入固定数量的线程数,使用过程中可以直接使用





C 缓存:EhCache
<!--2)启用缓存注解功能,否则就无法通过注解进行缓存;-->
<cache:annotation-driven cache-manager="cacheManager"/>
<!--3)下面的配置使用了一个Spring提供的EhCacheCacheManager来生成一个Spring的CacheManager,其接收一个Ehcache的
CacheManager,因为真正用来存入缓存数据的还是Ehcache。Ehcache的CacheManager是通过Spring提供的
EhCacheManagerFactoryBean来生成的,可以通过指定ehcache的配置文件位置来生成一个Ehcache的CacheManager。
若未指定则将按照Ehcache的默认规则取classpath根路径下的ehcache.xml文件;若该文件也不存在,则获取Ehcache
对应jar包中的ehcache-failsafe.xml文件作为配置文件。-->
<bean id="ehCacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
</bean>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehCacheManagerFactory"/>
<!-- 表示是否事务环绕的,如果true,则如果事务回滚,缓存也回滚,默认false -->
<property name="transactionAware" value="true"/>
</bean>
cacheable:@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
cacheput:@CachePut 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用
CacheEvict:@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空

 

 


D spring
轻量级框架,
DI/IOC:依赖注入,通过控制反转的技术实现低耦合,一个对象依赖其他对象会通过被动的方式传递进来,而不是自己来创建这 个对象,即不是对象从容器中获取依赖,而是在对象初始化时不等对象请求就主动将依赖传递给他。
容器:Spring包含并处理应用对象的配置和生命周期,从这个层面上来说Spring也是一个容器,你可以配置你的bean是创建一个 单独的实例,还是每次需要时都配置一个新的实例(prototype原型属性)
框架:mvc,客户端发送一个请求,会被Spring核心控制器DispacterSevlet完成转发,控制器调用一个映射的类HadderMapping, 该类将客户端请求映射到对应的处理器controller来实现。
AOP: 通过分离应用的业务逻辑和系统及服务进行内聚性的开发,应用对象只实现自己的业务逻辑,并不负责系统级
关注点例如日志和事物支持,spring支持声明式事物,通过这种方式灵活的进行事物管理,提高开发效率和质量




E ibatis:
1 持久层框架,是支持普通sql,存储过程以及高级映射的持久层框架。
MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的Java 对象)映射成数据库中的记录.
2 mybatis是一个半自动化的ORM实现,Mybatis应用程序是通过xml配置文件创建SqlSessionFactory,SqlSessionFactory再根据
配置获取一个sqlsession,可以通过sqlsession执行映射的sql语句,完成数据的增删改查和事物提交,用完之后关闭sqlsession
3 解除了sql和程序代码的耦合,sql写在xml文件里,便于统一管理和维护
4 动态sql
if:
choose(when,otherwise):
trim(where,set):<trim prefix="WHERE" prefixOverrides="AND |OR ">... </trim>
foreach:
bind:bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>






F shiro
1 是apache下的一个项目,Java的安全框架
2 shiro提供的支持有:认证,授权,会化管理,加密,对web支持,Remember Me,cache缓存
3 shiro对外开放的对象是subject对象,所有的subject都绑定到了SecurityManager中,所以subject只是一个门户,
所有的执行都是在SecurityManager中
4 从外部来看shiro,shiro的工作流程是APP----->Subject---->SecurityManager---->Realm
4.1 Subject:shiro对外开放的对象
4.2 securityManager:安全管理器,shiro的核心,管理者所有的subject,负责进行认证,授权,会话和缓存管理
Authenticator:认证器,负责主题认证
Authrizer:授权器,主体是否有权限进行相应的操作
SessionManager:会化管理
CacheManager:缓存管理,缓存用户,角色,权限等
4.3 realm:shiro从realm中获取安全数据,用户,角色,权限,shiro不提供权限维护,而是通过realm让开发人员自己注入,
可以说一个或者多个
4.4 Cryptography:加密,shiro提供一些常见的密码加密/解密

 

 

 

G nginx:代理服务器和负载均衡
worker_processes:#启动进程,通常设置成和cpu的数量相等
worker_connections 1024;并发数
代理服务器:
负载均衡:服务器集群:upstream
#设定负载均衡的服务器列表
upstream load_balance_server {
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.1.11:80 weight=5;
server 192.168.1.12:80 weight=1;
server 192.168.1.13:80 weight=6;
}

ip_hash轮询方法,不可给服务器加权重
upstream load_balance_server {
ip_hash;
server 192.168.1.11:80 ;
server 192.168.1.12:80 ;
server 192.168.1.13:80 ;
}
H Apache Spring源码
I 设计模式
J activity
K hibernate

L 高并发处理方式

1 添加乐观锁,每次表操作生成一个版本号,最新的版本号提交成功
2 表拆分,比如中国移动
3 添加缓存,负载均衡
提高高并发下访问的效率
1 物理添加增加网络宽带
2 负载均衡,前置代理服务器nginx
3 数据库查询优化,读写分离,分表
4 尽量使用缓存,分布式缓存数据库
5 优化数据库表结构多实用索引,提高查询效率
6 服务器集群解决单台服务器的瓶颈问题
7 使用线程池
8 使用静态页面,比如使用信息发布系统CMS
9 图片服务器分离
并发容易出现的问题:死锁,脏数据可以采用乐观锁的方式解决

代码级别优化:
1 数据库操作代码优化
2 尽量添加缓存
3 使用线程池
4 多使用静态页面比如通过CMS发布
5 图片请求和代码服务器分离
数据库优化:
1 优化数据库中的表结构,多使用索引,提高查询效率
2 表拆分,对于太大的表数据进行表拆分
3 添加版本控制
服务器级别优化:
1 负载均衡,服务器集群
物理硬件优化:
增加网络宽带

 

M 服务端性能优化:缓存,集群,代码优化
1 缓存
(1)访问速度快,减少数据访问时间;
(2)如果缓存的数据进过计算处理得到的,那么被缓存的数据无需重复计算即可直接使用,因此缓存还起到减少计算时间的作用
合理使用缓存:
1 频繁修改的数据
如果缓存中保存的是频繁修改的数据,就会出现数据写入缓存后,应用还来不及读取缓存,数据就已经失效,徒增系统负担。一般来说,
数据的读写比在2:1(写入一次缓存,在数据更新前至少读取两次)以上,缓存才有意义。
数据不一致与脏读
一般会对缓存的数据设置失效时间,一旦超过失效时间,就要从数据库中重新加载。因此要容忍一定时间的数据不一致,如卖家已经编辑了商品属性,
但是需要过一段时间才能被买家看到。还有一种策略是数据更新立即更新缓存,不过这也会带来更多系统开销和事务一致性问题。
1 提高CPU性能的方法
1 并发,线程数不要大于cpu个数
2 减少遍历操作,递归

N 数据库优化
1 创建索引
1 普通索引
2 全文索引
3 多列索引,最左前缀,只要查询条件包含最左边的的列,就会使用这个索引
4 避免查询放弃使用索引,比如使用查询条件是null
避免在 where 子句中使用!=或<>操作符
避免在 where 子句中使用or 来连接条件,可以使用union all
in 和 not in 也要慎用,否则会导致全表扫描
模糊查询使用全文索引
避免在 where 子句中对字段进行表达式操作 select id from t where num/2=100 应改为:select id from t where num=100*2
避免在where子句中对字段进行函数操作 select id from t where substring(name,1,3)='abc' name以abc开头的id,应改为:select id from t where name like 'abc%'
不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算
很多时候用 exists 代替 in
尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型