Java
2021-10-21 13:55:45 0 举报
AI智能生成
后端开发
作者其他创作
大纲/内容
类加载机制
加载过程
加载
验证
准备
解析
初始化
类加载器
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
SpringBoot
核心注解 @SpringBootApplication
SpringBootConfiguration
EnableAutoConfiguration
ComponentScan
常见线程安全问题
SimpleDateFormat
分支主题
常见内存泄露类型
ThreadLocal
虽然Entry是弱引用,里面的key在gc发生时会被回收,但是对应的value还是会造成内存泄露
引用类型
强引用
软引用
弱引用
虚引用
并发
volatile
1. 保证了不同线程对这个变量进行操作时的可见性,即一个
线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2. 禁止进行指令重排序。
synchronized
反射
在运行状态中,对于任意一个实体类,都能够知道这个类
的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性
线程
wait与sleep
在等待时wait 会释放锁,而sleep 一直持有锁。
wait 通常被用于线程间交互,sleep 通常被用于暂停执行
实例方法thread.isInterrupted() 与 静态方法Thread.interrupted()
中断协议
interrupt ( )
可响应中断线程
wait
sleep
join
不可响应中断线程
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(元空间) 的东西。
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
Executor
逃逸分析
线程逃逸
方法逃逸
高效优化
栈上分配
同步消除
标量替换
锁
可重入锁
synchronized
ReentrantLock
不可重如锁
集合
分支主题
Servlet
生命周期
1.构造器
init()
service()
destroy()
实现
HttpServlet
doGet
doPost
doHead
doDelete
doPut
doOptions
doTrace
0 条评论
下一页