个人学习
文章平均质量分 61
个人感悟、心得体会、醍醐灌顶好文
十秒耿直拆包选手
这个作者很懒,什么都没留下…
展开
-
jdk17 下 netty 导致堆内存疯涨原因排查 | 京东云技术团队
1. 流程图:跨数据中心同步数据单 channel 管道同步数据能力不足,导致 tcp 环阻塞。从而导致 netty eventLoop 的消费 WriteTask 任务 (WriteAndFlush) 中的 write 能力大于 flush 能力,因此申请的大量的直接内存存放在 ChannelOutboundBuffer#unflushedEntry 链表中没法 flush。转载 2023-09-10 17:08:37 · 329 阅读 · 0 评论 -
Qt多线程编程之QThreadPool 和 QRunnable使用
在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在日常开发中,内存资源是及其宝贵的,所以线程池QThreadPool就建议用来管理多个线程的并发执行。在程序逻辑中经常会碰到需要处理大批量任务的情况,比如密集的网络请求,日志分析、加载工程中多个子工程、保存工程等等。一般会创建一个队列,用一个或者多个线程去消费这个队列,一般也要处理队列的加锁和解锁的问题。QThreadPool 类管理 QRunnable /QThread 的集合。转载 2023-08-12 09:29:26 · 816 阅读 · 0 评论 -
C++学习:文字常量;变量;指针基本概念
文字常量一般指 cpp 自己定义的一组数值数据类型,“文字” 是因为我们只能够以它的值的形式指代它;“常量” 是指我们无法改变它的值。每个文字都有其相对应的类型,例如 1、2、3 是 int 类型;3.1415926 是 double 文字。文字常量是不可寻址的,它的值存在于机子的内存中,但是我们没有办法获取其地址。原创 2023-08-08 17:35:18 · 243 阅读 · 0 评论 -
C/C++ 编译过程详解
C 语言编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大家可以多了解一些,在遇到问题时多思考、多实践。转载 2023-08-08 17:30:54 · 172 阅读 · 0 评论 -
c++ switch 语句
default 分支:当传入的表达式值与某个 case 后面的常量值相等,就执行此 case 后面的语句,如果所有的 case 语句中表达式都不匹配,就执行 default 语句;若没有 default 语句,则直接退出 switch 语句。case 常量表达式:其中的表达式不能重复,如果有任意两个 case 之后的常量表达式值相同,则会编译报错,因为程序不知道当传入的常量为此表达式值时,执行哪条语句。整数型分支判断:switch 括号中的表达式只能是整数、字符型或枚举型表达式。原创 2023-08-08 17:24:09 · 1240 阅读 · 0 评论 -
c++位运算及相关操作
因为整数中的 1,2,4,8(2^n n=0,1,2,3,4.....)用二进制表示分别为 0B0001,0B0010,0B0100,0B1000,保证了只有一位为 1,其余均为 0 的特性,可以 “过滤” 出特殊位置出的数值。例如:要获取整数 12(0B1100)在第 1 位上数值(为 0),第 2 位上数值(为 1),第 3 位上数值(为 1)。在此,我使用位操作符中的 “&” 进行读取。在 c++ 中,可以对二进制、八进制、十六进制数直接进行操作,只需在赋值时标明进制,0B 或 0b,0,0x。原创 2023-08-08 16:48:07 · 258 阅读 · 0 评论 -
C++ Lambda表达式的完整介绍
这个实例中直接将排序函数的实现写在应该传递函数的位置,省去了定义排序函数的过程,对于这种不需要复用,且短小的函数,直接传递函数体可以增加代码的可读性。capture 子句(在 C++ 规范中也称为 Lambda 引导。参数列表(可选)。(也称为 Lambda 声明符)mutable 规范(可选)。exception-specification(可选)。return-type 返回值(可选)。Lambda 体。原创 2023-08-07 19:39:03 · 386 阅读 · 0 评论 -
Qt学习:Qt 进程和线程之四,线程实际应用
为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程。大多数情况下,多线程耗时操作会与 UI 进行交互,比如:显示进度、加载等待。。。让用户明确知道目前的状态,并对结果有一个直观的预期,甚至有趣巧妙的设计,能让用户爱上等待,把等待看成一件很美好的事。原创 2023-08-07 16:55:30 · 754 阅读 · 0 评论 -
JavaFX中MVC例子理解
同时,PersonTableUtil有多个static方法返回TableColumn,进行处理,并根据显示模块的要求进行处理。模型模块PersonTableUtil保存领域数据Person,因为只是显示数据,所有此示例中没有controller模块,显示模块SimplestableView。一个GUI应用程序执行三个任务:接受用户的输入,处理输入,并显示输出。启用方法start01的运行结果如下图,02/03方法主要对数据插入不同列,在模型外添加模型数据测试。start02方法和start03方法自测。原创 2023-07-14 19:38:59 · 1912 阅读 · 0 评论 -
IDEA 配置 openjdk,jre
使用 idea 配置 zip 版本的 openjdk 和 jre,我使用的时 redhat 提供的 jdk 和 jre。根据 jdk 的安装路径选择,设置 jdk 名字为 “openjdk-11.0.11.9-1”在 Project SDK 中选择刚才设置的 SDKs。下划线的分别为我的 jdk 和 jre 保存路径。点击 Project Structure 按钮。选择 SDKs,点击 “+” 添加 jdk。一、下载 idea、jdk 和 jre。原创 2023-07-09 22:53:52 · 4202 阅读 · 0 评论 -
cpp学习:文字常量;变量;指针基本概念
1文字常量:文字常量一般指cpp自己定义的一组数值数据类型,“文字”是因为我们只能够以它的值的形式指代它;“常量”是指我们无法改变它的值。每个文字都有其相对应的类型,例如1、2、3是int类型;3.1415926是double文字。文字常量是不可寻址的,它的值存在于机子的内存中,但是我们没有办法获取其地址。2变量:变量时一个有名字的内存存储区,程序可以通过对变量进行读rwx操作原创 2013-10-26 21:41:44 · 773 阅读 · 0 评论 -
C++学习:不在构造和析构过程中调用 virtual 函数
从构造方法或析构方法中调用虚拟方法在大多数情况下被认为是危险的,必须尽可能地避免。所有的C++实现都需要在当前构造函数中调用定义在层次结构中的函数版本,而不是更进一步。你可以在构造方法中调用一个虚拟方法。对象的构造是自下而上的,"先基后派"。不要在构造或析构方法中调用虚拟方法。原创 2023-07-03 20:25:23 · 93 阅读 · 0 评论 -
C++中拷贝构造函数和赋值操作符(Copy constructor & Assignment operator)
在C++中,经常会将对象进行赋值或拷贝,在C++中,在程序员没有手动编写相关内容时,系统会自动创建拷贝构造函数和复制操作符内容,对于值类型数据使用系统默认的函数可以正常运行,但是对于类类型、指针类型,系统自动自动创建的操作函数无法将类类型、指针类型创建副本,而是两个类对象同时持有一个拷贝副本,改变一个类对象数据,会造成另个一类对象数据改变,造成隐性bug。可以看到base01由base赋值,随后对base01的字段进行了修改,打印两者的字段,发现base的字段没有跟随base01的值而改变。原创 2023-07-03 16:09:06 · 530 阅读 · 0 评论 -
C++11 nullptr与nullptr_t
在main函数中,f(NULL)调用的起始是第二个函数,因为在C++98中,字面常量0具有二义性:既可以是一个整型,也可以是一个无类型指针(void*)。使用nullptr_t时必须包含头文件:,但是使用nullptr时则不用,因为nullptr是关键字。nullptr是有类型的,且仅可以被隐式转化为指针类型,在编写C++11代码时,使用nullptr替换NULL将使得代码更健壮。注:如果上述代码注释部分能通过编译,可能是编译器版本不够新,在C++11中不允许上述注释代码。转载 2023-07-03 13:40:42 · 1264 阅读 · 0 评论 -
JavaFX学习:Observable Collections(观察集合)
注意,ObservableList接口重写了(Override)Observable接口中的addListener()、removeListener()方法,在Observable接口中,addListener()、removeListener()方法注册/注销InvalidationListener接口。JavaFX在Java集合基础上派生出可以监听集合内容变化的三种集合接口。Java的 集合接口不仅继承Java的List、Map、Set接口,同时还继承JavaFX中的Observable接口。原创 2023-06-29 23:13:32 · 609 阅读 · 0 评论 -
无线发射功率
3 dB = 1/2 功率。-6 dB = 1/4 功率。+3 dB = 2x 功率。+6 dB = 4x 功率。题2、题3可以使用3dB法则。原创 2023-06-23 21:25:10 · 662 阅读 · 0 评论 -
模拟电路中测量参数解析:SNR、SINAD、ENOB
有效位数ENOB,单位为bit,用于描述ADC/DAC系统的有效分辨率。对于理想的N位ADC系统,其ENOB应当无限接近N,但真实电路会不可避免的引入噪声,从而降低ADC的实际分辨率。信号对噪声和失真的比值SINAD,单位为dB,是输入信号和所有输出信号失真(包括谐波成分,不包括直流)的功率之比,用于评估输出信号所有传递函数的非线性加上系统所有噪声(量化、抖动和假频)的累积效果。理想状态下只考虑ADC的量化噪声,可以推导出SNR理想值,公式如下,借此来评估测试系统SNR值的好坏。(N:ADC的分辨率)原创 2023-06-23 18:08:15 · 1146 阅读 · 0 评论 -
sublime text 打开 txt 文档乱码问题
对于 windows 系统使用系统自带的 txt 编辑工具,默认打开和保存文件的文件的格式是 GBK 或者 GB2312,而 sublime 默认仅支持 utf-8,所以当从 windows 系统拷贝文件在 mac 上浏览有时候会出现乱码的问题,这时候就需要安装插件使 submile 对这两种编码格式进行支持。步骤:按键 Ctrl+Shift+P -> 输入 IP -> 选择 Package Control: Install Package -> 输入 ConvertToUTF8 -> 回车。原创 2023-06-19 10:15:48 · 1678 阅读 · 0 评论 -
输入阻抗、输出阻抗和阻抗匹配
其中,R是电阻,j是虚数单位,wL是感抗,1/wc是容抗。读者问了一个问题:“集总参数电路中,阻抗匹配(内阻=外阻)可以使负载得到最大的功率输出”这句话怎么理解?在百度词条中,给阻抗的定义是:在具有电阻、电感和电容的电路里,对电路中的电流所起的阻碍作用叫做阻抗。很多电路都有输出阻抗的概念,以电源举例,我们从输出这个点看进去,把电源当做一个整体,示波器测量。表示,是一个复数,实部称为电阻,虚部称为电抗,电抗由容抗和感抗组成。上,测量得出的电阻即为输入电路的输入阻抗,记为。的正负极电阻,即可得到电源电路的。转载 2023-06-23 16:06:57 · 747 阅读 · 0 评论 -
C++ 编译和链接过程
我们知道,用 c/c++ 语言编写程序的时候,必须要经过过程,才能将我们 c/c++ 的源代码转化为可执行文件(Windows 下是.exe 程序,Linux 下是 elf 格式的可执行文件)。那么编译和链接过程到底做了什么,这个可执行文件又是被加载到哪里运行的呢。转载 2023-06-21 01:46:43 · 141 阅读 · 0 评论 -
驻波比理解
在上面看到的两个例子中,它是快照(1)和(11)的驻波振幅之比。换句话说,如果你有更大的SWR,两个行波的振幅是相似的。简而言之,如果是较大的反射系数,会得到较大的驻波比,如果是较小的反射系数,会得到较小的驻波比。在这种情况下,波的某些部分将转移到另一介质,但波的某些部分将被反射回来,如下所示。在上面的例子中,两个行波的振幅完全相同。两个行波的快照序列例子(蓝色的一个向右移动,绿色的一个向左移动)。红色的是蓝色的和绿色的总和形成的波)。这是两个行波(蓝色和绿色)对齐的快照,两个行波的相位差为180度。原创 2023-06-20 21:56:41 · 880 阅读 · 1 评论 -
QtCreator屏蔽指定警告:如C4819等
QtCreator 频繁报出warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。在工程文件.pro里面添加,然后clear项目重新编译即可。在工程文件.pro里面添加。预编译代码到公共头文件里面。方法二:(屏蔽所有警告)格式以防止数据丢失。方法一:(屏蔽此警告)原创 2023-06-20 17:57:53 · 719 阅读 · 0 评论 -
QtCreator 编译时提示 warning C4819 的解决办法
QtCreator 保存文件默认是 utf-8 格式的,但是不带 BOM。我们可以修改一下设置,让它每次保存是都保留 BOM。这个警告我们可以忽略,但是编译大一点的项目时经常会提示几十个这样的警告,其实将我们的代码保存为 utf-8 带 BOM 格式的文件就可以了。warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。QtCreator 编译时提示 warning C4819 的解决办法。原创 2023-06-19 22:36:38 · 508 阅读 · 0 评论 -
QtCreator 代码自动补全、提示设置及自动补全变慢解决方案
使用 QtCreator 编程时,希望 IDE 能够自动进行代码提示,补全,便于程序员使用。在这里我把自己的设置和使用心得与大家分享,希望能够对你有所帮助,如有不对,希望能够指出,帮助我进步。把复选框对号去掉,重启 ide 后即可。目前 “Qt 6.2.1 (MSVC 2019, 64 bit)” 测试可用。最主要是最后一行标红,这个是进行代码提示的阈值设置,我这里设置的当输入 2 个字符时进行代码提示。在 帮助 -> 关于插件 ->C++ 选项卡中,取消 ClangCodeMode。原创 2023-06-19 10:17:10 · 2064 阅读 · 0 评论 -
Qt 中的强制类型转换:qvariant_cast ,qobject_cast
在 C++ 开发中经常要进行数据类型的强制转换。刚开始学习的时候,直接对基本数据类型强制类型转换,如 float fnum = 3.14;随着 C++ 标准的发展,又提供了 dynamic_cast、const_cast 、static_cast、reinterpret_cast 等高级安全的强制转换方法。dynamic_cast: 通常在基类和派生类之间转换时使用,run-time cast。const_cast: 主要针对 const 和 volatile 的转换。转载 2023-06-18 23:55:41 · 990 阅读 · 0 评论 -
Qt 中动态加载窗口(C++)
在此有两种方法可以动态生成窗口:一:直接在槽函数中调用窗口类。二:将 **.ui 添加到资源文件,通过 QUiLoader 加载。1)在函数中实例化窗体 gotocelldialog(也可以不用指针,直接创建变量 gotocelldialog)2)使用 show 或 exec 方法将其以非模态 / 模态显示。5)使用 show 或 exec 方法将其以非模态 / 模态显示。3)如果是实例化,在退出函数后应使用 delete 释放资源。1)创建一个 UI 窗体,添加到工程的资源文件中。现将两种方法介绍如下。原创 2023-06-18 23:50:56 · 2900 阅读 · 0 评论 -
Qt 创建 Application 的文件依赖浅析
文件最后在 namespace Ui 中定义继承 Ui_MainWindow 的 MainWindow 类。在使用 QtCreator 创建 Application 程序时,会自动创建 ***.ui 文件,在文件夹 “build-***-Desktop_Qt_***-Debug” 中生成 ui_***.h,***.ui 可以通过 QtDesigner 进行调整,同时还会在 ***.ui 的文件夹内创建一个同名的 c++ 类。这给我们造成很大的疑惑,到底 Qt 是如何生成 UI?在这里我们做简单分析。原创 2023-06-18 16:22:33 · 97 阅读 · 0 评论 -
C++ 运算符重载
函数返回是否是 const 类型:返回是一个拷贝后的临时变量),不能出现在等号的左边 (临时变量不能做左值),函数的结果只能做右值,则要返回一个 const 类型的值。如:int& Point::operator [](int y)// 为什么使用返回引用:返回的值可以做左值,也可以做右值,则必须使用返回引用。函数返回是否是 const 类型:返回原状态的本身,返回值可以做左值,即函数的结果可以做左值,则要返回一个非 const 类型的值。如需要做左值操作数的运算符(如 =,+=,++)转载 2023-06-12 14:39:05 · 71 阅读 · 0 评论 -
Java泛型中T和?(通配符)的区别与使用声明
上面有泛型的定义和赋值;当在实例化时,泛型都要是具体类型,当赋值的类型不确定时(例如某类的子类),我们需要使用通配符(?当调用范型方法时,编译器自动对类型参数(泛型)进行赋值,当不能成功赋值时报编译错误。原创 2023-06-04 22:45:24 · 720 阅读 · 0 评论 -
Java 泛型 02:泛型和虚拟机(类型擦除)
JVM 中没有泛型,只有普通的类和方法。在 JVM 中所有的类型参数都用它们的限定类型替换。桥方法被合成来保持多态。为保持类型安全性,必要时插人强制类型转换。最后,需要注意的是,擦除的类其实仍然保留了一些泛型祖先的微弱记忆。例如, 擦除后原始的 Person 类知道它源于泛型类 Person(但无法区分是由 Person< String > 构造的还是由 Person< Double > 构造的)。原创 2023-06-04 21:38:09 · 632 阅读 · 0 评论 -
Java 泛型 01:基础知识
Java 泛型(二):泛型和虚拟机(类型擦除)中已经详细说明了 Java 虚拟机(JVM,Java Virtual Machine)是如何应对泛型数据的 —— 类型擦除机制。这种做法即兼容了泛型出现之前的 JDK 版本,同时也解决了 JVM 没有泛型类型的对象的问题。但是,上帝给你打开了一扇门,肯定会给你关上另外一扇窗,没有哪种方法是十全十美的。前四点局限性并不难理解,类型擦除之后所有泛型类型都会转化为其所对应的原始类型,如参数 T 被转化为 Object 类型。原创 2023-06-04 20:43:16 · 507 阅读 · 0 评论 -
Java内部类的理解
TimerPrinterI 作为局部内部类,不能用 private、public、protected 等修饰符来生命,local inner class 的作用域被限定到生命该局部类的块中,这样使得 TimerPrinterI 类完全对外界隐藏,只有包含它的 start 方法知道其存在,即使是 Outter class TalkingClockI 都不知道 TimerPrinterI 的存在。内部类顾名思义,就是定义在其它类内部的类,在这里内部类有两种区分:在其它类的内部;在其它类的方法的内部。原创 2023-06-04 13:11:59 · 300 阅读 · 0 评论 -
c++ 学习 定位 new 表达式
定位 new 表达式,就是在内存中 new 一块地址,然后根据程序的需要,将大小适合的实例对象放到此内存块中操作的方法。在此我借用《cpp primer 3rd》中 p347 中的例子给予说明,不足之处,恳请各位读者斧正。在 cpp 中,new 主要有 3 种用法:实例化一个对象;在这里主要讨论第三种用法,定位 new 表达式。由此可见因为 19 行的实例化在第三个 Foo 的 “位置”,第 28 行的实例化在第二个 “位置”,两者之间没有重叠处。有一个打印到 console 的方法 writeFoo。原创 2023-06-04 11:55:59 · 135 阅读 · 0 评论