VisualVM线程Dump实战:从生成到分析,定位JVM卡顿与死锁
2026/10/22 6:04:27
个人首页:永远都不秃头的程序员(互关)
C语言专栏:从零开始学习C语言
C++专栏:C++的学习之路
人工智能专栏:人工智能从 0 到 1:普通人也能上手的实战指南
本文章所属专栏:C++学习笔记:数据结构的学习之路
算法复杂度分析需要理解以下关键点:
**时间复杂度的"基本操作"**需明确具体场景:
空间复杂度的计算要区分:
实际工程中还需考虑:
深入分析冒泡排序的复杂度:
基础版本:
defbubble_sort(arr): n =len(arr)foriinrange(n-1):# 外层循环:n-1次forjinrange(n-1-i):# 内层循环:每次n-1-i次ifarr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j]优化版本(添加swapped标志位):
defoptimized_bubble_sort(arr): n =len(arr)foriinrange(n-1): swapped =Falseforjinrange(n-1-i):ifarr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped =Trueifnotswapped:# 本轮无交换说明已有序break实际应用考量:
ADT的实现需要考虑:
信息隐藏:
接口设计:
不变性保证:
扩展StackADT的实现细节:
迭代器支持:
template<typenameT>classStack{ std::vector<T> data;public:// 添加迭代器支持autobegin()const{returndata.begin(); }autoend()const{returndata.end(); }autorbegin()const{returndata.rbegin(); }// 反向迭代器autorend()const{returndata.rend(); } };容量管理:
size_tsize()const{returndata.size(); }boolempty()const{returndata.empty(); }voidreserve(size_tnew_cap){if(new_cap > MAX_CAPACITY)throwstd::length_error("Exceeded max capacity"); data.reserve(new_cap); }voidshrink_to_fit(){ data.shrink_to_fit(); }异常安全:
// 强异常保证的push操作voidpush(constT& val){if(size() >= MAX_CAPACITY)throwstd::overflow_error("Stack full");try{ data.push_back(val); }catch(conststd::bad_alloc& e) {// 处理内存分配失败等异常throwstd::runtime_error("Memory allocation failed"); } }移动语义支持:
voidpush(T&& val){if(size() >= MAX_CAPACITY)throwstd::overflow_error("Stack full"); data.push_back(std::move(val));// 避免不必要的拷贝}template<typename... Args>voidemplace(Args&&... args){// 原位构造data.emplace_back(std::forward<Args>(args)...); }实际工程应用:
具体实现建议:
使用有意义的枚举而非魔术数字:
// 不好的写法voidset_cache_policy(intpolicy){if(policy ==1) {/* LRU */}elseif(policy ==2) {/* FIFO */} }// 好的写法enumclassCachePolicy { LRU, FIFO, LFU };voidset_cache_policy(CachePolicy policy){switch(policy) {caseCachePolicy::LRU:/*...*/break;caseCachePolicy::FIFO:/*...*/break; } }限制函数参数数量(≤3个):
// 不好的写法voidprocess(inta,intb,boolc,floatd,conststd::string& e);// 好的写法structProcessParams{intinput1 =0;intinput2 =0;boolenableFeature =false;floatadjustment =1.0f; std::string config ="default"; };voidprocess(constProcessParams& params);遵循单一职责原则:
// 不好的写法classDataProcessor{public:voidloadData();voidprocessData();voidsaveResults();voidgenerateReport(); };// 好的写法classDataLoader{/*...*/};classDataProcessor{/*...*/};classResultSaver{/*...*/};classReportGenerator{/*...*/};实现复用的方法:
策略模式示例(排序策略):
classSortStrategy{public:virtualvoidsort(std::vector<int>&)=0;virtual~SortStrategy() =default; };classQuickSort:publicSortStrategy {/*...*/};classMergeSort:publicSortStrategy {/*...*/};classDataProcessor{ std::unique_ptr<SortStrategy> strategy;public:voidsetStrategy(std::unique_ptr<SortStrategy> s){ strategy = std::move(s); }voidprocess(){ strategy->sort(data); } };迭代器模式示例(统一遍历):
template<typenameT>classTree{// ...树实现...public:classIterator{// 迭代器实现};Iteratorbegin(){/*...*/}Iteratorend(){/*...*/} };// 客户端代码可以统一处理各种容器template<typenameContainer>voidprocessAll(Container& c){for(auto& item : c) {// 处理每个元素} }具体场景分析:
内存敏感场景(嵌入式设备):
延迟敏感场景(高频交易系统):
吞吐量敏感场景(大数据处理):
需求分析:
方案设计:
实现优化:
测试验证:
文档维护:
示例设计决策表:
| 设计方面 | 考虑因素 | 最终选择 | 理由 |
|---|---|---|---|
| 底层存储 | 内存效率 vs 灵活性 | 分块数组 | 平衡随机访问和扩容开销 |
| 并发控制 | 锁粒度 | 细粒度锁 | 高并发场景下减少竞争 |
| 内存管理 | 预分配策略 | 几何增长 | 减少扩容次数同时避免浪费 |
| 异常安全 | 错误处理 | 强异常保证 | 确保操作失败时不破坏状态 |