JVM调优笔记
一、常用命令
jps -l 查看 Java 进程的 PID
jinfo -flags <pid> 查看 JVM 启动时的具体参数
jcmd <pid> VM.flags 查看 JVM 启动时的具体参数(比 jinfo 更常用)
jcmd <PID> GC.class_histogram -all | tail -n 10 查看存活对象统计(-all 参数表示只统计当前存活的对象),输出结果的尾行第一个数字是当前堆中存活的对象总个数,第二个数字是当前实际存活对象的总大小,单位是字节(Byte)。
jstat -gc <PID> | awk '{print "老年代实际存活: " $8/1024 " MB"}'
jcmd <PID> GC.run 手动触发一次 Full GC
docker stast 用于实时查看 Docker 容器的资源使用情况,查看具体服务使用 docker stats <CONTAINER_ID>
jcmd <pi ...
Spring
1、Spring 创建的 Bean 和普通的 Java 对象有什么区别?
2、Bean 的创建生命周期
调用构造方法(推断构造方法) -> 普通对象 -> 依赖注入(属性赋值) -> 初始化前 (PostConstruct)-> 初始化(InitializingBean.afterPropertiesSet()) -> 初始化后(AOP) -> 代理对象 -> Bean
3、Bean 的销毁生命周期
@Bean 会覆盖 @Component
Spring 容器简单理解就是一个 Map
注入 bean 时,先根据「byType」去 Spring 容器中找,如果找到了多个,就再根据「byName」去找,最终至多只会找到一个
设计模式之单例模式
单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。比如,线程池、缓存等。
如果不用单例模式,那有什么办法能创建一个独一无二的对象吗?
可以使用 Java 的静态变量。
使用静态变量有什么缺点吗?
如果要将对象赋值给一个全局变量,那么在程序一开始就要创建好这个对象。如果创建这个对象需要消耗比较大的资源,同时本次程序的执行过程中又没有用到它,这就会很浪费。
使用单例模式就可以做到,在需要时才创建对象(lazy instantiaze)。
下面是经典的单例模式代码:
public class Singleton_1 { // 使用静态变量来记录唯一实例 private static Singleton_1 uniqueInstance; // 构造器私有化,只有 SingletonPattern_1 类内才可以调用构造器 private Singleton_1() {} // 提供一个全局访问点,返回 uniqueInstance public static Singleton_1 ...
IDEA create class and method comment use template
Class commentIDEA - Settings - Editor - File and Code Templates - Class
/** * @description: ${description} * * @author: YOUR NAME or {USER} * * @create: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} */
Method CommentIDEA - Settings - Editor - Live Templates - create a new Template Groups. I my case i create a Template Groups named “Method Comment”.
Then select “Method Comment” add a new Live Template
NOTICE: there is no / in fi ...
在GitHub上部署Hexo网站
换电脑好久了,个人网站一直拖着没有部署。今天决定要搞一下,发现很多步骤都忘记了,因此写篇帖子记录一下,方便以后查阅
要在新 Mac 上安装 Hexo 首先需要有 Homebrew。Homebrew 官网推荐的安装方式因为某些特殊原因,一直报错。尝试在 /etc/hosts 文件中配置 GitHub,但是没起作用。最终解决方法:使用国内镜像安装 Homebrew
装好 Homebrew 以后,可以去到 Hexo 官网,按官网提示安装 Hexo
npm install hexo-cli -g 安装 hexo
cd blog 进到本地自己的博客文件夹中
npm install
将博客文件部署到 github.io 上
去到博客根文件下修改 _config.yml,将 GitHub 的部署方式修改为 SSH 方式 github: git@github.com:userName/userName.github.io.git
按照 Generating a new SSH key and adding it to the ssh-agent 一步一步的设置 SSH
在博客根目录运行 h ...
我的2022年终总结
今年的重心是秋招和毕业。
秋招 9 月份开始投递简历,主要投的互联网行业,现在是 0 offer,每天笑哈哈。
毕业主要是毕业要求和毕业论文,毕业要求已经达到了,论文也有了大体框架,剩下的就差写出来了。
今年来主要做了如下几件事:
英语学习。听力,一直在坚持听英语播客「ESLPod」,听了 40 期了。阅读,读了一本「小王子」。写作和口语,无。6 级考了还没出成绩。每天也在坚持用英语。
准备秋招。做了 2 个简历上的项目,看了些八股文,读了周志明的 Java 虚拟机。刷题见下面第 3 条。去年定的目标是上岸大、中厂,还是大意了。
刷题。LeetCode 每日一题坚持了 7 个月了,周赛也打了几十场了,算法和数据结构的学习一直没断,每天都在进步,做题也渐入佳境。刷题是打算培养成个人爱好的。
读书。今年读了 32 本书,离去年的 50+ 目标有点差距。
健康。今年牙齿动了个小手术,4 颗智齿全部拔掉了,补了几颗蛀牙。其他方面没啥问题。对了,我已经阳过了,发烧最高到了 39.8 度,直逼 40 度,吃了三片对乙酰氨基酚。其他症状有浑身疼、咳嗽、嗓子疼、流鼻涕、味觉嗅觉衰退,感觉也还好。也给 ...
KMP字符串匹配算法
力扣题目:Find the Index of the First Occurrence in a String
给定原串 s 长度为 n,模式串 p 长度为 m。
先给个暴力解法:
int fun(String s, String t) { int n = s.length(), m = t.length(); for (int idx = 0; idx <= n - m; idx++) { int i = idx, j = 0; for ( ; j < m; ++i, ++j) { if (s.charAt(i) != t.charAt(j)) break; } if (j == m) return idx; } return -1;}
首先,KMP(Knuth–Morris–Pratt algorithm)和暴力解法的不同之处是,当遇到不相同的字符时,暴力解法采取的措施是:原串指针回到本次开始位置的下一个位置, ...
差分数组
适用情况频繁的对区间进行修改操作,单点查询。
基本使用初始化,以及跟新操作int[] diff = new int[n + 1];for (int i = 0; i < n; ++i) { int l = 修改的左区间; int r = 修改的右区间 + 1; int val = 对区间修改的值; diff[l] += val; if (r + 1 < n) diff[r + 1] -= val;}
查询操作int[] res = new int[n];res[0] = diff[0];for (int i = 1; i < n; ++i) { res[i] = res[i - 1] + diff[i];}
基本原理diff[L...]+3 表示对 diff[L...]所有的元素都 +3。diff[R+1...]-3 表示对 diff[R+1...] 所有的元素都 -3。
那么,通过对 diff[R+1...] 所有的元素都 -3,就可以抵消 diff[R+1...] 多余的 +3 操作(该多 ...
计数排序
计数排序(Counting sort)是一种稳定的线性时间排序算法。该算法于 1954 年由 Harold H. Seward 提出。计数排序使用一个额外的数组 C,其中第 i 个元素是待排序数组 A 中值等于 i 的元素的个数。然后根据数组 C 来将 A 中的元素排到正确的位置。维基百科:计数排序。
计数排序要求待排序数组必须是整数,而且值域必须明确。
public void countingSort(int[] nums) { // 取最大、最小值 int max = Arrays.stream(nums).max().getAsInt(); int min = Arrays.stream(nums).min().getAsInt(); // 为额外数组 count 开空间 int range = max - min + 1; int[] count = new int[range]; // 统计元素出现次数(需要计算偏移量) for (int num : nums) count[num - min]++; // 求计 ...