堆栈

每个程序员都必须掌握的 8 种数据结构!

我只是一个虾纸丫 提交于 2020-03-24 11:40:47
3 月,跳不动了?>>> 作者:IT-Evan https://www.cnblogs.com/IT-Evan/p/12444968.html 数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外,数据结构属于计算机科学和软件工程的基础。当涉及软件工程面试问题时,这是一个关键主题。因此,作为开发人员,我们必须对数据结构有充分的了解。 在本文中,我将简要解释每个程序员必须知道的8种常用数据结构。 1.数组 数组是固定大小的结构,可以容纳相同数据类型的项目。它可以是整数数组,浮点数数组,字符串数组或什至是数组数组(例如二维数组)。数组已建立索引,这意味着可以进行随机访问。 Fig 1. Visualization of basic Terminology of Arrays 数组运算 · 遍历:遍历所有元素并进行打印。 · 插入:将一个或多个元素插入数组。 · 删除:从数组中删除元素 · 搜索:在数组中搜索元素。您可以按元素的值或索引搜索元素 · 更新:在给定索引处更新现有元素的值 数组的应用 · 用作构建其他数据结构的基础,例如数组列表,堆,哈希表,向量和矩阵。 · 用于不同的排序算法,例如插入排序,快速排序,冒泡排序和合并排序。 2.链表

Java进程故障排查思路及步骤

荒凉一梦 提交于 2020-03-23 17:49:44
一、故障现象 Java进程出现问题,通常表现出如下现象: 1.CPU使用率持续极高/低 2.内存占用持续极高,甚至出现OOM(例如:进程正常运行一段时间之后突然不再响应请求,但是进程依然存在) 3.Web应用响应时间很长/超时,甚至不响应直接出现502(使用nginx作为反向代理) 响应时间长、超时,甚至不响应,这是最直观的表现;而CPU使用率极高或极低,频繁出现Full GC甚至OOM,需要借助系统日志或者监控辅助发现。 二、原因分析 响应时间长、超时,甚至不响应,这是一个综合性的故障结果,可能并不单纯是应用程序本身的问题。 首先,需要排查网络连通性是否正常; 其次,如果后端还接了数据存储系统,除了排查应用程序本身的问题之外,还需要排查应用所依赖的第三方组件是否出现了性能瓶颈,这通常可以从应用程序日志中看到错误信息。 在直观的故障表象背后是对应的系统指标异常,排查思路如下。 CPU使用率极低 通常是线程Hang住了,或者是出现了死锁,通过线程堆栈日志可以进行定位。 CPU使用率持续极高 先使用jstack命令查看堆栈信息,结合线程堆栈信息分析可能的原因: 业务代码很忙,甚至出现了死循环,这个从线程堆栈日志中可以 定位到具体的代码块 频繁出现GC,特别是Full GC,从gc日志中可以得知 TCP连接数很高,这通常是高并发导致的 系统日志输出很频繁也会导致CPU占用很高

慎用异常(Exception)

自闭症网瘾萝莉.ら 提交于 2020-03-18 18:39:39
3 月,跳不动了?>>> 异常对性能不利。 1.抛出异常首先要创建一个新的对象。 2.Throwable接口的构造函数调用名为fillInStackTrace()的Native方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过 程中创建了一个新的对象。 因此,异常只能用于错误处理,不应该用来控制程序流程。 如果频度很高的抛出异常,性能下降是很巨大的,参见stackoverflow上的一篇文章 http://stackoverflow.com/questions/299068/how-slow-are-java-exceptions http://java-performance.info/throwing-an-exception-in-java-is-very-slow/ 来源: oschina 链接: https://my.oschina.net/u/96206/blog/425288

产生随机数

久未见 提交于 2020-03-18 15:44:49
Code Segment;定义段 Assume CS:Code,DS:Code,ES:Code; 建立段寄存器寻址 ; ----------------------------------------- ; 功能:输出一个字符 ; 入口:dl=要显示的字符 Output_Chr proc Near ;定义过程. push ax ;压入堆栈 mov ah,02h ;调用中断输出一个数 int 21h pop ax ;弹出堆栈 ret ;过程返回 Output_Chr endp ;过程结束 ; ----------------------------------------- ; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示 ; 入口:AX=二进制数 ; 出口:在当前光标位置显示转换后的ASCII码数字 Dec_ASCII Proc Near push dx ;压入堆栈 push bx ;压入堆栈 push di;压入堆栈 mov bx,10 lea di,@@Temp_Save[6] ;LEA DX,string ;把偏移地址存到DX mov byte ptr [di],'$' dec di ;减 1 cld ;清方向标志位. @@Divide: xor dx,dx ;异或运算 div bx ;无符号除法. or dl,30h ;或运算 mov [di

堆内存和栈内存区别

僤鯓⒐⒋嵵緔 提交于 2020-03-17 07:54:34
原帖地址:http://hi.baidu.com/passionlh/blog/item/bb3a8181d18819debd3e1e6a.html (1) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。 (2) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间! (3) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间

堆内存和栈内存区别

瘦欲@ 提交于 2020-03-17 07:44:23
(1) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。 (2) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间! (3) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。 堆:顺序随意 栈:先进后出 堆和栈的区别

对并发的思考

坚强是说给别人听的谎言 提交于 2020-03-16 20:05:01
并发分成伪并发和真并发 伪并发系统只有一个处理器,但执行多个任务,在某个瞬间,处理器只能执行一个任务,为了“同时”执行多个任务,将多个任务快速的来回切换,只要速度足够快,就会感觉这几个任务是同时执行的。从宏观上讲,伪并发是并发的,从微观上讲,伪并发是串行的。 真并发有多个处理器,在某个瞬间是有多个任务同时在执行的。 复杂系统往往是真并发和伪并发共存,系统中包含多个处理器,其中的每个处理器同时又轮流执行多个任务。 伪并发存在任务的切换,任务切换的本质是将上一个任务的状态保存起来,然后恢复下一个任务的状态。任务的状态也被称作任务上下文。 多线程系统中,任务的状态一部分保存在堆栈中,一部分保存在寄存器中,每个任务一个堆栈以确保状态不会丢失,任务切换时要保存寄存器也是为了保证状态不会丢失。 协程/事件驱动系统中,任务之间是共享堆栈的,因此不能将状态保存在堆栈中,而是要借助状态机来实现状态的保存和恢复。 上述的状态是指广义的状态,包含一切影响任务执行的变量。 来源: CSDN 作者: 半斗米 链接: https://blog.csdn.net/zoomdy/article/details/104834073

JVM系列八(虚拟机性能监控命令).

醉酒当歌 提交于 2020-03-15 23:26:33
jps JVM Process Status Tool,显示指定系统内所有的 HotSpot 虚拟机进程。显示信息包括虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。 jps [-q] [-mlvV] [<hostid>] 选项 作用 -q 只输出 LVMID,省略主类的名称 -m 输出虚拟机进程启动时传递给主类 main() 函数的参数 -l 输出主类的名称,如果进程执行的是 jar 包,输出 jar 路径 -v 输出虚拟机进程启动时 JVM 参数 jstat JVM Statistics Monitoring Tool,用于收集 HotSpot 虚拟机各方面的运行数据。包括显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编码等运行数据。 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。 选项 作用 -class 监视类装载、卸载数量、总空间以及类装载所耗费的时间 -compiler 输出 JIT 编译过的方法、耗时等信息 -printcompilation 输出已经被 JIT 编译的方法 -gc 监视 Java

java数据结构:堆栈

可紊 提交于 2020-03-14 05:43:45
堆栈的数据结构只允许数据从有序列表的一端做输入输出操作。 堆栈数据结构的特点是先进入的数据后处理,后进入的数据先处理,就比如子弹入弹匣一下,先压入弹匣的子弹后面发射出,后压入的子弹先发射。 下面是用数组模拟堆栈:ArrayOfStack.java package Stack; /** * @author zh * 数组实现堆栈 */ public class ArrayOfStack { private Object[] stack = null; private int size; private int top; //默认初始化一个栈堆,大小为100 public ArrayOfStack(){ this.size = 100; this.top = -1; this.stack = new Object[size]; } //初始化一个自定义大小的栈堆 public ArrayOfStack(int size){ this.size = size; this.top = -1; this.stack = new Object[size]; } //判断堆栈是否为空 public boolean isEmpty(){ if(top == -1){ return true; }else return false; } //判断栈堆是否已满 public boolean

STM32 代码堆栈大小分析

孤者浪人 提交于 2020-03-12 15:34:31
1.RO段包括只读代码段(code段/.text段)和常量段(RO Data段/.constdata段)。 2.RW段(.data段)指已被初始化成非0值的变量段。 3. ZI段(.bss段)指未被初始化或初始化为0的变量段。 一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。 要了解RO,RW和ZI需要首先了解以下知识: ARM程序的组成 此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。 一个ARM程序包含3部分:RO,RW和ZI RO是程序中的指令和常量 RW是程序中的已初始化变量 ZI是程序中的未初始化的变量 由以上3点说明可以理解为: RO就是readonly, RW就是read/write, ZI就是zero ARM映像文件的组成 所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。 Image文件包含了RO和RW数据。 之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含