JVM Heap Dump(堆转储文件)的生成 正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了JVM中堆内存运行的情况。...的配置参数中添加 -Xrunhprof:head=site 参数,会生成java.hprof.txt 文件,不过这样会影响JVM的运行效率,不建议在生产环境中使用(未亲测)。...使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对象的 Retained Size,查看是谁在阻止垃圾回收,并自动生成一个 Leak Suspect...Dominator Tree 支配树,列出Heap Dump中处于活跃状态中的最大的几个对象,默认按 retained size进行排序,因此很容易找到占用内存最多的对象。 ?...这里仅针对在 Overview 界面中的 Acations中列出的两项进行说明: Top Consumers 按类、类加载器和包分别进行查询,并以饼图的方式列出最大的几个对象。
参考链接: C++ swscanf() time_t TransTimeStringToStamp(const stdtstring& strTimeString) { //2020/11/10
本文讨论的是不带头节点的双向循环链表,如下图: [qowp0vrk7c.png] 2. 双向循环链表的实现 TencentOS-tiny中的双向链表实现在tos_list.h中。 2.1....插入前的双向循环链表如下: [12x9hk0jf4.png] 插入后的双向循环链表如下: [g8b3e5w8ks.png] 图中的四个插入过程分别对应代码中的四行代码。...双向链表使用示例 3.1. 实验内容 本实验会创建一个带有10个静态结点的双向链表,每个新的自定义节点中有一个数据域,存放一个uint8_t类型的值,有一个双向链表节点,用于构成双向链表。 3.2....还有最后一个使用问题,我们都是对整条链表进行操作(比如可以轻松的遍历整条链表),操作的时候得到的地址都是node_t类型节点中k_list_t类型成员的地址,那么如何访问到data成员呢?..._t *)(ptr) - TOS_OFFSET_OF_FIELD(type, field))) 这两个宏定义的实现属实有点骚,其中的巧妙之处可以再写一篇文章讲解了哈哈,此处我们先了解其使用即可(此处要感谢戴大神的解答
T.84: Use a non-template core implementation to provide an ABI-stable interface T.84:使用非模板核心实现提供稳定的ABI...提高代码的稳定性。避免代码膨胀。...(虽然例示了两个List类,)对于List的关联和非关联元素来讲,只有一套操作(函数)的拷贝。Link和List除了类型操作之外不做任何事。...除了使用独立的“基础”类型,另外一个通用技术是定义基于void和void*类型的核心实现并准备一个目的仅限于安全地封装从或到void核心实现进行转换的通用模板类。...其他选项:使用指向实现的指针技术来实现。
崩溃转储、内存转储、核心转储、系统转储……这些全都会产生同样的产物:一个包含了当应用崩溃时,在那个特定时刻应用的内存状态的文件。...退出,带有如下错误: image.png “Abgebrochen (Speicherabzug geschrieben) ”(LCTT 译注:这是德语,应该是因为本文作者系统是德语环境)大致翻译为“分段故障...检查当前创建核心转储的设置: ulimit -c 如果它输出 unlimited,那么它使用的是(建议的)默认值。...否则,用以下方法纠正限制: ulimit -c unlimited 要禁用创建核心转储,可以设置其大小为 0: ulimit -c 0 这个数字指定了核心转储文件的大小,单位是块。 什么是核心转储?...使用 coredumpctl dump,你可以从最后保存的转储文件中检索信息: [stephan@localhost core_dump_example]$ .
当您的程序出现段错误,Linux 的内核有时会把一个核心转储写到磁盘。 当我最初试图获得一个核心转储时,我很长一段时间非常沮丧,因为 – Linux 没有生成核心转储!我的核心转储在哪里?...%t ulimit:设置核心转储的最大尺寸 ulimit -c 设置核心转储的最大尺寸。 它往往设置为 0,这意味着内核根本不会写核心转储。 它以千字节为单位。...%t 将核心转储保存到目录 /tmp 下,并以 core 加上一系列能够标识(出故障的)进程的参数构成的后缀为文件名。...下一步将使用 gdb 打开核心转储文件并获取堆栈调用序列。...我可以使用 gdb 弄清楚有个 C++ 的虚表条目指向一些被破坏的内存,这有点帮助,并且使我感觉好像更懂了 C++ 一点。也许有一天我们会更多地讨论如何使用 gdb 来查找问题!
R.31: If you have non-std smart pointers, follow the basic pattern from std R.31:如果需要实现标准库以外的智能指针,遵照标准库中的基本模式...后面章节中的准则也适用于其他类型的第三方和自定义的智能指针,它们对于发现一般的可能导致性能和正确性问题的智能指针错误很有效。你需要的是对所有智能指针都有效的的准则。...(包括主要的模板和特化)都可以看作智能指针。...如果它是可拷贝的,就被认为是带有参照计数的共享指针。 If it is not copyable, it is recognized as a unique unique_ptr....两种情况都犯了sharedptrParam准则指出的错误:p是一个共享指针,但是这里没有用到任何有关共享的功能。
C.136: Use multiple inheritance to represent the union of implementation attributes C.136:使用多重继承表现“实现属性...某些形式的混入通常包含状态和针对状态的操作。如果操作是虚的,使用继承就是必要的,如果不使用继承可以避免样板和转交。...这是一种相对稀少的用法,因为实现通常可以组织成一个单根继承中。...有时,一个“实现属性"更像一个"minxin",这个"minxin”可以决定一个实现的行为,也可以是使能实现它要求的原则的注入成员。...Boost.Instrusive( https://theboostcpplibraries.com/boost.intrusive )特别适合高性能编程的C++库。
T.65: Use tag dispatch to provide alternative implementations of a function T.65:使用标签分发提供函数的不同实现 Reason...标签分发允许我们根据参数类型的特定属性选择实现方式。 Performance....a simplified version of std::copy (ignoring the possibility of non-contiguous sequences) 这是std::copy的简化版本...这是一个可以在编译时选择算法的普遍和强大的技术。...(注意) When concepts become widely available such alternatives can be distinguished directly: 当概念可以被普遍使用时
T.64: Use specialization to provide alternative implementations of class templates T.64:使用特化提供类模板的不同实现...特化提供了为接口提供不同实现的强有力机制。 Example(示例) string specialization (==) representation specialization
单链表实现: public class MyLinkedList { private static class Entry{ private E value;...iterator()的返回值会返回一个迭代器对象,这个迭代器对象可以作为一个工具来遍历集合类中的对象。...此外,迭代器更是设计模式,如对图的遍历可以实现一个图迭代器,简化代码,将遍历的思想抽象出来。 自己实现一个可以遍历上述单链表的迭代器,这个迭代器需要实现Iterator接口中的方法。...主要包括以下三个方法: (1)是否存在下一个对象元素 (2)返回下一个对象元素 (3)删除集合中的当前迭代器指向的对象元素 public class MyLinkedList ...show()方法的功能是相同的,但是迭代器为遍历集合对象元素提供了一种统一的方法,此外也可以使用迭代器做更多的事情。
相较于其他形式的链表,双向循环链表的添加节点,删除节点,遍历节点都非常的简单。 2. 双向循环链表的实现 TencentOS-tiny中的双向链表实现在tos_list.h中。 2.1....插入前的双向循环链表如下: ? 插入后的双向循环链表如下: ? 图中的四个插入过程分别对应代码中的四行代码。...双向链表使用示例 3.1. 实验内容 本实验会创建一个带有10个静态结点的双向链表,每个新的自定义节点中有一个数据域,存放一个uint8_t类型的值,有一个双向链表节点,用于构成双向链表。 3.2....❞ 还有最后一个使用问题,我们都是对整条链表进行操作(比如可以轻松的遍历整条链表),操作的时候得到的地址「都是node_t类型节点中k_list_t类型成员的地址」,那么如何访问到data成员呢?..._t *)(ptr) - TOS_OFFSET_OF_FIELD(type, field))) 这两个宏定义的实现属实有点骚,其中的巧妙之处可以再写一篇文章讲解了哈哈,此处我们先了解其使用即可(「此处要感谢戴大神的解答
在存储管理系统中,主要有分段管理和 分页管理 两种方式。 正如我们所看到的,按连续字节序列存储文件有一个明显的问题,当文件扩大时,有可能需要在磁盘上移动文件。内存中分段也有同样的问题。...只有在系统部署完毕真正使用使用后才会获得。 ❞ 现在,回到空闲链表的方法,只有一个指针块保存在内存中。创建文件时,所需要的块从指针块中取出。当它用完时,将从磁盘中读取一个新的指针块。...第四,对正在使用的文件系统做备份是很难的。如果在转储过程中要添加,删除和修改文件和目录,则转储结果可能不一致。...物理转储和逻辑转储 物理转储的主要优点是简单、极为快速(基本上是以磁盘的速度运行),缺点是全量备份,不能跳过指定目录,也不能增量转储,也不能恢复个人文件的请求。...因此句「大多数情况下不会使用物理转储,而使用逻辑转储」。 逻辑转储(logical dump)从一个或几个指定的目录开始,递归转储自指定日期开始后更改的文件和目录。
By 张旭 CaesarChang 合作 : root121toor@gmail.com 关注我 带你看更多好的技术知识和面试题 给定一个链表,判断链表中是否有环。...为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。...fast=fast.next.next; slow=slow.next; } return false; } } 使用快慢指针
ES.86: Avoid modifying loop control variables inside the body of raw for-loops ES.86:避免在基本for循环的循环体中修改循环控制变量...外在的循环控制方式应该能够让人正确的推测循环内部正在发生什么。无论在迭代表达式中还是环体内修改循环计数都会增加理解难度甚至引发错误。...标记(循环,译者注)变量可能被修改(非常量参数使用)的情况,包含在迭代表达式中和循环体内部两种情况。
恢复操作的基本原理:冗余 利用存储在系统别处的冗余数据来重建数据库中已被破坏或不正确的那部分数据 恢复的实现技术:复杂 一个大型数据库产品,恢复子系统的代码要占全部代码的10%以上 10.4 恢复的实现技术...2.转储方法 静态转储:在系统中无运行事务时进行的转储操作,转储开始时数据库处于一致性状态,转储期间不允许对数据库的任何存取、修改活动,得到的一定是一个数据一致性的副本 。...优点:实现简单 缺点:降低了数据库的可用性(转储必须等待正运行的用户事务结束 ,新的事务必须等转储结束) 动态转储:转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改。...海量转储与增量转储比较: 从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便 如果数据库很大,事务处理又十分频繁,则增量转储方式更实用更有效 10.4.2 登记日志文件 1.日志文件的格式和内容...恢复中最经常使用的技术:数据库转储、登记日志文件。 恢复的基本原理:利用存储在后备副本、日志文件和数据库镜像中的冗余数据来重建数据库。 事务:不仅是恢复的基本单位,也是并发控制的基本单位。
C.51: Use delegating constructors to represent common actions for all constructors of a class C.51:使用委托构造函数实现所有构造函数的共通动作...委托构造函数是C++11引入的新特性,具体请参照作者的以下文章: https://mp.weixin.qq.com/s/sHyLCI1tkLWvxfBKUiKwMg Reason(原因) To avoid...避免重复和意外的差异。...共通的动作写起来很乏味,偶尔也会变得不普通。...参考:如果“重复的动作”只是简单的初始化,考虑类内成员初始化器。 Enforcement(实施建议) (Moderate) Look for similar constructor bodies.
---- ---- 一、初见list 1.list的迭代器失效和基本使用 1....list的底层是由带头双向循环链表实现的,与vector和string不同的是,list的遍历要通过迭代器来实现,就算我们不知道list迭代器的底层实现机制,但并不影响我们使用迭代器,这就是迭代器对于所有容器带来的好处...remove相当于find+erase,可用于链表中某个具体节点的删除,如果删除的数据不存在,则什么也不会发生,并不会报错。 5....//如果是自定义类型,会调用其类的无参构造函数,如果是内置类型,基本是0或NULL等初始值, //我们可以认为内置类型也有构造函数,这样的写法实际是为了支持C++的泛型编程所搞出来的, //...vsPJ版本的STL源码中string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字符串的存储空间:当字符串长度小于16时,使用内部固定的字符数组_buf来存放
前言 前面的文章我们学习了红黑树,也提到了C++STL中的map和set的底层其实就是用的红黑树来实现的(而map和set的使用我们前面也学过了)。...既然红黑树我们也学习过了,那这篇文章我们就用红黑树来简单实现一下STL中的map和set,重点是学习它的框架。 1....STL源码中map和set的实现 那在正式实现之前,我们先一起来看一下STL(SGI版本)中map和set的源码,大致了解一下库里面是怎么实现的。...如果大家去看源码的话会发现它的实现跟我们有一些不同: 他给这棵红黑树增加了一个头结点 头结点的左指针指向最左结点(中序第一个),头结点的右指向最右结点,然后它的parent指向根结点,根结点的...大家有兴趣可以看一下它这个实现,但是按我们上面写的就可以了,当然库里面的实现在某些地方会比我们的好一些,我们这样实现的话如果对end–的话其实就会有问题,因为我们的end使用空nullptr构造的,就没法向前寻找前一个结点
ES.30: Don't use macros for program text manipulation ES.30: 不要使用宏进行程序中的文本操作 Reason(原因) Macros are...一般来讲,很多情况下使用宏都是基本无害的,但是即使是这样也会为工具带来困难,例如有些自动补全软件,静态分析软件和调试器等。通常使用花哨的宏定义是过于复杂的设计的信号。...#和##也会鼓励宏的定义和使用。...这段代码不像定义宏那么容易,但同样方便使用,不存在额外的开销,并且包含类型和范围。...将来,静态反射机制应该可以消除在程序中处理文本时使用预处理器的最后一个需求。
领取专属 10元无门槛券
手把手带您无忧上云