一大坨知识-2-JVM篇
JVM内存划分 1. JVM运行时数据区域 堆、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器 1.1 Heap(堆) 对象的实例以及数组的内存都在堆上进行分配,堆是线程共享的区域,用来存放对象实例,也是垃圾回收(GC)的主要区域。开启逃逸分析后,某些未逃逸的对象可以通过标量替换的方式在栈中分配。 堆细分: 新生代、老年代 新生代分为:Eden区、Survivor1区、Survivor2区 1.2 方法区(元空间) JVM的方法区也称为永久区,存储已被Java虚拟机加载的类信息、常量、静态变量。JDK 1.8以后取消了方法区概念,称之为元空间(MetaSpace)。 当应用中的Java类过多时(如Spring等使用动态代理的框架生成很多类),如果占用空间超出设定值,会发生元空间溢出。 1.3 虚拟机栈 虚拟机栈是线程私有的,其生命周期与线程生命周期一致。每个方法执行时都会创建一个栈帧,栈帧中存放: 局部变量表 操作数栈 动态链接 返回地址 异常状况: 线程请求栈深度大于虚拟机允许深度:抛出 StackOverflowError 虚拟机栈动态扩展时无法申请足够内存...
一大坨知识-1-基础篇
不错的帖子, COPY一下 一大坨知识全都来自于此,原来帖子的名字如下: 这些年,背过的面试题 今天看到一篇文章,感叹失败的原因可能有很多条,但成功的道路只一条,来之前准备了半年,上篇俗称八股文,下篇是一些经验总结供大家参考。 网络基础 TCP三次握手 三次握手过程: 客户端——发送带有SYN标志的数据包——服务端 一次握手 Client进入syn_sent状态 服务端——发送带有SYN/ACK标志的数据包——客户端 二次握手 服务端进入syn_rcvd 客户端——发送带有ACK标志的数据包——服务端 三次握手 连接就进入Established状态 为什么三次: 主要是为了建立可靠的通信信道,保证客户端与服务端同时具备发送、接收数据的能力 为什么两次不行? 防止已失效的请求报文又传送到了服务端,建立了多余的链接,浪费资源 两次握手只能保证单向连接是畅通的。(为了实现可靠数据传输, TCP 协议的通信双方, 都必须维 护一个序列号,以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方 相互告知序列号起始值, 并确认对方已经收到了序列号起始值的...
Cpp Callable Objects
在 C++ 中,Callable Object(可调用对象) 指的是任何可以像函数一样被调用的事物。简单来说,就是任何可以使用 () 运算符(Function Call Operator)的对象。 在现代 C++(C++11 及以后)中,可调用对象的概念非常重要,因为它是 STL 算法、线程(std::thread)以及回调机制的核心。 C++ 中的可调用对象主要分为以下 5 类。 1. 普通函数与函数指针 (Function Pointers) 这是最基础的形式,继承自 C 语言。 特点: 没有状态(Stateless),行为固定。 适用场景: 简单的回调,也就是所谓的 C 风格 API。 #include <iostream> void hello() { std::cout << "Hello from Function Pointer!" << std::endl; } int main() { // 定义函数指针 void (*funcPtr)() = &hello; /...
C++ 三路比较 (Three-way Comparison)
简介 C++20 引入了三路比较运算符 <=>,也被称为"宇宙飞船运算符"(spaceship operator)。这个运算符可以一次性确定两个对象之间的所有比较关系(小于、等于、大于),大大简化了比较运算符的实现。 传统比较运算符的问题 在 C++20 之前,如果我们想为一个自定义类型实现完整的比较运算符,需要分别实现六个运算符: class Point { public: int x, y; bool operator==(const Point& other) const { return x == other.x && y == other.y; } bool operator!=(const Point& other) const { return !(*this == other); } bool operator<(const Point&...


