Fork me on GitHub

命令行常用指令

   MySQL 创建数据库并指定字符集:

1
2
drop schema if exists `test`;
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

   Brew 相关的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 先卸载Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
// 然后在安装
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
// 搜索包
brew search mysql
// 安装包
brew install mysql
// 查看包信息,比如目前的版本,依赖,安装后注意事项等
brew info mysql
// 卸载包
brew uninstall wget
// 显示已安装的包
brew list
// 查看brew的帮助
brew –help
// 更新, 这会更新 Homebrew 自己
brew update
// 检查过时(是否有新版本),这会列出所有安装的包里,哪些可以升级
brew outdated
brew outdated mysql
// 升级所有可以升级的软件们
brew upgrade
brew upgrade mysql
// 清理不需要的版本极其安装包缓存
brew cleanup
brew cleanup mysql

   MySQL 源码构建参数(将目录修改为你自己的)

1
2
3
4
5
6
7
8
-DCMAKE_BUILD_TYPE=Debug
-DWITH_BOOST=/Users/setsunayang/Documents/learning/mysql/boost_1_77_0
-DCMAKE_INSTALL_PREFIX=/Users/setsunayang/Documents/learning/mysql/build
-DWITH_SSL=system

./mysqld --basedir=/Users/setsunayang/Documents/learning/mysql/build \
--datadir=/Users/setsunayang/Documents/learning/mysql/build/data \
--initialize-insecure --user=mysql

   Git 相关

1
2
3
4
5
6
git remote rm origin 
git remote add origin [url]
git config --global user.name "杨海波"
git config --global user.email “3546514206@QQ.COM"

git rm -r --cached

   设置主机名称

1
sudo scutil --set HostName SetsunaYang

   Macbook Pro 显示被隐藏的文件或文件夹

1
2
3
4
5
defaults write com.apple.finder AppleShowAllFiles -boolean true;killall Finder 
defaults write com.apple.finder AppleShowAllFiles -boolean false;killall Finder

chflags hidden
chflags nohidden

   设置环境变量

1
echo 'export PATH="/opt/homebrew/opt/go@1.20/bin:$PATH"' >> ~/.zshrc

   修改环境变量相关

1
2
3
4
5
6
7
8
# 查看当前 shell 是 zsh 还是 bash
dscl . -read /Users/$USER UserShell
# 如果是 bash
open ~/.bash_profile
source ~/.bash_profile
# 如果是 zsh
open ~/.zshrc
source ~/.zshrc

   IDEA 相关

1
2
3
# 解决 Goland 无法调试的问题。在 bin/goland.vmoptions 增加如下虚拟机参数
-Djava.net.preferIPv4Stack=true
-Djava.net.preferIPv6Addresses=true

回调机制

1、C语言中的回调

     函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数 组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参 数。函数指针变量的声明: typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型 以下实例声明了函数指针变量 p,指向函数 max:

1
2
3
4
5
6
7
8
9
10
11
12
13
int max(int x, int y) { return x > y ? x : y; }

int main(void) {
/* p 是函数指针 */
int (*p)(int, int) = &max; // &可以省略
int a, b, c, d;
printf("请输入三个数字:");
scanf("%d %d %d", &a, &b, &c);
/* 与直接调用函数等价,d = max(max(a, b), c) */
d = p(p(a, b), c);
printf("最大的数字是: %d\n", d);
return 0;
}

     输出的结果:

1
2
请输入三个数字:1 2 3 
最大的数字是: 3

     函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用 的函数。下面的实例中 populate_array 函数定义了三个参数,其中第三个参数是函数的指 针,通过该函数来设置数组的值。实例中我们定义了回调函数 getNextRandomValue,它返 回一个随机值,它作为一个函数指针传递给 populate_array 函数。populate_array 将调 用 10 次回调函数,并将回调函数的返回值赋值给数组。编译执行,输出结果如下:

1
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709

2、什么是回调

     软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调 用、回调和异步调用。回调是一种双向调用的模式,也就是说,被调用方在接口被调用时也 会调用对方的接口。

     同步调用:一种阻塞式调用,调用方要等待对方执行完毕才能返回,它是一种单向调 用。

     回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口。

     异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收 到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。 回调和异步调用的关系非常紧密:通常可以使用回调来实现异步消息的注册,通过异步 调用来实现消息的通知。

程序调用的几种方式

     回调机制的实现通常需要实现一个回调函数,回调函数,顾名思义,用于回调的函数。回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性:

  • 属于工作流的一个部分;

  • 必须按照工作流指定的调用约定来申明(定义);

  • 他的调用时机由工作流决定,回调函数的实现者不能直接调用回调 函数来实现工作流的功能。

GC——基础知识

     JVM 的 GC 是指垃圾回收,主要是对堆内存的回收。本文将介绍 JVM 中一次完整的 GC 流程是怎样
的,首先抛出第一个问题,什么样的对象会是 JVM 回收的目标?

1、可达性分析算法(GC Roots)

     有一种引用计数法,可以用来判断对象被引用的次数,如果引用次数为0,则代表可以被回收。这种实现
方式比较简单,但对于循环引用的情况束手无策,所以 Java 采用了可达性分析算法。即判断某个对象是否与 GC Roots 的这类对象之
间的路径可达,若不可达,则有可能成为回收对象,被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标
记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。在 Java 中,可作为 GC Roots 的对象包括以下
几种:

  • 虚拟机栈(本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中引用的对象

2、JVM中的堆结构

     JVM 中的堆可划分为两大部分,新生代和老年代,大小比例为1:2,如下:

JVM 分代比例

     其中,新生代分为 Eden 区和 Survivor 区, Survivor 幸存者区又分为大小相等的两块 from 和 to
区。这便是 JVM 中堆的结构和各部分默认的比例,当然这些比例都可通过对应 JVM 参数来调整。完整的 JMM 如下:

JVM 内存模型全景

2.1、为何新生代要分为三个区

     这里需要介绍新生代的垃圾回收算法——复制算法。该算法的核心是将可用内存按容量划分为大小
相等的两块,每次回收周期只用其中一块,当这一块的内存用完,就将还存活的对象复制到另一块上面,然后把已使用过的内存空间清理掉。

     优点:不必考虑内存碎片问题;效率高。

     缺点:可用容量减少为原来的一半,比较浪费。

     最优设置:根据权威数据分析,90%的对象都是朝生夕死的,所以采用10%的空间用作交换区,因为交换区必须要有等量的两个,所以采用复制算法中新生代中三个区默认分配比例为8:1:1。

2.2、新生代对象的分配和回收

     基本上新的对象优先在 Eden 区分配;

     当 Eden 区没有足够空间时,会发起一次 Minor GC;

     Minor GC 回收新生代采用复制回收算法的改进版本。即:
from 区和 to 区的两个交换区,这两个区只有一个区有数据。采用8:1:1的默认分配比例(-XX:SurvivorRatio默认为8,代表 Eden 区与 Survivor 区的大小比例)

2.3、老年代对象的分配和回收

     老年代的对象一般来自于新生代中的长期存活对象。这里有一概念叫做年龄阈值,每个对象定义了年龄计数器,经
过一次 Minor GC (在交换区)后年龄加1,对象年龄达到15次后将会晋升到老年代,老年代空间不够时进行 Full GC。当然这个参数仍是可以通过 JVM 参数(-XX:MaxTenuringThreshold,默认15)来调整。

     大对象直接进入老年代。即超过 Eden 区空间,或超过一个参数值(-
XX:PretenureSizeThreshold=30m,无默认值)。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制。

     对象提前晋升到老年代(组团)。动态年龄判定:如果在 Survivor 区中相同年龄所有对象大小总和
大于 Survivor 区大小的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而无须等到自己
的晋升年龄。

3、JVM完整的GC流程

     对象的正常流程:Eden 区 -> Survivor 区 -> 老年代。

     新生代GC:Minor GC;老年代GC:Full GC,比 Minor GC 慢10倍,JVM 会“stop the world”,严重
影响性能。

     总结:内存区域不够用了,就会引发GC。Minor GC 避免不了,Full GC 尽量避免。
处理方式:保存堆栈快照日志、分析内存泄漏、调整内存设置控制垃圾回收频率,选择合适的垃圾
回收器等。

让我疯狂自律的一段话

强者气场是练出来的

征服一个人最好的方法“弃猫效应”

千万不要看见别人发光,就觉得自己黯淡

这段话真的好暖好有力量

高敏感人格的究极形态

  • Copyrights © 2023-2024 杨海波
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信