JVM-01-类加载子系统
从零开始的 JVM 学习生活JVM 作为 Java 运行的平台,的确是需要好好玩一玩的!
JVM 声明周期JVM 生命周期分为 启动 执行 结束 三个阶段。
启动通过 BootStrap ClassLoader 这个类加载器把该虚拟机的初始类加载进来并执行(初始类负责完成启动工作,不同的 JVM 初始类叫法不同)
执行一个 Java 程序的执行本质就是一个 JVM 进程的执行,执行过程中可以看到 OpenJDK Platform 这个进程的资源使用情况。
结束JVM 结束可能情况:
正常程序结束
出现错误和未处理异常
操作系统出现错误
Java 某个线程调用了 exit 方法(会结束整个 JVM 进程)
类加载子系统Class Loading SubSystem
这个系统主要负责将一个 class 文件加载到 JVM 中的全过程,而这个过程包含下面的 加载-链接-初始化 三个步骤。
加载 Loading加载 Loading 过程主要干了三件事:
先获取类的二进制字节流(读取 class 文件获取流)
将二进制字节流转化为内存中方法区的数据(将文件内容转移到内存中固定格式的数据)
...
JVM-00-工具使用
JVM 相关设置-XX:+PrintFlagsInitial 打印所有 JVM 的默认参数。
-XX:+PrintFlagsFinal 打印经过修改之后的 JVM 参数。
-XX:+PrintGCDetials 执行过程中输出 GC 的过程。
-Xms100m 等价于 -XX:InitialHeapSize=100m 设置堆空间的初始内存大小为 100m,默认为物理内存 1/64。
-Xmx100m 等价于 -XX:MaxHeapSize=100m 设置对空间的最大内存大小为 100m,默认为物理内存 1/4。
-Xss1m(可以附加单位)等价于 -XX:ThreadStackSize=1024(指定单位为 kb)
-XX:SurvivorRatio=8 设置 S0 S1 区和 Eden 区比例为 1:1:8 。
-XX:NewRatio=3 设置新生代和老年代的比例为 1:3。
-XX:MaxTenuringThreshold=10 设置 S 区晋升老年代的时间门槛为生存 10 次 GC。
Parallel GC 设置-XX:+UseParallelGC 和 -XX:+UsePara ...
JVM 疑问表
List
被加载到内存的类的具体格式是什么位置在哪里,每一部分的信息是如何放到内存中的,又是如何提供给外界访问的。
将符号引用解析为直接引用的过程是如何实现的,Hash 表吗?
早期绑定,晚期绑定,静态链接,动态链接概念上的区别。
晚期绑定的流程是什么样的,是对运行时常量池中替换还是虚拟机栈中的动态链接进行替换?
为什么 Java 中的 Lambda 表达式是动态语言特性,哪里体现了变量类型是由运行时的值确定的?将 Lambda 赋值给一个变量不也需要声明变量的接口类型吗。
虚方法表在内存中的位置是哪里,多态的具体实现原理,方法分派的流程。
JavaByteCodeResolver 项目记录
MUTF Charset 实现BytesTo Double Float整个实现的细节 etc
QAQ ,明天早上就去写!!!
LeetCode-算法入门
LeetCode
关于老年退役 OIer 竟然忘光光所有的算法和数据结构,然后从所有 OIer 和 ACMer 都看不起的 LeetCode 开始学习算法和数据结构的故事。
二分算法模板为什么不是具体分析而是二分模板呢,因为具体分析太乱了,left right 的范围,while 循环结束的条件,每一次 mid 判断之后,left 和 right 变化的过程。每一道题目都不一样,所以二分还是要这样写:
12345678while(left+1<right) { //推出循环条件就是 left+1==right mid=left+(right-left)/2; if(nums[mid]>target) right=mid; else left=mid;}//退出循环之后,需要的答案就在 left 或者 right 里面,只需要对他们两个进行判断就好了if(XXX) XXX; // 单独判断 leftif(XXX) XXX; // 单独判断 right
算法题目都很简单就不搞了。
双指针算法模板没有模板。
旋转数组题目描述
给定一个数组 ...
SpringBoot-06-数据访问
数据库连接starter-data-jdbc分析 SpringBoot 的流程,就是导入 starter,它可以帮我们所有可以默认配置的东西都配置了,除了数据库类型和数据库配置。
可以看到为我们导入了 Spring 的 JDBC 数据库相关包 (beans,tx,core),一个数据库连接池 HikariCP,然后就是 Spring-Data 的东西了。
我们现在导入数据库驱动,因为 starter-data-jdbc 已经仲裁版本:
1<mysql-connector-java.version>8.0.23</mysql-connector-java.version>
所以我们引入数据库驱动的时候,其实是可以不写版本号的,但是因为驱动版本过高,所以修改一下降低驱动版本。
12345<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5. ...
SpringBoot-05-视图解析与模板引擎
视图解析流程视图解析的地方主要是从返回值开始的,上一篇已经分析了返回值的处理流程,其中用于处理视图的有下面几种:
123StringModelAndViewView
重定向 redirect我们以常用的 ViewNameMethodReturnValueHandler 来说(就是处理返回值为 String 的):
先将视图名放到 ModelAndViewContainer 中,然后判断是不是重定向视图(看有没有 forward: 开头),经过各种数据获取之后,将 ModelAndViewContainer 里面的东西抽取并返回一个 ModelAndView 对象。
有了 ModelAndView 对象之后,也就是有了数据和视图名了,就可以去处理派发结果了调用 processDispatchResult() -> render() 来渲染我们要得到的页面:
遍历所有的视图解析器(ViewResolver),通过视图名来找到可以处理当前视图的 ViewResolver,找到之后,就通过 ViewResolver 解析视图名来得到视图 View:
(比如能处理的 redirect:/ ...
SpringBoot-04-动态资源处理
RestFul 风格装配原理装配 SpringMVC 的时候就已经装配了 HiddenHttpMethodFilter,我们只需要在配置文件中开启使用即可。
123456789@Bean@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})@ConditionalOnProperty( prefix = "spring.mvc.hiddenmethod.filter", name = {"enabled"})public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() { return new OrderedHiddenHttpMethodFilter();}
我们就需要配置:
12345spring: mvc: hiddenmethod: filter: enabled: true #开启页面表单的Rest功能 ...
SpringBoot-03-开发技巧 & 静态资源处理
一些开发技巧Lombok 简化引入 Lombok 依赖:
1234<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId></dependency>
Lombok 主要解决 Bean 的臃肿问题,需要注意的是 Lombok 无法生成多种参数的构造器:
12345678910111213141516171819@Setter // 注解在类或字段,注解在类时为所有字段生成 setter 方法,注解在字段上时只为该字段生成 setter 方法。@Getter // 使用方法同上,区别在于生成的是 getter 方法。@ToString // 生成 toString 方法@EqualsAndHashCode // 生成 eauqls 和 hashCode 方法@NoArgsConstructor // 生成无参构造器@AllArgsConstructor // 生成全参数构造器@RequiredArgs ...