我的学习笔记
文章目录1.前言2. java2.1 java基础2.2 java应用2.3 学习记录3.技术栈3.1spring cloud / spring boot3.2docker/k8s3.3Jenkins3.4redis(缓存)3.5mysql3.6es3.7前端3.8 nginx & tomcat3.9消息队列MQ3.10 keeplived3.11 ...
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:SurvivorRation Eden区域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 排序和查找
我的博客:
2.3.3 判空
我的博客:
java代码如何优雅的判空
2.3.3 lambda表达式
2.3.4 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 (对那些比较中立的类进行注释)
我的博客:
3.2 docker/k8s
我的博客:
3.3 Jenkins
我的博客:
ubuntu安装jenkins指南(持续集成)
jenkins问题汇总1(jenkins连接slave失败)
3.4 redis(缓存)
-
使用场景
高并发读
我的博客:
3.5 mysql
-
mysql监控
-
canal
https://juejin.im/post/5e4dfe0e518825492e495623
-
-
数据库管理
-
Flyway
https://juejin.im/post/5e4df438e51d452700566a55
-
我的博客:
3.6 es
基于 lucene 的分布式搜索引擎—— ElasticSearch,简称为 es
- 使用场景
- 高并发全文搜索等
3.7 前端
- angularJS
- vue
- react
我的博客:
3.8 nginx & tomcat
我的博客:
3.9 消息队列MQ
- 使用场景
- 高并发写
- 工具
- RabbitMQ
https://www.cnblogs.com/williamjie/p/9481780.html
3.10 keeplived
我的博客:
3.11 gohttpserve
我的博客:
使用gohttpserve共享你的文件1(windows基础篇)
使用gohttpserve共享你的文件2(linux基础篇)
使用gohttpserve共享你的文件3(docker基础篇)
3.12 linux
我的博客:
3.13 python
我的博客:
3.14 正则表达式
我的博客:
3.15 知识管理
-
博客美化工具
-
markdown-nice
https://mdnice.com
https://github.com/mdnice/markdown-nice
https://juejin.im/post/5e4ca743f265da576b565ee1#heading-3
-
我的博客:
3.16 prometheus(监控)
我的博客:
4. 系统设计
5. 常见问题
5.1 如何设计高并发
https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/high-concurrency-design.md
更多推荐
所有评论(0)