首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

适合具备 C 语言基础的 C++ 教程(十三)

如果在main函数中的i的最大值是是一个很大的数,那么程序就会调用很多次test_func函数,但是由于test_func函数里没有delete操作,那么这个时候由new获得的内存就会一直不能得到释放,...最终导致程序崩溃。...紧接着,我们来编写sp类的代码,注意:我们在讲述原理的时候,提到了定义一个能够记录指向Person类次数的变量,那么在接下来的代码中,只要涉及指向Person类的操作的时候,就需要将count加一,下面是...image-20210228210842670 对照着代码,我们可以看到Person对象被指向的次数,而且在更改之后的基础上运行,代码就没有出现错误了。...Person& operator*() { return *p; } }; 另外需要注意的一点就是上述中使用&而不是直接返回值的原因是为了提高效率,因为如果是返回值的话就需要调用构造函数

43710

Android Framework学习(六)之RefBase,SP,WP

轻量级引用计数的实现:LightRefBase LightRefBase的实现很简单,只是内部保存了一个变量用于保存对象被引用的次数,并提供了两个函数用于增加或减少引用计数。...当智能指针销毁的时候调用智能指针的析构函数: template sp::~sp() { if (m_ptr) m_ptr->decStrong(this); } 调用实际对象即...operator=(const RefBase& o); weakref_impl* const mRefs; }; 不同于LightRefBase中通过mCount保存对象被引用的次数...当sp销毁时其析构函数调用对象即RefBase的decStrong函数: void RefBase::decStrong(const void* id) const { weakref_impl...>mStrong); impl->mBase->onFirstRef(); } return true; } 首先通过incWeak将弱引用数加1(被强指针sp引用会导致强引用数和弱引用数同时加

82731

适合具备 C 语言基础的 C++ 入门教程(十三)

如果在main函数中的i的最大值是是一个很大的数,那么程序就会调用很多次test_func函数,但是由于test_func函数里没有delete操作,那么这个时候由new获得的内存就会一直不能得到释放,...最终导致程序崩溃。...紧接着,我们来编写sp类的代码,注意:我们在讲述原理的时候,提到了定义一个能够记录指向Person类次数的变量,那么在接下来的代码中,只要涉及指向Person类的操作的时候,就需要将count加一,下面是...getStrongCount()<<endl; } return 0; } 编译,执行,下面是代码执行的结果: [image-20210228210842670] 对照着代码,我们可以看到Person对象被指向的次数...Person& operator*() { return *p; } }; 另外需要注意的一点就是上述中使用&而不是直接返回值的原因是为了提高效率,因为如果是返回值的话就需要调用构造函数

33500

Android framework学习(2)——Handler Native层

需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致...(env); } nativeMessageQueue继承自RefBase类,所以decStrong最终调用的是RefBase.decStrong(). 【3】RefBase::decStrong()...==> RefBase.cpp void RefBase::decStrong(const void* id) const { weakref_impl* const refs = mRefs;...包含唤醒过程的添加消息的调用链,如下: 下面来进一步来看看调用链的过程: 【1】MessageQueue.enqueueMessage() ==> MessageQueue.java boolean...)/epoll_ctl()来完成对mWakeEventFd和mRequests的可读事件监听 2.nativeDestroy()方法 调用RefBase::decStrong()来减少对象的引用计数

58020

Android跨进程通信IPC之4——AndroidIPC基础2

因此如果有"第三方"视图用ptr来使用内存对象,它首先通过判断发现ptr不为空,自然而然的就认为这个对象还是存在的,其结果就是导致死机。...假设2:假设ptr1和ptr2都指向对象A,后来我们通过ptr1释放了A的内存空间,并且将ptr1也置为null;但是ptr2并不知道它所指向的内存对象已经不存在了,此时如果ptr2来访问A也会导致死机...如果不考虑智能指针,这样的情况不会导致任何问题,但是在智能指针的场景下,就要注意了,因为Parent指向了Child,所以Child的引用计数器不为零。...无非就是考察减少强弱引用时系统所遵循的规则,如下所示是decStrong的情况。...const_cast(mRefs) = NULL; } 在这种情况下,RefBase既然是有decStrong删除的,那么从上面的decStrong的执行顺序来看mWeak

1.2K40

【面试题精讲】JVM-运行时数据区-StackOverFlowError

当一个方法被递归调用次数过多,或者方法调用的层级太深时,就会导致栈空间不足,从而抛出 StackOverflowError 异常。 2. 为什么会出现 StackOverflowError?...StackOverflowError 还可能由于无限循环引起,当一个方法内部存在一个无限循环,循环次数过多时也会导致栈溢出。 3....当递归调用的层级过多时,栈空间可能会不足以容纳每个方法栈帧,这就导致了 StackOverflowError 异常的抛出。 4....,当调用次数超过栈的容量时,就会抛出 StackOverflowError 异常。...总结 StackOverflowError 是 Java 中的一个异常,表示方法调用过程中栈空间不足。它的主要原因是方法递归调用过多或者存在无限循环。

22840

因Full GC导致CPU飙升到100%问题排查记录

这里是一个比较典型的触发CPU飙高的场景,单次调用会生成大对象导致占用大量的年轻代空间。...如果在业务高峰期,调用这个商品查询接口的频次很高的话,会导致堆内存飙升,老年代空间飙升,最终导致Full GC,如果不停地请求这个接口,会发现GC垃圾回收的时间会不停地加长,因为刚回收完,又产生了大量的对象放到了老年代中...一般会引发CPU飙高的场景 1.内存消耗过大,导致Full GC次数过多 代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致Full GC次数过多,系统缓慢; 执行步骤1-5: 多个线程的CPU...都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程-》上一节步骤2 通过jstat命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。...(MAT),内存泄漏插件,安装使用一条龙; 内存占用不高,但是Full GC次数还是比较多,此时可能是代码中手动调用 System.gc()导致GC次数过多,这可以通过添加 -XX:+DisableExplicitGC

78210

适合具备 C 语言基础的 C++ 教程(十五)

前言 在上一则教程中,叙述了当处于多线程环境下时,智能指针所指向的引用计数可能会因为此导致引用计数出问题,因此,引入了原子操作的相关概念,换句话说,这种操作也被称之为是轻量级指针,那对于这种轻量型指针又会存在什么问题呢...对于这句代码,Person对象的指针传给了sp father,这也就导致了sp(T *other)被调用,而这步操作也就增加了这个Person对象的引用计数(此时引用计数值等于 1) 紧接着...Person对象的指针传给sp son,导致sp(T *other)被调用,它增加了Person对象的引用计数,现在这个值等于1。...同样的,我们再来看如下所示的代码: son->setFather(father); 根据上述分析, father所指向的对象的引用计数值变为2,这么一来,当函数test_func调用完成然后退出的时候...class RefBase { private: int mStrong; int mWeak; public: void incStrong(void); void decStrong

46520

爬虫问题一:栈溢出(stack overflow)问题解决方案

在爬取某个网页的时候遇到了这个问题: Fatal Python error: Cannot recover from stack overflow ---- 我问题所在:使用函数时递归调用次数过多(800...左右会出现),导致栈溢出。...在Python中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,相当于一次push压栈操作,每当函数返回,相当于一次pop出栈操作。...由于栈的大小不是无限的,所以,递归调用次数过多,会导致栈溢出。...函数递归调用层次过深 ,每调用一次,函数的参数、局部变量等信息就压一次栈,并且没有及时出栈。 2. 局部变量体积太大 可以通过下面这张图来辅助我们理解,当栈的空间接近被占完时,会发生溢出现象 ?

4.8K40

【Java】Java中栈溢出的常见情况

在Java编程中,栈溢出(StackOverflowError)是一个常见的错误,通常发生在递归调用过深、大量方法调用、无限循环以及线程过多等情况下。...这种错误通常发生在递归调用的层次过深,超出了栈空间的容量,导致程序无法继续执行。 递归函数通常会在每次调用时将当前状态保存到栈中,并在递归结束时从栈中恢复状态。...但如果递归没有适当的终止条件,或者终止条件不明确,递归调用会无限进行下去,导致栈空间不断增长,最终耗尽内存,触发栈溢出错误。...如果方法调用过多,或者每个方法中的局部变量过多,栈空间可能会被耗尽,导致栈溢出错误的发生。...当方法调用次数过多时,栈空间可能会被耗尽,导致栈溢出错误的发生。 3. 循环递归 无限递归在循环中缺少适当的终止条件,或者终止条件永远不被满足时,会导致递归无限进行,最终耗尽栈空间,触发栈溢出错误。

7410

线上CPU飙升100%问题排查,一篇足矣

二、问题复现 线上系统突然运行缓慢,CPU飙升,甚至到100%,以及Full GC次数过多,接着就是各种报警:例如接口超时报警等。此时急需快速线上排查问题。...3.2 原因分析 1.内存消耗过大,导致Full GC次数过多 执行步骤1-5: 多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程-》上一节步骤2 通过jstat...命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。...内存占用不高,但是Full GC次数还是比较多,此时可能是代码中手动调用 System.gc()导致GC次数过多,这可以通过添加 -XX:+DisableExplicitGC来禁用JVM对显示GC的响应...代码某个位置有阻塞性的操作,导致该功能调用整体比较耗时,但出现是比较随机的;平时消耗的CPU不多,而且占用的内存也不高。

2.5K20

一次性搞清楚线上CPU100%,频繁FullGC排查套路

“ 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题。 ? 当然,这些问题最终导致的直观现象就是系统运行缓慢,并且有大量的报警。...这种情况可能的原因主要有两种: 代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致 Full GC 次数过多,系统缓慢。 代码中有比较耗 CPU 的操作,导致 CPU 过高,系统运行缓慢。...Full GC 次数过多 相对来说,这种情况是最容易出现的,尤其是新功能上线时。...内存占用不高,但是 Full GC 次数还是比较多,此时可能是显示的 System.gc() 调用导致 GC 次数过多,这可以通过添加 -XX:+DisableExplicitGC 来禁用 JVM 对显示...在这里我们就可以区分导致 CPU 过高的原因具体是 Full GC 次数过多还是代码中有比较耗时的计算了。

58310

系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路

小结 ---- 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。...这种情况可能的原因主要有两种: 代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致Full GC次数过多,系统缓慢; 代码中有比较耗CPU的操作,导致CPU过高,系统运行缓慢; 相对来说,这是出现频率最高的两种线上问题...Full GC次数过多 相对来说,这种情况是最容易出现的,尤其是新功能上线时。...次数还是比较多,此时可能是显示的System.gc()调用导致GC次数过多,这可以通过添加-XX:+DisableExplicitGC来禁用JVM对显示GC的响应。...在这里我们就可以区分导致CPU过高的原因具体是Full GC次数过多还是代码中有比较耗时的计算了。

98850

CPU飙高,频繁GC,怎么排查?

处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。...这种情况可能的原因主要有两种: 代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致Full GC次数过多,系统缓慢; 代码中有比较耗CPU的操作,导致CPU过高,系统运行缓慢; 相对来说,这是出现频率最高的两种线上问题...Full GC次数过多 相对来说,这种情况是最容易出现的,尤其是新功能上线时。...次数还是比较多,此时可能是显示的 System.gc()调用导致GC次数过多,这可以通过添加 -XX:+DisableExplicitGC来禁用JVM对显示GC的响应。...在这里我们就可以区分导致CPU过高的原因具体是Full GC次数过多还是代码中有比较耗时的计算了。

4.4K30

系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路

处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。...这种情况可能的原因主要有两种: 代码中某个位置读取数据量较大,导致系统内存耗尽,从而导致Full GC次数过多,系统缓慢; 代码中有比较耗CPU的操作,导致CPU过高,系统运行缓慢; 相对来说...Full GC次数过多 相对来说,这种情况是最容易出现的,尤其是新功能上线时。...次数还是比较多,此时可能是显示的System.gc()调用导致GC次数过多,这可以通过添加-XX:+DisableExplicitGC来禁用JVM对显示GC的响应。...在这里我们就可以区分导致CPU过高的原因具体是Full GC次数过多还是代码中有比较耗时的计算了。

63220
领券