堆栈

c#堆栈的使用

心已入冬 提交于 2019-12-04 06:55:37
c#堆栈的使用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Test191112 { class Program { static void Main(string[] args) { Stack st = new Stack(); st.Push('A'); st.Push('B'); st.Push('C'); st.Push('D'); Console.WriteLine("当前堆栈:"); foreach(char c in st){ Console.Write(c+" "); } Console.WriteLine(); st.Push('E'); st.Push('F'); Console.WriteLine("栈Stat顶部的元素值是:{0}",st.Peek()); if (st.Contains('D')) { Console.WriteLine("栈中已经存在这个元素了!"); } else { st.Push('0'); } Console.WriteLine("当前堆栈:"); foreach (char c in st) { Console.Write(c +

查看.NET应用程序中的异常(下)

左心房为你撑大大i 提交于 2019-12-04 06:17:19
为什么要使用内存转储进行调试? 在两种主要情况下,您可能需要使用内存转储进行调试。第一种情况是应用程序有一个未处理的异常并崩溃,而您只有一个内存转储。第二种情况是,在生产环境中出现异常或特定行为,并且在排除故障时不能将调试器保留在附件中,因为调试器可能会中断用户服务。相反,您可以附加cdb,在正确的位置创建转储文件,然后分离调试器,这意味着应用程序只在服务中有一个小的中断时继续运行。当然,取决于你的环境,这并不总是可能的,但有时可能是你唯一的选择。让我们来看看如何在cdb和Visual Studio中使用内存转储进行调试。这来自本文附带的example2.exe应用程序。它有很多选项,但我们将要讨论的是为什么cdb比Visual Studio更快。首先,您应该启动一个命令提示符并使用调试工具切换到目录,然后运行“doDebug.cmd”文件,如前一篇文章所述(也附在zip文件中)。然后是“cdb-z c:\pathToDumpFile\stackOverflow.dmp”。应按照以下要求打开: 这表明我们有一个内存充足的小型转储,所以我们有我们需要的部分。 我们有一个异常,在这种情况下是“堆栈溢出”异常。 我们知道存在堆栈溢出,但不知道这是托管还是非托管问题,所以让我们获取本机堆栈跟踪“kf” 这显示了 mscorwks!CallDescrWorker 调用了未知的方法

如何通过命令行查看Android手机的Activtiy堆栈信息和手机分辨率

落花浮王杯 提交于 2019-12-04 03:46:04
查看 activity 栈的状态: adb shell dumpsys activity Android has an interesting command called dumpsys to dump some system information. Even described on adb manual I think that some points should be reinforced. In order to get the complete status just run (will produce a large output): adb shell dumpsys 一些关键命令解释 名字 功能 account 显示accounts信息 activity 显示所有的activities的信息 cpuinfo 显示CPU信息 window 显示键盘,窗口和它们的关系 wifi 显示wifi信息 batteryinfo $package_name 电量信息及CPU 使用时长 package packagename 获取安装包信息 usagestats 每个界面启动的时间 statusbar 显示状态栏相关的信息 meminfo 内存信息(meminfo $package_name or $pid 使用程序的包名或者进程id显示内存信息) diskstats

通过 ulimit 改善系统性能

非 Y 不嫁゛ 提交于 2019-12-04 03:39:51
概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。本文将在后面的章节中详细说明 ulimit 的功能,使用以及它的影响,并以具体的例子来详细地阐述它在限制资源使用方面的影响。 ulimit 的功能和用法 ulimit 功能简述 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。 而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。 ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小

通过 ulimit 改善系统性能

谁说胖子不能爱 提交于 2019-12-04 03:39:39
本文介绍了 ulimit 内键指令的主要功能以及用于改善系统性能的 ulimit 使用方法。通过这篇文章,读者不仅可以了解 ulimit 所起的作用,并且可以学会如何更好地通过 ulimit 限制资源的使用来改善系统性能。 概述 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。本文将在后面的章节中详细说明 ulimit 的功能,使用以及它的影响,并以具体的例子来详细地阐述它在限制资源使用方面的影响。 回页首 ulimit 的功能和用法 ulimit 功能简述 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。 而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件

C++的逆波兰表达式的求解

梦想的初衷 提交于 2019-12-04 02:09:53
逆波兰表示法 (Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家 扬·武卡谢维奇 1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。 逆波兰结构由弗里德里希·鲍尔(Friedrich L. Bauer)和艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈结构和减少计算机内存访问。逆波兰记法和相应的算法由澳大利亚哲学家、计算机学家查尔斯·汉布林(Charles Hamblin)在1960年代中期扩充 在1960和1970年代,逆波兰记法广泛地被用于台式计算器,因此也在普通公众(工程、商业和金融领域)中使用(百度百科)。 算法: 一、 将中缀表达式转换成后缀表达式算法: 1、从左至右扫描一中缀表达式。 2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈 3、若读取的是运算符 (1) 该运算符为左括号"(",则直接存入运算符堆栈。 (2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。 (3) 该运算符为非括号运算符: (a) 若运算符堆栈栈顶的运算符为括号,则直接存入运算符堆栈。 (b) 若比运算符堆栈栈顶的运算符优先级高或相等,则直接存入运算符堆栈。 (c)

关于 C/C++ 函数调用约定

北城以北 提交于 2019-12-03 20:39:28
关于 C/C++ 函数调用约定,大多数时候并不会影响程序逻辑,但遇到跨语言编程时,了解一下还是有好处的。 VC 中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,为了跟Windows API 保持一致,建议使用 __stdcall 方式。 调用约定跟堆栈清除密切相关。如果写一个汇编函数,给 C/C++ 调用,在 __cdecl 方式下,则汇编函数无需清除堆栈,在 __stdcall 方式下,汇编函数需要在返回(RET)之前恢复堆栈。 C 语言有 __cdecl、__stdcall、__fastcall、naked、__pascal。 C++ 语言有 __cdecl、__stdcall、__fastcall、naked、__pascal、__thiscall,比 C 语言多出一种__thiscall 调用方式。 在VC中,可以设置默认的调用约定,设置路径为: Project à Properties à Configuration Properties à C/C++ à Advanced à Call Conversion。 下面详细介绍如上六种调用方式: 1、__cdecl __cdecl调用约定又称为 C 调用约定,是 C/C++ 语言缺省的调用约定。参数按照从右至左的方式入栈,函数本身不清理栈

Think in Java —— JAVA 对象

久未见 提交于 2019-12-03 18:41:42
1.用引用操作对象 在java当中一切都被视作为对象,在这具有共同特征的时候就可以采用单一固定的语法来对这些对象进行处理和分析。尽管一切都看成了对象,但真正操纵的并不是对象本身,而是对象的一个“引用”(举一个书中的例子就很明了了,遥控器和电视,电视是一个对象,而遥控器是所谓的“引用”。只要掌握遥控器这个“引用”就可以操控遥控器“对象”,实际上操控的是遥控器而非对象本身)。此外就算是没有电视机,引用依然可以存在。当然如果你需要去使用遥控器,就要和对象进行绑定起来。这就是引用和对象的关系了。 2.对象存储在什么地方 在程序运行时,对象是怎样进行放置安排的?内存又是怎样分配的。 寄存器 。 这是最快的存储区,因为它位于不同于其它存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配,你不能直接控制,也不能在程序中感觉到寄存器的存在。 堆栈。 位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放这些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以某些Java数据存储于堆栈中——特别是对象引用,但是Java对象并不存储在其中。 堆。 一种通用的内存池

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof

早过忘川 提交于 2019-12-03 10:48:27
前提概要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一种工具都有其自身的特点,用户可以根据你需要检测的应用或者程序片段的状况,适当的选择相应的工具进行检测。接下来的两个专题分别会讲VisualVM的具体应用。 现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ...... 这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。 一、 jps(Java Virtual Machine Process Status Tool) : 基础工具 实际中这是最常用的命令,下面要介绍的小工具更多的都是先要使用jps查看出当前有哪些Java进程,获取该Java进程的id后再对该进程进行处理。 jps主要用来输出JVM中运行的进程状态信息。语法格式如下: Java代码 jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器。 命令行参数选项说明如下: Java代码

JVM 线上故障排查基本操作 (转)

人盡茶涼 提交于 2019-12-03 10:25:43
前言   对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的。各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题。楼主同样也遇到过这些问题,那么,遇到这些问题该如何解决呢?   首先,出现问题,肯定要先定位问题所在,然后分析问题原因,再然后解决问题,最后进行总结,防止下次再次出现。   本文的排查环境是 Linux。 CPU 飚高 问题:线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢? 思路 :首先找到 CPU 飚高的那个 Java 进程 ,因为你的服务器会有多个 JVM 进程。然后找到那个进程中的 “ 问题线程 ”,最后根据 线程堆栈信息 找到问题代码。最后对代码进行排查。 如何 操作 呢? 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。 再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID. 通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。 由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。使用 printf "%x\n" [十进制数字] ,可以将10进制转换成16进制