JVM内存模型
私有的 JAVA虚拟栈 本地方法栈 指令计数器
公共的 JAVA虚拟堆 方法区
虚拟栈:用于保存线程处理方法的信息,线程在处理方法时会创建一个栈,用来储存局部变量表,动态链接,操作栈,方法出口等信息,调用方法时调用入栈,返回数据时调用出栈。
指令计数器 当一个线程被调用时计数器加1 没有被调用时计数器减1 当减到0的时候 执行垃圾回收
虚拟堆:用于存放JAVA所有的new对象,供线程使用。根据对象存活的周期不同JAVA使用分代管理,执行垃圾回收
方法区:要加载的类的信息(如类名,修饰符)、类中的静态变量、final定义的常量、类中的field、方法信息
JMM内存模型
首先它是JAVA内存模型,是用来决定JAVA线程的访问规则,每个线程执行方法时 拥有自己的工作内存,工作内存保存的是主内存的副本
例如线程A 对每个变量的读写操作只能是在自己的工作副本完成,修改完以后再更新到主内存里 由线程B去访问
因为有可能造成指令重排序,线程B先访问 线程A后写入 这样线程B就无法读取到正确的数据,所以JMM需要提供原子性 有序性 可见性,
首先 JMM保证基础类型 除(long double)外属于原子性,或者使用synchronized,也可用volatile强制变量赋值同步刷新到主内存,并且它的另一个作用是阻止指令重排序
类加载
1、把.class文件加载到内存
2、验证文件格式,字节码,元数据是否符合编译器要求
3、准备分配内存,例如static 但这里只准备不初始化,默认是0或者null,代码中具体值在初始化阶段。但是final在编译时已经分配好所以不需要
4、字段解析,接口解析,方法解析等
5、初始化静态方法,静态变量
JAVA加载器分为
BootStarp ClassLoader 系统类加载器
Ext ClassLoader 系统类加载器
App ClassLoader 系统类加载器
Custom ClassLoader 自定义加载器
同时加载器以双亲委派模式,就是加载器加载一个请求先由父类加载器执
行,如果父类加载器不行再向上委托直到顶层加载器,同样如果顶层加载
器不能加载再传递给子类加载器,这样的好处是避免重复加载和JAVA核心API被篡改
JAVA GC
什么是GC:就是垃圾回收
如何GC:JAVA在内存不足时会尝试触发GC 或者手动调用 System.gc()
分代管理
JAVA的堆是由分代管理,作用是方便垃圾回收。
分代管理分为:年轻代 老年代 持久代。
年轻代指刚开始存在的数据
年轻代分为3块 Eden | Survivor1 | Survivor2 如果Eden存放满了就会交给Survivor 区交替存放
老年代指存放从年轻代存放较长的数据
永久代指存放类的信息,并且是对象划分方式
垃圾回收方式
1、标记清除法:标记每个可以访问的对象,然后清除掉未标记的对象
2、引用计数法:对象被引用一次+1 没有被引用-1 直到为0则清除,缺点是没法解决循环引用的问题
3、复制法:需要两块大小相同的内存区域,对象分配只在A内存块,回收的时候复制A到B内存块然后清除A内存块。下次又把B内存块复制到A内存块,清除B内存块,就这样交替使用,缺点是内存使用率较低
4、标记整理法:所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
5、分代收集算法:年轻代因为存活对象少就用复制法清理,老年代存活对象多就用标记整理法
JAVA 线程
实现线程的方法可分两个继承Thread类或者实现Runnable接口,当然不管使用哪个都需要实现run方法
当调用Thread.Start()方法时会新建一个线程对象
线程的生命周期为:
NEW 创建
RUNNABLE 等待 因为线程并不会马上开始执行 在这个状态时会暂时 READY 等待CPU调度 然后才进入RUNING注意当进入RUNING状态后会转换成 BLOCKED TIME_WAITING WAITING TERMINATED
BLOCKED 当线程进入到同步块或者同步方法时如synchronized 如果获取锁失败就会进入该状态
TIME_WAITING 有超时时间的等待状态 例如执行了 Thead.sleep(long) Thead.join(long) Object.wait(long)
WAITING 无超时时间等待状态 例如执行了 wait() 在使用了Object.notify()或者Object.notifyAll() 会恢复正常
解决线程的同步互斥方法有 CAS synchronized Lock
什么是AOP
个人理解AOP就是把一个项目里相同的功能点 例如 用户权限验证 剥离出来 通过代理模式来执行
例如 银行取钱 存钱 两个功能 都需要执行验证用户的密码这步骤 但这个步骤跟本身金钱变更并无直接关系且属于完全重复功能,这个时候就可以把密码验证这个功能给剥离出来
AOP有哪些知识点
引用 https://blog.csdn.net/qq_32317661/article/details/82878679
1.通知(Advice)就是你想要的功能,安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。
2.连接点(JoinPoint)这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。
3.切入点(Pointcut)上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
4.切面(Aspect)切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
5.引入(introduction)允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
6.目标(target)引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
7.代理(proxy) 怎么实现整套aop机制的,都是通过代理,这个一会给细说。
8.织入(weaving) 把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时
List和Set区别
List 是有序排列 允许重复值,Set 是无序排列 不允许重复值,共同点是都继承Collection
Bean生命周期
Spring Boot Cloud
Eureka 服务注册中心 所有的服务都要注册在该上面才能相互找到 并且自带轮询功能
Zuul 作用路由器 对权限 拦截器 用户认证 继承ZuulFilter实现拦截器
Feign 负载均衡 通过注解@Client实现各个服务之间的交换
一、关于Java虚拟机底层原理与性能优化
1、Java虚拟机内存模型能说说吗?
2、类加载器的双亲委派模型是什么?
3、JVM垃圾收集算法与收集器有哪些?
4、JVM诊断调优工具用过哪些?
5、每秒几十万并发的秒杀系统为什么会频繁发生GC?
6、日均百万级交易系统如何优化JVM?
二、关于Mysql索引数据结构与性能优化
1、索引数据结构红黑树,Hash,B+树能说下吗?
2、千万级数据表如何用索引快速查找?
3、如何基于索引B+树精准建立高性能索引?
4、联合索引底层数据结构又是怎样的?
5、覆盖索引与聚集索引到底是什么?
6、Mysql最左前缀优化原则是什么?
三、关于BIO,NIO,AIO,Netty及Redis线程模型
1、BIO,NIO,AIO的区别?
2、什么是阻塞IO以及非阻塞IO?
3、Reactor和Proactor IO设计模式是什么?
4、NIO底层select、poll和epoll实现的区别 ?
5、Java NIO的几个核心组成部分是什么?作用分别是什么?
6、Redis、Netty、Tomcat的线程模型与NIO的联系是什么?
网友评论