Apache2 + webdav on ubuntu
Apache2 + webdav on ubuntu[toc] 系统环境 Ubuntu 20.04.2 Apache/2.4.41 (Unix) 安装Apache安装Apache1sudo apt-get install apache2 禁用默认页面12sudo a2dissite 000-default.confsudo service apache2 reload 配置虚拟主机此时,我们需要使用ServerName:webdav.local.conf和附加的目录/var/www/webdav配置虚拟主机。为此,请导航至/etc/apache2/sites-available/: 1cd /etc/apache2/sites-available/ 并创建一个名为webdav.local.conf的新站点配置文件,其内容如下: 12345678910111213141516<VirtualHost *:80> ServerAdmin webmaster@localhost Servername webdav.loc...
SpringSecurity
SpringSecurity 绿色:认证用户的身份,检查当前请求是否有此过滤器需要的信息,如果有就尝试认证 蓝色:ExceptionTranslationFilter,捕获后面的类抛出来的异常,做相应的处理 最终到达FilterSecurityIntercepter:决定当前的请求能否访问后面的服务,依据用户的配置,如某个请求是否需要认证才能访问,如果是就看是否有认证信息, Spring Social 实现三方登陆 这是第六步,获取信息,所以继承AbstractOAuth2ApiBinding(其内有令牌和RestTemplet帮我们获取信息)
ThreadLocal
ThreadLocal使用场景 每个线程需要一个独享的变量(通常是工具类,典型需要使用了类有SimpleDataFormat和Random) 每个线程需要保存全局变量(如在拦截器中获取哦那个户的信息),可以让不同的方法直接使用,避免传递参数的麻烦 场景一,每个线程需要独享的对象 每个Thread内有自己的实例副本,不共享 见代码 场景二 避免传递参数 见代码 使用ThreadLocal有哪些好处 达到线程安全 不用加锁,执行效率高 更高效的节省内存,减小开销 免去传参的繁琐,降低代码耦和 ThreadLocal 原理 每个Thread会持有一个ThreadLocalMap(一对一关系) 一个ThreadLocalMap存储多个ThreadLocal对 主要方法介绍 T initialValue() 返回当前线程对应的初始值,这是一个延迟加载,只有调用get()后才会触发 当线程第一次使用get()方法访问变量时将调用此方法,除非在此之前先用过了set()方法,则不会调用initialValue() 通常线程只调用一次此方法就够了,单数如果调用了remove()再...
SpringBoot自动装配
SpringBoot 自动装配 SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。 自动配置原理1). SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration2). @EnableAutoConfiguration作用: 过@import方式引入了EnableAutoConfigurationImportSelector EnableAutoConfigurationImportSelector是一个ImportSelector,我们查看其selectImports方法,其内部调用getCandidateConfigurations方法,读取META-I...
JUC知识点梳理
J.U.C知识点梳理java.util.concurrent:提供了并发编程的解决方案 CAS是java.util.concurrent.atomic包的基础 AQS是java.util.concurrent.locks包以及一些常用类比如Semophore,ReentrantLock等类的基础 J.U.C包等分类 线程执行器executor 锁locks 原子变量类atomic 并发工具类tools 并发集合collections 并发工具类 闭锁:CountDownLatch 让主线程等待一组事件发生后继续执行 事件指CountDownLatch里的countDown()方法 demo: 栅栏:CyclicBarrier 等待其他线程,且会阻塞自己的当前线程,所有线程必须同时到达栅栏位置后,才能继续执行 所有线程到达栅栏处,可以触发执行另一个预先设置的线程 demo: 信号量:Semaphore 控制某个资源可以被同时访问的线程个数 demo: 交换器:Exchanger 两个线程到达同步点后,互相交换数据 demo:new了只有两个线...
反射
反射Java反射机制是在运行状态中, 对于任何一个类,都能够知道这个类的所有属性和方法; 对于任何一个对象,都能够任意调用他的方法和属性; 这种动态获取信息和动态调用对象方法的功能就叫做反射机制。
ClassLoader
ClassLoader类从编译到执行的过程 编译器将源文件转化为字节码文件 ClassLoader将字节码转化为JVM中的Class<T>对象 JVM利用Class<T>对象实例化为T对象 ClassLoaderClassLoader在java中有着非常重要的作用,它主要工作在class装载的加载阶段,其主要作用是从外部系统获得class二进制数据流,它是java的核心组件,所有的class都是由ClassLoader进行加载的,ClassLoader负责通过将class文件里的二进制数据流装进系统,然后交给java虚拟机进行连接、初始化等操作。 ClassLoader的种类 BootStrapClassLoader:C++ 编写,加载核心库java.*(例如java.lang) 通常这些核心类被签名,不能被替换掉 ExtClassLoader:Java编写,加载扩展库javax.* 是用户可见的ClassLoader AppClassLoader:Java编写,加载程序所在目录(class.path) 自定义ClassLoader:Java编写...
内存模型
内存模型 Runtime Data Aera Method Area:是Java虚拟机规范中的概念,在HotSpot的实现中: JDK7及以前,HotSpot用永久带来实现方法区,存在jvm内存中,与堆连续的地址空间,GC和老年代一起。 JDK8及以后,HotSpot把很多东西放到了堆或者本地内存,而方法区则成为了元空间的实现,同时元空间不再与堆连续,而且是存在于本地内存(Native memory)。 JVM内存模型 线程私有:程序计数器,虚拟机栈,本地方法栈 线程共享:MetaSpace、Java堆 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看做是当前线程所执行的字节码行号的指示器; 字节码解释器工作时,通过改变计数器的值选取下一条执行的字节码指令;(一些基本功能都需要依赖计数器来完成 如 分支 循环 跳转 异常处理 线程恢复 等) 和线程一对一关系,即线程私有。java虚拟机多线程是通过线程间轮流切换来分配给处理器执行时间;在确定时间节点,一个处理器(一核)只会执行一个线程的指令;为保证线程切换回来后能恢复到原执...
常考题型
JVM三大性能调优参数 -Xms -Xmx -XSS的含义 -Xss:规定了每个线程虚拟机栈(堆栈)的大小 此配置影响并发线程数大小 -Xms:堆的初始值 -Xmx:堆能达到的最大值 Java内存模型中堆和栈的区别——内存分配策略存储方案: 静态存储:编译时确定每个数据目标在运行时的存储空间需求 栈式存储:数据区需求在编译时未知,运行时模块入口前确定 堆式存储:编译或运行时模块入口都无法确定,动态分配。 堆和栈的联系引用对象、数组时,栈里定义变量保存堆中目标的首地址 区别 管理方式:栈自动释放,堆需要GC 空间大小:栈比堆小 碎片相关:栈产生的碎片远小于堆 分配方式:栈支持静态和动态分配,堆只支持动态分配 效率:栈的效率高 元空间、堆、线程独占部分间的联系——内存角度示例如下: 元空间: 保存装载进来的HelloWorld对象的信息及其Method和Field。 额外还有System这个类对象及该类中的成员变量和方法等 堆: 存储HelloWorld类创建出来的对象实例object,以及String实例“test” 线程独占: 当程序执行时,ma...
GC
GC 垃圾回收机制判断对象是否为垃圾的算法引用计数算法 通过判断对象的引用数量来决定对象是否可回收 每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1 优点:执行效率高,程序执行受影响较小 缺点:无法监测出循环引用的情况,导致内存泄露 由于其缺点的存在,主流JVM基本不使用此方式。 可达性分析算法 通过判断对象的引用链是否可达来就决定对象是否可以被回收 对内存中的整个对象图进行遍历,从GC Root开始,回收器将所有访问到的对象标记为存活,完成遍历后不可达的对象会被作为垃圾对象而清除。 可以作为GC Root的对象 虚拟机栈中引用的对象(栈帧中的本地变量表) 方法区中的常量引用的对象 方法区中的类静态属性引用的对象 本地方法栈中JNI(Native方法)的引用对象 活跃线程的引用对象 垃圾回收算法标记-清除算法(Mark and Sweep)将回收分为两个阶段 标记:使用可达性算法,从根集合进行扫描,对存活的对象进行标记。 清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存。同时将可达标记清除,以便进行下一次回收。 缺点: 碎片化:由于标记清除不...








