day18(static。virual、大端存储、用户态内核态、内存溢出、线程模型)
- 类中的static、virtual
static修饰成员变量,对于非静态成员变量,每个对象都有自己的拷贝,而静态成员变量不管定义多少个对象,都只有一个拷贝,为该类型的所有对象共享。
static修饰成员函数,静态成员函数不与任何对象相联系,因此不具有this指针,无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其他的静态函数。 - 大端是指低字节存储在高地址,小端存储是指低字节存储在低地址。可以通过联合体union来判断是大还是小端,因为联合体变量公用一个内存地址。
联合体的特性存储的数据从低地址开始存储。而数据的读取也是从低地址开始读值。
- 用户态和内核态是操作系统的两种运行级别,最大区别是特权级不同。用户低特权级,内核态高特权级。运行在用户态的程序不能直接访问操作系统的内核数据和程序。
内核态和用户态之间的转换方式,系统调用、异常和中断。 - 内存溢出,程序申请内存的时候,没有足够的内存拱申请者使用,内存溢出就是你要的内存空间超过了系统是寄给你分配的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。
内存溢出的原因:
内存中的数据量加载的过于庞大,如一次从数据库取出太多的数据。
集合类中有对对象的引用,使用后未清空,使得不能回收。
代码中存在死循环,或者循环过程产生了过多的重复的对象实体。
使用的第三方软件中的BUG
启动参数内存值设置的过小 - 常见的线程模型
Future模型,该模型在使用的时候通常结合Callable接口配合使用。
fork&join模型,该模型包含递归思想和回溯思想,递归用来拆分任务,回溯用来合并结果。
actor模型,该模型是基于一种消息传递机制并行任务处理思想,以消息的形式进行线程间的数据传输,避免了全局变量的使用,进而避免了数据同步错误的隐患。需要第三方Akka童工的框架。
生产消费者模型,其核心是使用一个缓存来保存任务。开启一个或多个线程进行生产任务,然后再开启一个或多个线程从缓存里取任务进行处理。这样好处是生成和处理分隔开。
master-worker模型,类似于任务分法策略,开启一个master线程接受任务,然后再master中根据任务具体情况进行分发得其他worker子线程,然后由子线程处理。