我的学习笔记
2022-02-23 09:12:48 11 举报
Java基础,多线程,jvm,redis
作者其他创作
大纲/内容
main
7
1.Redis的基础知识
伊甸园区Eden
2022-02-07 Spring Bean自动装配
2022-02-14 Redis
1.Lock是显示锁,需要手动开启锁和关闭锁;synchronize是隐式锁,出了作用域自动释放。2.Lock只有代码块锁,synchronize有方法锁和代码块锁。3.使用Lock锁,JVM将花费较少的事件来调度线程,性能更好,扩展性更好。Lock的使用:可重入锁 ReentrantLock lock = new ReentrantLock();
数组的内存分析
2021-12-21 守护线程
Car.class
通过javac命令编译
1.声明数组 int[] array = null; 这个时候,堆内存是空的,只是单纯的忘栈中压入了一个array。2.创建数组array = new int[10]; 这个时候,在堆内存中开辟了一块空间,数组中的元素的值,目前默认都是0。如果数组类型是String,那么,此时,数组中的元素的值,默认都是null。3.给数组中的元素赋值array[0] = 1;array[1] = 2;array[2] = 3;array[3] = 4;array[4] = 5;array[5] = 6;array[6] = 7;array[7] = 8;array[8] = 9;array[9] = 10;当前数组的长度为10,如果获取下标为array[10]中的元素,则会报“数组越界异常”!!!
元空间
2022-02-08 代理模式
4
Join!合并线程!1.Join合并线程,待此线程执行完毕之后,再执行其他线程,其他线程会阻塞。2.可以把JOIN想象成插队。
实例化 new
死锁:多个线程互相抱着对方需求的资源,然后形成僵持的状态。产生死锁的四个必要条件:1.互斥条件:一个资源,每次只能被一个进程使用。2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3.不剥夺条件:进程已获得资源,在未使用完之前,不能强行剥夺。4.循环等待条件:若干进程之间,形成一种头尾相接的循环等待资源关系。
阻塞状态
永久存储区
ServletContext存储数据
1.JVM的位置
abstract 1.不能new,只能靠子类去实现它;约束!!!2.抽象类中可以写普通的方法3.抽象方法必须在抽象类中存在的意义:提高开发效率,把重复的方法抽象出来
创建线程的方式一: 继承Thread类,重写run()方法,调用start()方法,开启线程。子类继承Thread类具备多线程能力,启动线程,子类对象.start();但是,不建议使用:避免OOP单继承局限性创建线程的方式二:实现接口Runnable,具有多线程能力。启动线程,传入目标对象,Thread对象.start();推荐使用,避免单继承局限性,灵活方便,方便同一个对象被多个线程使用。创建线程的方式三:实现Callable接口1.可以定义返回值2.可以抛出异常线程开启,不一定立即执行,由CPU调度执行。
幸存0区
类加载器Class Loader
XML与注解:XML更加万能,适用于任何场合!维护简单!注解不是自己类使用不了,维护相对复杂!XML与注解最佳实践:XML用来管理bean!注解只负责完成属性的注入!
2021-12-15 抽象类
Car1
2021-12-21 静态代理
.Java文件
堆,Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,一般会把 类,方法,变量,常量放在堆中,保存我们所有引用类型的真实对象。
2021-12-13 类的构造器
双亲委派机制:1.类加载器收到类加载请求2.将这个请求向上委托给父类加载器去完成,一直向上委托,直到根加载器。3.根加载器检查是否能够加载当前这个类,能加载就结束。使用当前的加载器。否则,抛出异常,通知子类加载器进行加载。4.重复步骤3。Class Not Found~扩展类加载器再获取父类加载器时,打印出了null,原因是用C开发的,Java程序调用不到。
运行时数据区(Runtime Data Area)Runtime异常一般都是在这个地方发生的。
静态代理模式的优点:1.可以使真实角色的操作更加纯粹,不需要关注一些公共的业务。2.公共业务交给代理角色。实现了业务的分工。3.公共业务发生扩展的时候,方便集中管理。静态代理模式的缺点:一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率低。动态代理模式的优点:1.可以使真实角色的操作更加纯粹,不需要关注一些公共的业务。2.公共业务交给代理角色。实现了业务的分工。3.公共业务发生扩展的时候,方便集中管理。4.一个动态代理类代理的是一个接口,一般就是对应的一类业务。5.一个动态代理类可以代理多个类,只要是实现了同一个接口即可。动态代理:Proxy:生成动态代理实例。InvocationHandle:调用处理程序并返回一个结果。
总结:真实对象和代理对象都要实现同一个接口代理对象要代理真实角色优点:代理对象可以做真实对象做不了的事情真实对象专注做自己的事情
2021-12-22 synchronize和lock的区别
响应Respones
2021-12-22 死锁
class文件
1.虚拟机自带的类加载器2.启动类(根)加载器3.扩展类加载器4.应用程序加载器
5
super注意点:1.super() 是调用父类的构造,必须在构造方法的第一行执行;2.super()只能出现在之类的方法或构造方法中;3.super()和this() 不能同时调用构造方法;VS this代表的对象不同:this代表的是当前对象 super代表父类对象的引用this 没有继承关系也可以使用super必须在继承条件下才可以使用构造方法的区别:this();代表调用本类的构造;super();代表调用父类的构造;
元注解:1.@target 表示我们的注解可以用在哪些地方2.@Retention 表示我们的注解在什么地方还有效 source < class < runtime3.@Documented 表示是否将我们的注解生成在JAVAdoc中4.@Inherited 表示子类可以继承父类的注解
servlet1URL:/s1
test
@Autowired 和 @Resource的区别:1.都是用来自动装配的,都可以放在属性字段上。2.@Autowired通过bytype的方式实现,再通过byname的方式实现。如果,@Autowired不能唯一自动装配上属性,则需要通过Qualifier(value = \"\")。而且,必须要求这个对象存在。【最常用】3.@Resource默认通过byname的方式实现,如果匹配不到名字,则通过bytype的方式实现自动装配。如果两种方式都找不到,则报错!!!4.执行顺序不同:@Autowired通过bytype的方式实现
浏览器
方法区(特殊的堆)
2021-12-21 线程礼让
Java栈
多态:1.多态是方法的多态,属性没有多态2.有父子类关系3.存在继承关系,方法需要重写,父类引用指向子类对象!static方法,属于类,不属于实例final 常量,被final修饰的不可以被重写,不可以被改变private私有的,也不可以被重写
重GC FULL GC
2022-02-08 @Autowired和@Resource的区别
NOSQL特点:1.方便扩展(数据之间没有关系,很好扩展!)2.大数据量高性能(Redis一秒写8万次,读取11万次,NoSQL的缓存记录级,是一种细粒度的缓存,性能比较高!)3.数据类型是多样型的!(不需要事先设计数据库!随取随用!)4.传统RDBMS(关系型数据库)和NoSQL的对比: 传统的RDBMS: - 结构化组织 - 需要写SQL语句 - 数据和关系都存在单独的表中 - 严格的一致性(事务的ACID原则) NoSQL: - 不仅仅是数据 - 没有固定的查询语言 - 键值对存储,列存储,文档存储,图形数据库 - 最终一致性 - CAP定理 和 BASE (异地多活) - 高性能 高可用 高可扩
索引是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。索引的分类:主键索引(PRIMARY KEY) 1.唯一的标识,不可重复,只能有一个列作为主键唯一索引(UNIQUE KEY) 1.避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引。常规索引(index) 1.默认的,index,key关键字来设置全文索引(FullText) 1.在特定的数据库引擎下才有 2.快速定位数据
Native:凡是带了Native关键字的,说明,Java的作用范围达不到了,会去调用底层C语言的库。1.会进入本地方法栈2.调用本地方法接口 JNIprivate native void start0();
8
Servlet Mapping优先级问题:制定了固有映射路径的优先级最高,如果找不到,就走默认的处理请求。
byname的时候,需要保证所有的bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!bytype的时候,需要保证所有的bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!
接口:interface; 接口不能被实例化!!!因为接口中没有构造方法!!!接口中的所有定义的方法,其实都是抽象的(public abstract);类,可以实现接口 implements,实现了接口的类,就需要重写接口中的方法;接口,可以多继承;类,只能单继承;接口中,定义的属性,都是常量;一般不在接口中定义常量;
阻塞事件解除后,线程重新进入就绪状态,等待CPU的调度执行。
1
2022-02-07 Spring
等待CPU调度执行;进入运行状态,线程才开始真正执行线程体中代码
堆
4.堆
本地方法接口
伊甸园区
getClassLoader
servlet
类装载器class loader
所有的Java程序都运行在JVM中
wait()notifyAll()
一个类,即使什么都不写,它也会存在一个方法,这个方法,就叫做构造方法;构造方法没有返回值,方法名和类名相同;使用new关键字创建对象,其本质是在调用构造方法;构造方法可以初始化对象的值;一个类,可以有无参构造方法和有参构造方法;当一个类进行实例化为对象的时候,首先,执行类中的构造方法,执行完毕后,才会new出对象;
我们编写的servlet实现类,重写这些方法:1.接受请求并响应2.给出响应的信息
2021-12-14 面向对象
Request会从service中拿到请求,并把请求之后的响应交给response;
servlet2URL:/s2
2022-02-07 Spring IOC 创建对象的方式
如果报了OOM错误,堆内存溢出的处理方式:1.尝试扩大堆内存看结果2.分析内存,看一下哪个地方出了问题(专业工具)3.分析dump文件:命令:-Xms1m -Xmx8m -XX+HeapDumpOnOutOfMemoryError-Xms 设置初始化分配内存大小 1/64-Xmx 设置最大分配内存大小 1/4-XX+PrintGCDetails 打印GC清理垃圾的信息-XX+HeapDumpOnOutOfMemoryError 下载OOM的信息SRC同级目录下,找到下载下来的dump文件,在JProfiler文件中打开,分析dump文件中定位到的错误代码行数。
2021-12-21 线程五大状态
9
2021-12-28 MySQL-事务
读取响应信息
2021-12-20 多线程
2021-12-28 MySQL-索引
2022-01-17 Cookie和Session
Redis有16个数据库,默认使用第0个数据库。Redis是单线程的。Redis是很快的,官方表示,Redis是基于内存操作的,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以用单线程来实现,所以就使用单线程了。Redis为什么单线程还这么快?误区1:高性能的服务器一定是多线程的吗?误区2:多线程(CPU上下文会切换)一定比单线程效率高吗?运行速度:CPU > 内存 > 硬盘。核心概念:Redis是将所有的数据存储在内存中的,所以说,使用单线程操作效率是最高的。多线程(CPU上下文会切换),对于内存系统来说,如果没有上下文切换效率就是最高的!!!多次读写都是在同一个CPU上,在内存情况下,这就是最佳方案。Redis持久化:RDB 和 AOFRDB规则的触发机制:1.save的规则满足的情况下,会自动触发RDB规则2.执行flushdb命令,也会触发RDB规则3.退出redis,也会产生rdb文件备份就自动生成一个dump.rdb文件如何备份rdb文件?1.只需要将rdb文件放在我们redis启动目录就可以了,redis启动会自动检查dump.rdb文件恢复数据。2.查看需要存在的位置:/user/local/bin 如果在这个目录下存在dump.rdb文件,启动就会恢复rdb文件中的数据。RDB的优点:1.适合大规模的数据恢复!2.对数据的完整性要求不高!RDB的缺点:1.需要一定的时间间隔进行操作!如果redis意外宕机,最后一次修改的数据就没有了!2.fork进程的时候,会占用一定的内存空间!AOF的优点:1.每一次修改都同步,文件的完整会更好2.每秒同步一次,可能会丢失这一秒的数据3.从不同步,效率会更高缺点:1.相对于数据文件来说,aof远远大于rdb,修复的速度也比rdb慢2.aof运行效率也要比rdb慢,所以redis默认的配置就是rdb持久化
Session和Cookie的区别:1.Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)2.Session把用户的数据写到用户独占的Session中,服务器保存,(保存重要的信息,减少服务器资源的浪费)3.Session对象由服务创建使用场景:1.保存一个登录用户的信息2.购物车信息3.在整个网站中经常会使用的数据,将它保存在session中
轻GC
硬件体系
程序计数器
2021-12-08 数组的内存分析
2021-12-22 线程协作
当调用start()方法,线程立即进入就绪状态,但不意味着立即执行
幸存1区
养老区
总结:在配置文件加载的时候,容器中管理的对象就已经开始初始化了!!!
就绪状态
操作系统(Windows、Linux、Mac)操作系统运行在硬件体系上
栈溢出:栈溢出的原因,是因为,如果两个方法互相调用,就是所谓的递归调用。test()方法,调用a()方法,a()方法调用test()方法。直到栈被占满,就会出现栈溢出问题。
new Thread()
栈
新生区
yield!礼让线程!1.礼让线程,让当前正在执行的线程暂停,但不阻塞。2.将线程从运行状态转为就绪状态3.让CPU重新调度,但是礼让不一定成功!执行哪个线程,还是要看CPU的心情。
10
调用servlet的service方法
2.JVM的体系结构
2021-12-21 线程JOIN
本地方法栈
3
优点:1.Spring是一个开源的免费的框架(容器)!!!2.Spring是一个轻量级的、非入侵式的框架!!!3.控制反转(IOC),面向切面变成(AOP)!!!4.支持事务的处理,对框架整合的支持(可以和目前市面上大部分的框架进行整合)!!!总结一句话:Spring就是一个轻量级的控制反转(IOC)和面向切面(AOP)的框架!!!
2022-01-11 ServletContext
4.栈
servlet3URL:/s3
3.Native、方法区
JVM(JRE包含了JVM)(JVM是用C开发的)JVM运行在操作系统只上
JDK1.8的堆内存结构图
事务: ACID原则原子性:要么都成功,要么都失败一致性:事务前后的数据完整性保证一致隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他的事务的操作数据所干预,因此事务之间要相互隔离。持久性:事务一旦提交,则不可逆,数据被持久化到数据库中。事务提交后,无论是服务器宕机还是断电,数据库重启后,数据都不会发生变化。脏读:一个事务读取了另外一个事务未提交的数据。不可重复读:在一个事务中,读取表中的某一行数据,多次读取的结果不同。(这个不一定是错误,只是某些场合不对)。幻读:是指在一个事务内读取到了其他事务插入的数据,导致读取前后数据不一致。
2022-02-09 JVM
a
当调用sleep、wait或同步锁定时,线程进入阻塞状态,代码无法继续往下执行
2
6
本地方法库
此区域不会有垃圾回收
2022-02-09 声明式事务
web容器
daemon!守护线程!1.线程分为 用户线程 和 守护线程2.虚拟机必须确保用户线程执行完毕3.虚拟机不用等待守护线程执行完毕4.当用户线程执行完毕后,守护线程等一会儿才能结束,是因为虚拟机停止需要时间
运行状态
重写:需要有继承关系,子类重写父类的方法1.方法名必须相同2.参数列表必须相同3.修饰符:范围可以扩大,但不能缩小4.抛出的异常:可以被缩小,但不能扩大为什么需要重写?父类的功能,子类不一定需要,或者不一定满足
2022-01-11 Servlet原理
web容器启动的时候,它会为每个web程序创建一个对应的ServletContext对象,它代表了当前的web应用。我们的web应用,是被ServletContext对象来管理。共享数据:我在这个servlet中保存的数据,可以在另外一个servlet中拿到。
加载、初始化
getClass
2021-12-24 注解
dead
发送http请求
Car3
array
请求Request
所谓的JVM调优,99%都是在 方法区和堆 里边进行调优
栈:可以想象成为一个桶。先进后出的原则。栈:栈内存,主管程序的运行,生命周期和线程同步。假设:在一个类中,main方法,调用了test方法。那么,首先,先将main()方法压入栈中,再将test()方法压入栈中,当test()方法执行结束后,先弹出。main()方法结束后,再弹出。先进后出。栈如果空了,代表程序也就结束了。队列:就像是一根水管,先进先出的原则。(FIFO,first input,first output)。
如果是首次请求,会生成servlet
线程中断或者结束,一旦进入死亡状态,就不能再次启动线程。
2.类加载器
事务ACID原则:原子性一致性隔离性持久性
执行引擎
Car2
收藏
0 条评论
下一页