diff --git a/flag.md b/flag.md new file mode 100644 index 0000000..fb611ec --- /dev/null +++ b/flag.md @@ -0,0 +1,8 @@ +## 春节假期 +1. Netty聊天室 +2. redis +3. nginx +4. tomcat +4. jvm +4. 算法 + diff --git a/jvm/JVM内存模型JMM.md b/jvm/JVM内存模型JMM.md index 26bab54..c88664e 100644 --- a/jvm/JVM内存模型JMM.md +++ b/jvm/JVM内存模型JMM.md @@ -1,23 +1,3 @@ -大对象,新生代存储不下的对象,分配担保直接到老年代。 - -1. 年龄超过15 -2. 相同年龄超过50% -3. 动态年龄分配,不同年龄特别多。 -4. 内存担保,新生代垃圾回收无法完成,直接放入老年代。 **在GC前还会进行一次判断,如果要分配的内存>=Eden区大小的一半,那么会直接把要分配的内存放入老年代中。否则才会进入担保机制。** - -TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个线程专用的内存分配区域。 - -java -XX:+PrintCommandLineFlags -version - -什么样的对象要被GC - -判断回收算法 - -- 引用计数法,相互引用,循环引用 -- 可达性分析,GCroot(本地变量表引用对象,用来关联对象关系、方法区中的静态变量和常量,虚拟机栈中本地变量表(局部变量),static成员,常量引用,本地方法栈中变量,类加载器,Thread)。 -- 不可达对象,finalize可以挽回一次防止回收。 -- 本地方法栈中JNI引用的对象 - ### 对象头内存分配 ![](img\对象头描述.png) diff --git a/jvm/JVM垃圾回收.md b/jvm/JVM垃圾回收.md index d0ce512..736d0fb 100644 --- a/jvm/JVM垃圾回收.md +++ b/jvm/JVM垃圾回收.md @@ -1,3 +1,51 @@ + + +## 参数描述 + +eden:s0:s1=8:1:1 + +https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html + +- -Xms start 起始大小 +- -Xmx max 最大大小 +- -Xmn new 新生代大小 + +多线程分配对象会出现指针碰撞(内存规整,同时初始化对象) + +- CAS 耗时,无法使用 +- TLAB Thread Local Allaction Buffer,每个线程在栈上都有属于自己的一块单独的空间栈上分配。本地线程分配。逃逸分析,对象超出方法使用范围。栈上分配(快速),为逃逸对象在栈上分配 + +内存分配,空间列表 + +- Free List +- Bump the pointer + +### 进入老年代 + + + +大对象,新生代存储不下的对象,分配担保直接到老年代。 + +1. 年龄超过15 +2. 相同年龄超过50% +3. 动态年龄分配,不同年龄特别多。-XX:TargetSurvivorRatio 相同年龄所有对象的大小总和>Survivor空间的一半。 +4. 内存担保,新生代垃圾回收无法完成,直接放入老年代。 **在GC前还会进行一次判断,如果要分配的内存>=Eden区大小的一半,那么会直接把要分配的内存放入老年代中。否则才会进入担保机制。**-XX:+HandlePromotionFailure 检查老年代最大可用的连续空间是否大于历次晋升到老年代的平均大小。 + +TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个线程专用的内存分配区域。 + +java -XX:+PrintCommandLineFlags -version + +什么样的对象要被GC + +判断回收算法 + +- 引用计数法,相互引用,循环引用 +- 可达性分析,GCroot(本地变量表引用对象,用来关联对象关系、方法区中的静态变量和常量,虚拟机栈中本地变量表(局部变量),static成员,常量引用,本地方法栈中变量,类加载器,Thread)。 +- 不可达对象,finalize可以挽回一次防止回收。 +- 本地方法栈中JNI引用的对象 + + + ## GC范围 GC管理的主要区域是Java堆,一般情况下只针对堆进行垃圾回收。方法区、栈和本地方法区不被GC所管理,因而选择这些区域内的对象的引用作为GC roots,被GC roots引用的对象不被GC回收。 @@ -6,4 +54,34 @@ GC管理的主要区域是Java堆,一般情况下只针对堆进行垃圾回 - 并行parallel:多个垃圾收集线程并行工作,此时用户线程处于等待状态。 - 并发concurrent:用户线程和垃圾收集线程同时执行。 -- 吞吐量:用户代码执行时间/(用户代码执行时间+垃圾收集时间) \ No newline at end of file +- 吞吐量:用户代码执行时间/(用户代码执行时间+垃圾收集时间) + +### 垃圾收集器算法 + +**标记—清除算法(Mark-Sweep)(DVM 使用的算法)** + +​ 标记—清除算法包括两个阶段:“标记”和“清除”。在标记阶段,确定所有要回收的对象,并做标记。清除阶段 + +​ 紧随标记阶段,将标记阶段确定不可用的对象清除。标记—清除算法是基础的收集算法,标记和清除阶段的效率不高, + +​ 而且清除后回产生大量的不连续空间,这样当程序需要分配大内存对象时,可能无法找到足够的连续空间。 + +**复制算法(Copying)** + +​ 复制算法是把内存分成大小相等的两块,每次使用其中一块,当垃圾回收的时候,把存活的对象复制到另一块上, + +​ 然后把这块内存整个清理掉。复制算法实现简单,运行效率高,但是由于每次只能使用其中的一半,造成内存的利用率 + +​ 不高。现在的 JVM 用复制方法收集新生代,由于新生代中大部分对象(98%)都是朝生夕死的,所以两块内存的比例 + +​ 不是 1:1(大概是 8:1:1)。 + +**标记—整理算法(Mark-Compact)** + +​ 标记—整理算法和标记—清除算法一样,但是标记—整理算法不是把存活对象复制到另一块内存,而是把存活对象往内存的一端移动,然后直接回收边界以外的内存。标记—整理算法提高了内存的利用率,并且它适合在收集对象 + +​ 存活时间较长的老年代。 + +**分代收集(Generational Collection)** + +​ 分代收集是根据对象的存活时间把内存分为新生代和老年代,根据各个代对象的存活特点,每个代采用不同的垃圾回收算法。新生代采用复制算法,老年代采用标记—整理算法。垃圾算法的实现涉及大量的程序细节,而且不同的虚拟机平台实现的方法也各不相同。 \ No newline at end of file diff --git a/netty/img/architecture.png b/netty/img/architecture.png new file mode 100644 index 0000000..d8b2c22 Binary files /dev/null and b/netty/img/architecture.png differ diff --git a/netty/netty注释.md b/netty/netty注释.md index e69de29..81e1786 100644 --- a/netty/netty注释.md +++ b/netty/netty注释.md @@ -0,0 +1,21 @@ +## Netty核心 + +![](img\architecture.png) + + It is composed of three components - buffer, channel, and event model - and all advanced features are built on top of the three core components. + +## Netty重点类 + +```java +Channel +ChannelFuture +ChannelFactory +ChannelGroup +ChannelGroupFuture +ChannelBuffer +// A ChannelEvent is handled by a list of ChannelHandlers in a ChannelPipeline. +ChannelPipeline +ChannelHandlers +ChannelEvent +``` + diff --git a/spring/springboot/启动.md b/spring/springboot/启动.md new file mode 100644 index 0000000..b33a4dd --- /dev/null +++ b/spring/springboot/启动.md @@ -0,0 +1,76 @@ +```java +SpringApplication.run(PrimarySources.class, args); +``` + +```java +new SpringApplication(primarySources) + setInitializers ApplicationContextInitializer.class + setListeners ApplicationListener.class + Class.forName(stackTraceElement.getClassName()) + private static Map> loadSpringFactories(@Nullable ClassLoader classLoader) { + MultiValueMap result = (MultiValueMap)cache.get(classLoader); + if (result != null) { + return result; + } else { + try { + Enumeration urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories"); + LinkedMultiValueMap result = new LinkedMultiValueMap(); + + while(urls.hasMoreElements()) { + URL url = (URL)urls.nextElement(); + UrlResource resource = new UrlResource(url); + Properties properties = PropertiesLoaderUtils.loadProperties(resource); + Iterator var6 = properties.entrySet().iterator(); + + while(var6.hasNext()) { + Entry entry = (Entry)var6.next(); + String factoryClassName = ((String)entry.getKey()).trim(); + String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue()); + int var10 = var9.length; + + for(int var11 = 0; var11 < var10; ++var11) { + String factoryName = var9[var11]; + result.add(factoryClassName, factoryName.trim()); + } + } + } + + cache.put(classLoader, result); + return result; + } catch (IOException var13) { + throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13); + } + } + } +``` + +1. 设置资源加载(包含类加载器) +2. 设置资源primarySources Map +3. 设置web类型 +4. 设置工厂实例ApplicationContextInitializer,META-INF/spring.factories +5. 设置监听ApplicationListener +5. 加载类,创建实例,排序。 +6. 找到main方法的类 + +```java +public ClassLoader getClassLoader() { + if (this.resourceLoader != null) { + return this.resourceLoader.getClassLoader(); + } + return ClassUtils.getDefaultClassLoader(); +} +``` + +```java +// Run the Spring application, creating and refreshing a new ApplicationContext. +.run(args) +``` + +```java +listeners.starting() +``` + +```java +DefaultApplicationArguments (new SimpleCommandLineArgsParser()).parse(args) +``` + diff --git a/从放弃到入门系列.md b/从放弃到入门系列.md index fc8e53a..ce0b9dc 100644 --- a/从放弃到入门系列.md +++ b/从放弃到入门系列.md @@ -20,4 +20,7 @@ 18. ~~解决方案文档~~ 19. 修改接口确保之前逻辑不变 19. EntityGraph多看源码,注释下同级别有类似注释。 -19. 用心做好每件事,每个人每件事,都值得被认真对待。 \ No newline at end of file +19. 用心做好每件事,每个人每件事,都值得被认真对待。 +19. 做个有意义的主键。 +19. 制定规范,一不变应万变。 +19. 能在内存中操作,就不去数据库。 \ No newline at end of file diff --git a/新建 文本文档.md b/新建 文本文档.md new file mode 100644 index 0000000..0d8514b --- /dev/null +++ b/新建 文本文档.md @@ -0,0 +1,16 @@ +~~网游后端第一版~~ + +-------------------------------------------------------- + +新手班 + +体系学习 + +进阶49-78 + +--------------------------------------------------------------------------------------- + +进阶17-48 + +大厂刷题 + diff --git a/算法/算法和数据结构体系学习班/17图/img/邻接矩阵法.png b/算法/算法和数据结构体系学习班/17图/img/邻接矩阵法.png new file mode 100644 index 0000000..43f7326 Binary files /dev/null and b/算法/算法和数据结构体系学习班/17图/img/邻接矩阵法.png differ diff --git a/算法/算法和数据结构体系学习班/17图/img/邻接表法.png b/算法/算法和数据结构体系学习班/17图/img/邻接表法.png new file mode 100644 index 0000000..0c617e1 Binary files /dev/null and b/算法/算法和数据结构体系学习班/17图/img/邻接表法.png differ diff --git a/算法/算法和数据结构体系学习班/17图/图.md b/算法/算法和数据结构体系学习班/17图/图.md new file mode 100644 index 0000000..6284672 --- /dev/null +++ b/算法/算法和数据结构体系学习班/17图/图.md @@ -0,0 +1,26 @@ +有向图 + +邻接表法、邻接矩阵法描述图 + +![](img\邻接表法.png) + +![](img\邻接矩阵法.png) + +图(Graph)包含点(Node)和边(Edge)。 + +### 宽度优先遍历 + +按照分支一个一个走,栈弹出一个打印一次,Set登记表记录哪些走过。 + +### 深度优先遍历 + +深度优先遍历,入栈打印 + +拓扑序,点数大的小。 + + + + + + + diff --git a/算法/算法和数据结构体系学习班/18、认识一些经典的递归过程/一些经典的递归过程.md b/算法/算法和数据结构体系学习班/18、认识一些经典的递归过程/一些经典的递归过程.md new file mode 100644 index 0000000..e69de29