A_76_Java
2021-04-15 22:54:09 0 举报
AI智能生成
全面、高效的知识图谱:A_76_Java!! 全面又深度的提升认知,达到实际应用的目的! 建议先纵观全局,掌握好大方向。 再根据自己的需要,针对性的学习某一个点,最后做到逐步由点及面。
作者其他创作
大纲/内容
Java
并发
volatile
1. 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2. 禁止进行指令重排序。
synchronized
(1).volatile 仅能使用在变量级别;synchronized 则可以 使用在变量、方法、代码块和类级别的(2).volatile 仅能实现变量的修改可见性,并不能保证原子性; synchronized 则可以保证变量的修改可见性和原子性(3).volatile 不会造成线程的阻塞;synchronized 可能 会造成线程的阻塞。(4).volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化
反射
在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性
线程
wait与sleep
在等待时wait 会释放锁,而sleep 一直持有锁。wait 通常被用于线程间交互,sleep 通常被用于暂停执行
实例方法thread.isInterrupted() 与 静态方法Thread.interrupted()
中断协议
interrupt ( )
可响应中断线程
wait
sleep
join
InterruptedException 当你使用sleep这些方式时,java会从语法级别强制你使用try...cacth...语句接收InterruptedException,即阻塞中的线程如果收到中断信号,会通抛出InterruptedException异常将具体响应处理转移给开发者,同时把中断状态置为true
不可响应中断线程
InputStream
OutputStream
分支主题
异常
throwable
Error
Exception
受检异常
RuntimeException
NullPointerException
ArrayIndexOutOfBoundsException
IndexOutOfBoundsException
ArithmeticException
ClassNotFoundException
IllegalAccessException
IllegalArgumentException
IllegalStateException
非受检异常
非运行时异常
IOException
SQLException
InterruptedException
IllegalAccessException
ClassNotFoundException
NoSuchMetodException
GC
判断对象是否存活的算法
引用计数法
可达性分析算法
垃圾收集算法
标记清除算法
效率问题,标记和清除两个过程的效率都不高
空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
复制算法
标记整理算法
分代收集算法
垃圾收集器
serial
parnew (Serial收集器的多线程版本)
parallel scavenge
serial old
parallel old
cms
G1
内存溢出分析
java.lang.OutOfMemoryError: PermGen space
可能的原因
MaxPermSize设置过小(默认为4M)
tomcat热部署时没有清理之前加载的环境
引用了大量三方jar包
改进
将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的
在 JDK 1.8 中, HotSpot 已经没有 “PermGen space”这个区间了,取而代之是一个叫做 Metaspace(元空间) 的东西。
移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap
StackOverFlowError
原因
存在递归调用
存在循环依赖
尽量将递归调用铺平,减少栈深度
如果你确认递归实现是正确的,为了允许大量的调用,你可以增加栈的大小。依赖于安装的 Java 虚拟机,默认的线程栈大小可能是 512KB 或者 1MB。你可以使用 -Xss 标识来增加线程栈的大小。这个标识即可以通过项目的配置也可以通过命令行来指定
java.lang.OutOfMemoryError: java heap space
java.lang.OutOfMemoryError: unable to create native thread
ORM
Mybatis
Executor
SimpleExecutor
ReuseExecutor
BatchExecutor
延迟加载
插件运行原理
支持的四种接口
ParameterHandler
ResultSetHandler
StatementHandler
逃逸分析
线程逃逸
方法逃逸
高效优化
栈上分配
同步消除
标量替换
锁
可重入锁
1. ReentrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。2. ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合3. ReentrantLock支持可中断处理4. ReentrantLock提供了一个Condition(条件)类,用来实现唤醒与当前锁相关联的线程,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程,粒度更细,效率更高。
ReentrantLock
不可重如锁
集合
Servlet
生命周期
1.构造器
init()
service()
destroy()
实现
HttpServlet
doGet
doPost
doHead
doDelete
doPut
doOptions
doTrace
类加载机制
加载过程
加载
验证
准备
解析
初始化
类加载器
BootstrapClassLoader 启动类加载器
ExtensionClassLoader 扩展类加载器
ApplicationClassLoader 应用程序类加载器 (也称 系统类加载器)
双亲委派模型
好处
JVM参数
Xss
分析工具
jstack
runnable
jstat(JVM Statistics Monitoring Tool)
线程池
newCachedThreadPool
newFixedThreadPool
newSingleThreadExecutor
NewScheduledThreadPool
string
Immutable 不可变性
保证线程安全,无需同步。不可变对象可以被自由地共享
如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。
类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。
因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。
通过反射可破坏其可变性: String str = "123"; System.out.println(str); Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[]) field.get(str); value[1] = '3'; System.out.println(str);
代理模式
为其他对象提供一种代理以控制对这个对象的访问
提供统一接口,在不影响系统调用的情况下进行扩展,即遵循开放封闭原则
代理类型
动态代理
cglib
被代理类不能有final修饰符,否则报错
被代理方法不能有final修饰符,否则代理无效
jdk
静态代理
框架
Spring
IOC
优势
对象的统一托管
规范生命周期
灵活的依赖注入
一致的获取对象方式(默认单例)
重要模块
core
context
aop
expression
orm
mvc
1. 用户请求发送至DispatchServlet
2. DispatcherServlet收到请求调用HandlerMapping处理
3. HandlerMapping找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及拦截器(如果有则生成)一并返回给DispatcherServlet
4. DispatcherServlet调用HandlerAdapter处理
5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6. Controller执行完成返回ModelAndView
7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9. ViewReslover解析后返回具体View
dao
ApplicationContext
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
AnnotationConfigApplicationContext
@Transactional
bean
singleton
prototype
request
session
application
websocket
创建流程
1. 首先执行BeanPostProcessor中的postProcessBeforeInitialization
2. 执行InitializingBean接口中的afterPropertiesSet方法
3. 再执行xml配置中的 init-method方法
4. 最后执行BeanPostProcessor中的postProcessAfterInitialization
bean非线程安全。对于每个bean的线程安全问题,根本原因是每个bean自身的设计。不要在bean中声明任何有状态的实例变量或类变量,如果必须如此,那么就使用ThreadLocal把变量变为线程私有的,如果bean的实例变量或类变量需要在多个线程之间共享,那么就只能使用synchronized、lock、CAS等这些实现线程同步的方法了。
SpringBoot
核心注解 @SpringBootApplication
SpringBootConfiguration
EnableAutoConfiguration
ComponentScan
常见线程安全问题
SimpleDateFormat
常见内存泄露类型
ThreadLocal
虽然Entry是弱引用,里面的key在gc发生时会被回收,但是对应的value还是会造成内存泄露
引用类型
强引用
软引用
弱引用
虚引用
仅有弱引用指向的对象,只要发生gc就会被回收
仅有软引用指向的对象,只有发生gc且内存不足,才会被回收
普通的引用,强引用指向的对象不会被回收
0 条评论
回复 删除
下一页