1. 前言

在面试的时候,往往面试官除了想知道你知道了啥,更想知道你思考了啥,比如一个技术,你为啥要用它?使用过程中遇到了什么问题?你是怎么解决这个问题的?

此文档用于记录

(1)一些了解和学习到的技术栈;

(2)生活工作或者生活中遇到的技术问题,以及将会解决的问题

2. java

2.1 java基础

  • https://github.com/doocs/advanced-java

    互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识,后端同学必看,前端同学也可学习

  • https://github.com/Snailclimb/JavaGuide

    【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。

  • https://github.com/CyC2018/CS-Notes

    技术面试必备基础知识、Leetcode、计算机操作系统、计算机网络、系统设计、Java、Python、C++

  • https://github.com/xingshaocheng/architect-awesome

    后端架构师技术图谱

2.2 java应用

  • https://github.com/halo-dev/halo

    一款现代化的个人独立博客系统,语言java

  • https://github.com/xkcoding/spring-boot-demo

    spring boot demo 是一个用来深度学习并实战 spring boot 的项目,目前总共包含 65 个集成demo,已经完成 52 个。

  • https://github.com/elunez/eladmin
    https://github.com/elunez/eladmin-web
    一个基于 Spring Boot 2.1.0 、 Spring Boot Jpa、 JWT、Spring Security、Redis、Vue的前后端分离的后台管理系统

2.3 学习记录

2.3.1 jvm底层
  • java内存区域详解

    https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/jvm/Java%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F.md

  • java虚拟机栈执行原理深入详解

    https://blog.csdn.net/HarderXin/article/details/103924865

  • java虚拟机

    https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E8%99%9A%E6%8B%9F%E6%9C%BA.md

    jdk(开发工具包) > jre(运行环境) > jvm(java虚拟机)

  • 堆与栈的概念

    堆和栈是程序运行的关键:栈是运行时的单位,而堆是存储的单位。

    栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

    在Java中一个线程就会相应有一个线程栈与之对应,而堆则是所有线程共享的。

    栈存储的信息都是跟当前线程(或程序)相关信息的,包括:局部变量、程序运行状态、方法返回值等等。

    堆只负责存储对象信息。
    简单来说:堆中存的是对象,栈中存的是基本数据类型和堆中对象的引用。

  • jvm性能调优

    参考文档:https://blog.csdn.net/rickyit/article/details/53895060

    Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点 但是也可能会导致机器暂时间变慢。比如-Xms200m,表示分配200M。

    Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多 内存,超出了这个设置值,就会抛出OutOfMemory异常。比如-Xms500m,表示jvm进程 多只能够占用500M内存。

    Xss 是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需 占用多少内存,可能会有多少线程同时运行等。默认JDK1.4中是256K,JDK1.5+中是1M

    以上三个参数的设置都是默认以Byte为单位的,也可以在数字后面添加[k/K]或者[m/M 来表示KB或者MB。而且,超过机器本身的内存大小也是不可以的,否则就等着机器变 而不是程序变慢了。

    -XX:PermSize=512m 设置非堆区初始内存分配大小为512m,其缩写为permanent size(持久化内存)。

    -XX:MaxPermSize=512m 设置对非堆区分配的内存的最大上限为512m。

    分类选项说明
    堆空间-Xms启动JVM时的初始堆大小
    堆空间-Xmx堆空间最大值
    新生代空间-XX:NewRatio新生代与老年代的比例
    新生代空间-XX:NewSize新生代大小
    新生代空间-XX:SurvivorRationEden区域SurvivorRation区的比例
    永久代空间-XX:PermSize启动JVM时的初始永久代大小
    永久代空间-XX:MaxPermSize永久代空间最大值
  • 其他工具

    jstack(查看线程)、jmap(查看内存)和jstat(性能分析)

    (1)jps
    查询java进程的pid

    (2)jmap

    jvm自带的一种内存映像工具。

    参数有:

    -heap:打印jvm heap的情况

    -histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。

    -histo:live :同上,但是只打印存活对象的情况

    -permstat:打印permanent generation heap情况

    # 用法 jmap [ option ] pid
    jps
    # jps 查出来相应pid,例如11111
    jpam -heap 11111
    

    (3)jstack

    jdk自带的线程堆栈分析工具。

    jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

    /opt/java8/bin/jstack
    
    Usage:
      jstack [-l] <pid>
          (to connect to running process) 连接活动线程
      jstack -F [-m] [-l] <pid>
          (to connect to a hung process) 连接阻塞线程
      jstack [-m] [-l] <executable> <core>
          (to connect to a core file) 连接dump的文件
      jstack [-m] [-l] [server_id@]<remote server IP or hostname>
          (to connect to a remote debug server) 连接远程服务器
    Options:
      -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
      -m  to print both java and native frames (mixed mode)
      -l  long listing. Prints additional information about locks
      -h or -help to print this help message
    
    

    (4)jstat

    JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。

    Usage: jstat -help|-options
      jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    
    Definitions:
    <option>      An option reported by the -options option
    <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                       <lvmid>[@<hostname>[:<port>]]
                  Where <lvmid> is the local vm identifier for the target
                  Java virtual machine, typically a process id; <hostname> is
                  the name of the host running the target Java virtual machine;
                  and <port> is the port number for the rmiregistry on the
                  target host. See the jvmstat documentation for a more complete
                  description of the Virtual Machine Identifier.
    <lines>       Number of samples between header lines.
    <interval>    Sampling interval. The following forms are allowed:
                      <n>["ms"|"s"]
                  Where <n> is an integer and the suffix specifies the units as
                  milliseconds("ms") or seconds("s"). The default units are "ms".
    <count>       Number of samples to take before terminating.
    -J<flag>      Pass <flag> directly to the runtime system.
    
2.3.2 排序和查找

我的博客:

一些常用的排序方法

java基础 - 使用Arrays进行排序和元素查找

2.3.3 判空

我的博客:
java代码如何优雅的判空

2.3.3 lambda表达式
2.3.4 lombok

我的博客:

使用lombok简化你的代码

3. 技术栈

3.1 spring cloud / spring boot

笔记

spring boot默认是单例模式,确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。属于创建型模式。

启动流程

启动流程主要分为三个部分:第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心

一些常用注解

https://www.cnblogs.com/jstarseven/p/11087157.html

@SpringBootApplication

@SpringBootApplication 是 Spring Boot 的核心注解,它是一个组合注解,该注解组合了:@Configuration、@EnableAutoConfiguration、@ComponentScan; 若不是用 @SpringBootApplication 注解也可以使用这三个注解代替。

@EnableAutoConfiguration 让 Spring Boot 根据类路径中的 jar 包依赖为当前项目进行自动配置,例如,添加了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖,那么 Spring Boot 会对 Tomcat 和 Spring MVC 进行自动配置。

@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。

@Configuration
@Bean

@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beanhttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-lazy-init="true">
  <!--bean定义-->
</beans>

等价于

@Configuration
public class MockConfiguration{
    //bean定义
}

@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。

<bean id="mockService" class="..MockServiceImpl">
   ...
</bean>

等价于

@Configuration
public class MockConfiguration{
    @Bean
    public MockService mockService(){
        return new MockServiceImpl();
    }
}

总结

(1)@Configuation等价于

(2)@Bean等价于

(3)@ComponentScan等价于<context:component-scan base-package=”com.dxz.demo”/>

@Controller
@Service
@Repository
@Component

持久层:@Repository
业务层:@Service
控制层:@Controller
中立类:@Component (对那些比较中立的类进行注释)

我的博客:

如何搭建springboot

3.2 docker/k8s

我的博客:

docker新建私人仓库

3.3 Jenkins

我的博客:
ubuntu安装jenkins指南(持续集成)

jenkins问题汇总1(jenkins连接slave失败)

一些常用的jenkins插件及名称

jenkins使用docker作为执行机

3.4 redis(缓存)

  • 使用场景

    高并发读

我的博客:

redis到windows安装及简单使用

redis到ubuntu安装及简单使用

在java中使用redis

3.5 mysql

  • mysql监控

    • canal

      https://juejin.im/post/5e4dfe0e518825492e495623

  • 数据库管理

    • Flyway

      https://juejin.im/post/5e4df438e51d452700566a55

我的博客:

mysql数据库安装和使用

3.6 es

基于 lucene 的分布式搜索引擎—— ElasticSearch,简称为 es

  • 使用场景
    • 高并发全文搜索等

3.7 前端

  • angularJS
  • vue
  • react

我的博客:

初识前端之angularJS

初识前端之vue

个人网站搭建之快速入门

3.8 nginx & tomcat

我的博客:

使用nginx或tomcat在服务器中部署网页

nginx到linux安装及简单使用

nginx常用命令

nginx反向代理实现简单的负载均衡

3.9 消息队列MQ

  • 使用场景
    • 高并发写
  • 工具
    • RabbitMQ

​ https://www.cnblogs.com/williamjie/p/9481780.html

3.10 keeplived

我的博客:

ubuntu使用keepalived设置虚拟ip

keeplived通过虚拟ip实现高可用

3.11 gohttpserve

我的博客:

使用gohttpserve共享你的文件1(windows基础篇)

使用gohttpserve共享你的文件2(linux基础篇)

使用gohttpserve共享你的文件3(docker基础篇)

3.12 linux

我的博客:

linux命令练习

3.13 python

我的博客:

python3.7 windows安装教程

pip安装python模块时报错443超时

3.14 正则表达式

我的博客:

正则表达式练习

3.15 知识管理

  • 博客美化工具

    • markdown-nice

      https://mdnice.com

      https://github.com/mdnice/markdown-nice

      https://juejin.im/post/5e4ca743f265da576b565ee1#heading-3

我的博客:

利用amWiki打造自己的知识管理

3.16 prometheus(监控)

我的博客:

docker安装prometheus

4. 系统设计

5. 常见问题

5.1 如何设计高并发

https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/high-concurrency-design.md

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐