面试系列(五)| JVM垃圾回收算法
JVM 分代收集理论有哪些? 强分代:新生代和老年代 弱分代:新生代和老年代 跨代引用:记忆集【有跨代(dirty)、无跨带(clean)】 分代收集 强分代假说:强分代假说指的是 JVM 认为绝大多数对象的生存周期都是朝生夕灭的; 弱分代假说:弱分代假说指的是只要熬过越多次垃圾收集过程的对象就越难以回收(看来对象也会长心眼)。 就是基于这两个假说理论, JVM 将堆区划分为不同的区域,再将需要回收的对象根据其熬过垃圾回收的次数分配到不同的区域中存储。 JVM 根据这两条分代收集理论把堆区划分 新生代 (Young Generation) :每次垃圾收集时都发现有大批对象死去 老年代 (Old Generation):剩下没有死去的对象会直接晋升到老年代中 跨代引用 上面这两个假说 没有考虑对象的引用关系,而事实情况是,对象之间会存在引用关系,基于此又诞生了 跨代引用假说 (Intergeneration Reference...
面试系列(四)| 虚拟机JVM
JVM 的主要作用是什么?JVM 就是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 屏蔽了与具体操作系统平台相关的信息,使 Java 程序只需生成在 Java 虚拟机上运行的目标代码 (字节码),就可以在不同的平台上运行。 据验证Java 的内存区域?JVM 在执行 Java 程序的过程中会把它管理的内存分为若干个不同的区域,这些组成部分有些是线程私有的,有些则是线程共享的,Java 内存区域也叫做运行时数据区,它的具体划分如下: 虚拟机栈 : Java 虚拟机栈是线程私有的数据区,Java 虚拟机栈的生命周期与线程相同,虚拟机栈也是局部变量的存储位置。方法在执行过程中,会在虚拟机栈中创建一个 栈帧(stack frame)。每个方法执行的过程就对应了一个入栈和出栈的过程。 本地方法栈: 本地方法栈也是线程私有的数据区,本地方法栈存储的区域主要是 Java 中使用 native...
面试系列(三)| 幂等性
幂等性 HTTP/1.1 中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。 这里需要关注几个重点: 幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。 幂等还包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。 幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。 网络超时等问题,不是幂等的讨论范围。 幂等性是系统服务对外一种承诺(而不是实现),承诺只要调用接口成功,外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。 什么情况下需要幂等业务开发中,经常会遇到重复提交的情况,无论是由于网络问题无法收到请求结果而重新发起请求,或是前端的操作抖动而造成重复提交情况。 在交易系统,支付系统这种重复提交造成的问题有尤其明显,比如: 用户在 APP...
面试系列(二)| SpringCloud 面试题
微服务基础1.什么是微服务架构 微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务 运行在自己的进程中,并使用轻量级的机制通信。这些服务围绕业务能力来划分,并通过自动化部 署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。 2.为什么需要学习Spring Cloud 首先Spring Cloud基于Spring Boot的优雅简洁,可还记得我们被无数xml支配的恐惧?可还记得 Spring MVC ,Mybatis 错综复杂的配置,有了Spring Boot,这些东西都不需要了,Spring Boot好处不再赘诉,Spring Cloud就基于Spring Boot把市场上优秀的服务框架组合起来,通过Spring Boot风 格进行再封装屏蔽掉了复杂的配置和实现原理 什么叫做开箱即用?即使是当年的黄金搭档 Dubbo + ZooKeeper下载配置起来也是颇费心神的!而 Spring Cloud完成这些只需要一个jar的依赖就可以了! Spring Cloud大多数子模块都是直击痛点,像...
面试系列(一)| SpringBoot 面试题
1.什么是 SpringBootSpring组件一站式解决方案,主要简化了 Spring 难度,简省了繁重的配置,提供了各种的启动器,是开发上手快 2.Spring Boot 优点 开箱即用,原理繁琐配置 内嵌服务器、安全管理、运行数据监控、运行状态检查、外部化配置 易上手开发效率高,有完善的第三方start库和官网 starter 总结:编码、配置、部署、监控 简单 2.SpringBoot 启动类注解?它是由那些注解组成?@SpringBootApplication @SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。 @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项 @SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) @ComponentScan:Spring组件扫描 3.yaml是什么用来表达数据序列化的参数 4.SpringBoot启动方式 main方法 命令行 java...
Java系列(七)| 日志快速入门
前言日志和异常处理结合得当的话,会给项目维护带来非常大的价值。 日志:就是介绍一个过程和经历的详细记录。 项目日志:就是项目开发过程的详细记录,一般由项目经理记录。 代码里的日志:就是程序员记录某个开发过程的详细情况,这是项目里每个程序员需要做的工作。 代码里的日志在项目中扮演着非常重要的角色,日志记录的详细程度决定系统是否容易维护,Java 项目中日志记录的框架有很多,在项目中如何选型也必将困惑。 我们这场 chat 讨论的主题就是:Java 代码里的日志,主要是写给 Java 程序员看的,本篇 Chat 从以下六个方面对 Java 日志进行阐述: 一、日志在项目中的作用 二、Java 日志使用的困惑 三、Java 日志演化历史 四、使用不同框架的 Java 日志示例说明 五、项目中日志记录遵守哪些原则 六、一个推荐的项目 Java 日志实例 以期通过本场 Chat 的学习,能使大家在编码过程中,对日志的处理过程加深认识、统一规范、得到收获,从零开始轻松掌握 Java...
前端系列(一)| Vue 快速入门
Vue 快速入门1.Vue 入门1.1 下载 Vuejs//开发版本 <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> //生产版本 <!-- 生产环境版本,优化了尺寸和速度 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script> 1.2 Vue第一个应用<div id="app"> {{msg}} {{username}} {{pwd}} </div> <!--建议放到临近的js位置--> <!--1.引入vue.js--> <script...
Java系列(六)| JDK1.8 新特性
JDK 已经出到 17 了,但是你迭代你的版本,我用我的 8。JDK1.8 的一些新特性,当然现在也不新了,其实在工作中已经很常用了。 JDK1.8 都有哪些新特性?JDK1.8 有不少新特性,我们经常接触到的新特性如下: 接口默认方法:Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字修饰即可 Lambda 表达式和函数式接口:Lambda 表达式本质上是一段匿名内部类,也可以是一段可以传递的代码。Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中),使用 Lambda 表达式使代码更加简洁,但是也不要滥用,否则会有可读性等问题,《Effective Java》作者 Josh Bloch 建议使用 Lambda 表达式最好不要超过 3 行。 Stream API:用函数式编程方式在集合类上进行复杂操作的工具,配合 Lambda 表达式可以方便的对集合进行处理。 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream API...
Java系列(五)| 序列化、泛型、注解、反射
序列化什么是序列化?什么是反序列化?什么是序列化,序列化就是把 Java 对象转为二进制流,方便存储和传输。 所以反序列化就是把二进制流恢复成对象。 序列化和反序列化 类比我们生活中一些大件物品的运输,运输的时候把它拆了打包,用的时候再拆包组装。 Serializable 接口有什么用? 这个接口只是一个标记,没有具体的作用,但是如果不实现这个接口,在有些序列化场景会报错,所以一般建议,创建的 JavaBean 类都实现 Serializable。 serialVersionUID 又有什么用? serialVersionUID 就是起验证作用。 private static final long serialVersionUID = 1L; 我们经常会看到这样的代码,这个 ID 其实就是用来验证序列化的对象和反序列化对应的对象 ID 是否一致。 这个 ID 的数字其实不重要,无论是 1L 还是 IDE 自动生成的,只要序列化时候对象的 serialVersionUID 和反序列化时候对象的 serialVersionUID 一致的话就行。 如果没有显示指定...