目录
昨日总结
- JVM底层原理学习,完成对mysql基础篇的快速复习
- cv(停滞中)
- 小林coding--Java虚拟机面试篇(5/5)
- 代码随想录——二叉树的所有路径,左叶子之和
今日计划
- JVM底层原理学习,学习mysql进阶篇
- cv(停滞中)
- 小林coding--Spring面试篇(1/7)
- 代码随想录——找左下下角的值,路径总和
算法——二叉树的所有路径
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 :
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void dg(TreeNode node, List<String> list,String str) {
if(node == null) {
return;
}
if(node.left != null || node.right != null )
str += "-" + ">" + String.valueOf(node.val);
if(node.left == null && node.right == null) {
str += "-" + ">" + String.valueOf(node.val);
list.add(str);
}
dg(node.left,list,str);
dg(node.right,list,str);
}
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<>();
String str = String.valueOf(root.val);
if(root.left == null && root.right == null) {
list.add(str);
return list;
}
dg(root.left,list,str);
dg(root.right,list,str);
return list;
}
}
算法——左叶子之和
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
int leftValue = sumOfLeftLeaves(root.left);
int rightValue = sumOfLeftLeaves(root.right);
int midValue = 0;
if (root.left != null && root.left.left == null && root.left.right == null) {
midValue = root.left.val;
}
int sum = midValue + leftValue + rightValue;
return sum;
}
}
JVM
- JVM中的java对象可以划分为两类,一类是生命周期较短,一类是非常长
- 几乎所有的java对象都是在Eden区被new出来的,绝大部分的java对象的销毁都在新生代进行
- 内存分配算法和内存回收算法是密切相关的
- 对象分配的过程,如下

- Eden区满的时候才会触发YGC/Minor GC,Survivor区满的时候不会触发
- 因为java对象大多都具备朝生夕灭的特性,所有Minor GC非常频繁,一般回收速度也比较快
- Minor GC会引发STW,暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行

- 针对幸存者s0,s1区的总结:复制之后有交换,谁空谁是to;
- 关于垃圾回收:频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间 收集。
- 垃圾回收机制流程图如下

- JVM在GC时,并非每次都对新生代、老年代和方法区区域一起回收,大部分回收的都是新生代
- Minor GC,Major GC,FUll GC 三者
- 内存对象分配的策略,如下

- TLAB(对象分配过程):对Eden区域继续进行划分,JVM为每个线程分配一个私有的缓存区域,在Eden空间内。当多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,被称为快速分配策略。其流程图如下

昨日八股答案
-
GC只会对堆进行GC吗
GC不仅仅只对堆进行垃圾回收,他还会对方法区进行垃圾回收。
大部分的垃圾回收工作都发生在堆上,因为大多数的对象都被分配在了堆上,因此,垃圾回收通常回收堆中不在被引用的对象
方法区中用于存储类信息、常量等数据的区域。虽然方法区中的垃圾回收与堆不同,但是同样存在对无用信息的清理。
-
什么情况下使用CMS,什么情况使用G1
CMS适用于主要针对停顿时间要求敏感且针对老年代回收
G1适用于需要管理大内存堆的场景
-
minorGC、majorGC、fullGC的区别,什么场景触发full GC
Minor GC(Young GC):指针对年轻代进行回收,包括Eden区和两个survivor区。当Eden区空间不足时,JVM会出发一次Minor GC,将Eden区和一个Survivor区中的存活对象移动到另一个Survivor区或老年代
Major GC:主要针对老年代进行回收,但不一定只回收老年代。当老年代空间不足时,会触发。
Full GC:对整个堆内存进行回收。当元空间或永久代空间不足时或进行YGC时,OGC也满时,会触发。
今日八股
- 谈谈对Spring的理解
- Spring IOC 和AOP的理解
- IOC和AOP是通过什么机制来实现的
- 依赖注入的了解