idea 2021 Debug卡住一直提示Collecting data
还是IDEA 的问题 mac M1 加 IDEA2021的问题还真不少,debug时发现会一直卡住,在调用底层jar包时,创建一个对象就一直提示 Collecting data,并没有断点。
解决
把 Enable toString() 去掉即可解决。
另外,彻底解决卡顿问题,还是要换 zulu JDK和IDEA(ideaIU-2021.2.2-aarch64.dmg),这样一套搞下来就不卡了。
Zulu JDKhttps://www.azul.com/downloads/?package=jdk
spring 源码阅读环境
要进行源码阅读之前,强调需要先对一个产品有熟悉的使用,就好像你想要造车,要先会开车,再去学习如何造车,否则一切都是停在理轮上,完全不了解这个车是如何运行的,没有概念。推荐对需要阅读的源码先保存在自己仓库中,并创建一个源码分支,可以在阅读分析的过程中对重要点进行注释帮助加深理解。
fork源码Spring 官方github源码仓库
https://github.com/spring-projects/spring-framework
构建源码阅读环境将代码 clone 到本地,克隆完成后,IDEA自动打开项目。
报错处理,首次打开会报个错,别慌这是因为IDEA缺少必要插件,点右侧 gradle 的构建按钮构建一次。
首次构建需要下载的包比较多,
直接使用 git clone 方式直接使用命令行git clone 项目的话,拉完代码后,IDEA 通过导入的方式导入项目。
file--->new--->Project from Exisitings Sources
后续步骤相同。
gradle 问题spring 是基于gradle进行构建的,如果没有安装gradle也没 ...
gradle 安装
安装官网
https://gradle.org/
下载页面https://gradle.org/releases/
选择自己需要的版本,下载已经编译好的二进制文件Download: binary-only
设置环境变量设置 .bash_profile 文件添加
export PATH=$PATH:/Users/liukai/workspaces/application/gradle-6.6.1/bin
验证一下
IDEA2021使用tomcat启动时间超长
最近换了 mac M1 加 IDEA2021 后,发现问题还真不少,先是解决了卡顿问题后,tomcat 启动时间从原来的十几秒,变成20分钟!!!超不正常。
新电脑问题多。
直接说怎么解决的。
解决
scutil --set HostName "localhost"
无效的偿试-修改生成随机数IDEA2021 添加tomcat启动参数,JRE默认使用 /dev/random作为随机数来源,当熵池大小不够的时候,random会很慢,造成随机数生成调用阻塞。
JAVA_OPTS="-Djava.security.egd=file:/dev/urandom"无效,依然该怎么慢还怎么慢。
真正原因 Jvm需要很长时间解析localhost的IP地址原因分析https://www.codenong.com/39636792/
hexo 分类或标签单词开头大写出现404
最近搬运笔记到博客,编辑的文章多了,今天突然发现,有一个分类点进去404,本地运行正常没有问题。查了一圈发现是git的大小写区分问题。
将大写字母改成小写,hexo 部署正确,但是博客上还是不正确出现404
网上查了许多资料,才发现,git中设置了大小写不敏感。
解决办法修改 git 设置不忽略大小写
进入博客文件夹,进入 git 目录:.deploy_git,修改 .git 文件中的配置文件 config,将ignorecase=true 改为 ignorecase=false
vim . deploy_git/.git/configignorecase = false
重写清空部署项目
如果还没有解决,清空部署到 github 上的文件,重新发布:
cd .deploy_gitgit rm -rf *git commit -m 'clean all file'git push
进入博客文件夹,用 hexo 重新生成部署
hexo clean && hexo g -d
IDEA 2021 CPU 超100% 问题解决
用了IDEA 2021之后cpu超过200,打开一个类文件就卡住一会,起初以为是语法检查的问题,把所有语法检查一个不留全关闭,还是没解决。
最终解决方式,配置IDEA 的JVM参数:
1234567891011121314151617181920212223242526272829303132333435#堆栈设置-Xms4096m-Xmx4096m-Xmn3072m-XX:MetaspaceSize=1024m-XX:MaxMetaspaceSize=1024m-XX:+AlwaysPreTouch-XX:InitialCodeCacheSize=1200m-XX:ReservedCodeCacheSize=1200m-XX:+UseCompressedOops-Dfile.encoding=UTF-8# 采用何种垃圾回收参数-XX:+UseConcMarkSweepGC-XX:ParallelGCThreads=4-XX:SoftRefLRUPolicyMSPerMB=50-ea# JIT 参数-XX:CICo ...
go 数组
注意事项Go 语言数组声明有两种方式:
定长数组
不定长度数组
注意:1.如果没有赋值,会有默认值
int 数组,默认初始化为: 0
string 就是空串
2.数据类型必须相同,不能混用,int数组不能包含float 等,已验证3.boolean 是false4.数组越界是 panic 异常5.数组是值类型,默认情况下是值拷贝,也就是说每次拷贝后是一个独立副本,数组间互不影响。6.可以使用指针来实现引用传递
长度用内置函数 len() 即可。
定长数组即,开始就确定长度的数组。语法还是比较灵活的,可以设置定长 和 不定长度的数组,直接通过赋值初始化
1234567891011121314package P01varimport "fmt"func ArrayTest3() { var hens [6]int hens[0] = 111 hens[1] = 222 hens[2] = 333 for i := 0; i < len(hens); i++ { fmt.Printf("打印数组i=%d, 数据= ...
go 函数多个返回值
函数结构和别的语言略有不同。go 的特点,返回可以有多个返回值。
语法123func function_name( [parameter list] ) [return_types] { 函数体}
单个返回值方法123456789101112/* 函数返回两个数的最大值 */func max(num1, num2 int) int { /* 声明局部变量 */ var result int if (num1 > num2) { result = num1 } else { result = num2 } return result}
两个返回值方法实际上可以返回多个值,这里演示,所以只写两个返回值
123456789101112package mainimport "fmt"func swap(x, y string) (string, string) { return y, x}func main() & ...
go 函数介绍
函数定义函数是基本的代码块。Go是编译型语言,函数编写的顺序是无关紧要的;鉴于可读性的需求,最好把 main() 函数写在文件的底部,类似于C语言的习惯。
Go 语言函数定义格式如下:
123func function_name( [parameter list] ) [return_types] { 函数体}
func:函数声明关键字,函数由 func 开始声明
function_name:函数名称,参数列表和返回值类型构成了函数签名。
parameter list:参数列表。
return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
函数体:函数定义的代码集合。
Go 里面拥三种类型的函数
普通函数
匿名函数或者lambda函数
方法(Methods)说下方法,确实有这种类型。go是为了兼容面向对象的特性,实现了方法这种特性。
调用示例12345678910package mainfunc main() { getTest ...
go defer关键字
defer 延时机制在函数执行过后执行。作用:在函数执行过后及时释放资源。最佳的实践在于,做一些执行后的操作,释放资源,比如:数据库连接、文件句柄、锁等。
在 golang 中的通常做法是,创建资源后,立即使用 defer 进行释放。
1.基本用法原理是使用了 defer 关键字后,会将修饰语句加入到一个栈中,这里称为 defer 栈中,直到程序执行后,最后执行,当函数执行完毕后,在从 defer 栈中,依次从栈顶取出语句执行,先入后出的机制。defer对执行流程的改变,只是在本函数内有用。
123456789101112131415package mainimport "fmt"func sum(n1 int, n2 int) int { defer fmt.Printf("n1=%d, n2=%d\n",n1, n2) res := n1 + n2 defer fmt.Printf("res1=%d\n", res) return res}func main() { res := ...