leetcode-1448. 统计二叉树中好节点的数目
leetcode-1448. 统计二叉树中好节点的数目
1234567891011121314151617181920class Solution { int count = 0; public int goodNodes(TreeNode root) { dfs(root, Integer.MIN_VALUE); return count; } public void dfs(TreeNode root, int preMax){ if (root == null) { return; } if (root.val >= preMax) { count++; } dfs(root.right, Math.max(preMax, root.val)); dfs(root.left, Math.max(preMax, roo ...
leetcode-973. 最接近原点的 K 个点
leetcode-973. 最接近原点的 K 个点
12345678910111213141516171819202122class Solution { public int[][] kClosest(int[][] points, int K) { PriorityQueue<int[]> queue = new PriorityQueue<>((o1, o2) -> { Double dist1 = Math.sqrt(o1[0]*o1[0] + o1[1]*o1[1]); Double dist2 = Math.sqrt(o2[0]*o2[0] + o2[1]*o2[1]); return dist1.compareTo(dist2); }); for(int[] arr : points){ queue.offer(arr); } ...
redis笔记-01 rdb和aof的工作流程
redis笔记
RDB:每隔几分钟生成redis内存中一份完整的快照
AOF:存放每条写命令,当大到一定的程度,制定rewrite操作,基于当时redis的内存结构,来重新构造一个更小的AOF文件,然后将旧的很大的文件删除
RDB持久化机制的工作流程
redis根据配置尝试去生成rdb快照文件
fork一个子线程出来
子进程尝试将数据dump到临时的rdb快照文件中
完成rdb快照文件的生成之后,就会替换之前的旧的快照文件
AOF持久化机制的工作流程
redis fork一个子进程
子进程基于当前内存中的数据,构建日志,开始往一个新的临时的AOF文件中写入日志
redis主进程,接收到client新的写操作之后,在内存中写入日志,同时新的日志也继续写入旧的AOF文件
子进程写完新的日志文件之后,redis主进程将内存中的新日志再次追加到新的AOF文件中
用新的日志文件替换掉旧的日志文件
leetcode-941. 有效的山脉数组
leetcode-941. 有效的山脉数组
123456789101112131415161718192021222324252627282930class Solution { public boolean validMountainArray(int[] A) { // 确定波峰位置 int n = A.length; if(n < 3){ return false; } for(int i = 1; i < n-1; i++){ //判断左边是全上升,右边是全下降 int k1 = i; int k2 = i; while(k1 >= 1 && A[k1] > A[k1-1]){ k1--; } if(k1 != ...
JVM笔记-04jvm核心参数
核心参数
-Xms :java堆内存的大小
-Xmx :java最大可分配的堆内存
-Xmn : 新生代的堆内存大小,扣除之后就为老年代的堆内存大小
-XX:Permsize || -XX:MetaspaceSize :永久代大小
-XX:MaxPermsize || -XX:MaxMetaspaceSize :永久代最大大小
-Xss :每个线程的栈内存大小
-XX:- HandlePromotionFailure:设置为true时,Minor GC会判断平均每个GC剩余的对象大小是否能放入永久代
-XX:PretenureSizeThreshold:大对象直接进入老年代的阈值
-XX:MaxTenuringThreshold:新生代进入老年代的年龄阈值
-XX:+UseParNewGC:新生代使用parNew垃圾回收器
-XX:ParallelGCThreads:并行垃圾回收线程的数量,一般不建议修改这个参数
-XX:+UseCMSCompactAtFullCollection:CMS full gc后进行内存整理
-XX:CMSFullGCsBeforeCompaction: ...
leetcode-349. 两个数组的交集
leetcode-349. 两个数组的交集
123456789101112131415161718192021class Solution { public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set = new HashSet<>(); Set<Integer> ans = new HashSet<>(); for(int i = 0; i < nums2.length; i++){ set.add(nums2[i]); } for(int i = 0; i < nums1.length; i++){ if(set.contains(nums1[i])){ ans.add(nums1[i]); } ...
JVM笔记-03垃圾回收机制
JVM垃圾回收机制
新生代垃圾回收
新生代我们预先分配的内存空间,几乎都被全部对象给占满了!此时假设我们代码继续运行,他需要在新生代 里去分配一个对象,怎么办?发现新生代里内存空间都不够了! 这个时候,就会触发一次新生代内存空间的垃圾回收,新生代内存空间的垃圾回收,也称之为“Minor GC”,有的时候我们 也叫“Young GC”,他会尝试把新生代里那些没有人引用的垃圾对象,都给回收掉。
新生代变成老年代
如果一个实例对象在新生代中,成功的在15次垃圾回收(young gc)之后,还是没被回收掉,就说明他已经15岁了,然后他会被转移到Java堆内存的老年代中去
新生代垃圾回收算法为:标记删除法、复制算法、分代回收算法
标记清除算法
步骤:
1、先找到GC roots根来遍历将非垃圾对象进行标记。
2、他会将垃圾进行清除,就是图中的情况。
注意:jvm并不是真正的把垃圾对象进行了遍历,把内部的数据都删除了,不是这样的,而是把垃圾对象的首地址和尾地址进行了保存,等到再次分配内存时,直接去地址列表中分配,所以清除的效率高。
优点:清除速度快,效率高。
缺点:会产生大量的内存 ...
leetcode-463. 岛屿的周长
leetcode-463. 岛屿的周长
1234567891011121314151617181920212223242526272829class Solution { int n1 = 0; int n2 = 0; public int islandPerimeter(int[][] grid) { int count = 0; n1 = grid.length; n2 = grid[0].length; for(int i = 0; i < n1; i++){ for(int j = 0; j < n2; j++){ if(grid[i][j] == 1){ count += getCount(grid, i-1, j) + getCount(grid, i+1, j) + getCount(grid, i, j-1) + getCount(grid, i ...
JVM笔记-02内存区域划分
JVM内存区域划分
方法区(元数据空间)
程序计数器
java虚拟机栈
堆内存
存放类的方法区
用于存放自己写的各种类的相关信息,如Kafka.class
程序计数器
计算机只能识别字节码指令,当JVM加载类信息到内存后,实际上会使用自己的字节码执行引擎去执行编译出来的代码指令,程序计数器用于记录当前执行的字节码指令的位置
java虚拟机栈
java虚拟机栈可以保存每个方法中的局部变量,每个线程都有自己的java虚拟机栈,当一个线程执行一个方法时就会创建对应的一个栈帧
栈帧中包含局部变量表、操作数栈、动态链接、方法出口
每个方法的执行都代表着入栈和出栈
堆内存
存放在代码中创建的各种对象,如果一个方法中new了一个对象,那么这个对象的引用类型的局部变量就会存放在栈帧的局部变量表里,new出来的对象是放在堆内存中
leetcode-129. 求根到叶子节点数字之和
leetcode-129. 求根到叶子节点数字之和
1234567891011121314151617181920212223class Solution { int ans = 0; public int sumNumbers(TreeNode root) { if(root == null){ return ans; } dfs(root, root.val); return ans; } public void dfs(TreeNode root, int val){ if(root.left == null && root.right == null){ ans += val; return; } if(root.left != null){ dfs(root.le ...