堆栈

jstack命令的使用

浪尽此生 提交于 2020-01-01 07:18:19
jstack命令的使用 文章来源:https://blog.csdn.net/wufaliang003/article/details/80414267 jstack是java虚拟机自带的一种堆栈跟踪工具。 jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者 等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程 序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung 的状态,jstack是非常有用的。 jstack命令: Usage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to

自己动手从头制作WordPress主题(三)探索add_action和do_action

血红的双手。 提交于 2019-12-31 05:07:54
上一篇 我们自己实现了一个简单的主题选项,其中涉及到WP的一个重要的函数add_action,其实只add没有用,WP还要通过另一个函数do_action来执行add_action添加的事件。add_action相当于添加事件和事件处理程序;do_action相当于执行事件。WP是如何保证两者的执行顺序的呢?下面使用调试探索一下: add_action: theme-options.php下面设置断点,访问wp-admin/login.php,中断后的调用堆栈: F5步入后,发现调用了add_filter函数: add_action登记的事件就保存在$wp_filter这个三层数组字典中,看一下变量: do_action: 在init函数内部添加断点,继续执行,观察调用堆栈: 依次调用了wp-admin下面的index.php->admin.php->menu.php->includes/menu.php->plugin.php->自定义主题的目标。依次点击堆栈,可以查看详细调用代码。menu.php文件触发了事件,调用了do_action,plugin.php文件包含do_action的定义: 大体浏览一下代码我们知道了do_action根据$tag值“admin_menu”,在字典数组$wp_filter下面找到在add_action时挂到该事件的所有事件处理函数,并依次调用。

Ionic 2之页面堆栈 (实用)

為{幸葍}努か 提交于 2019-12-30 18:10:54
原文出处: https://blog.csdn.net/u010730126/article/details/63254988 (原文排版更好,建议阅读原文) 还记得Ionic 1中的state和router吗?他们两兄弟配合起来完成页面导航的功能,虽然它们使用起来并不算复杂## 标题 ##,概念也很清晰,不过当页面增多、state嵌套等问题出现后复杂度也会增加,当复杂程度到达一定程度时工程必然难以维护和理解。而Ionic 2效仿原生页面堆栈的概念解决了上述问题。 页面与组件 页面是应用的基石,是交互的基本单位,Ionic 2中页面是通过组件构成的,Ionic 2中实现了很多常用组件用于更快地构建应用,如Modal、Popup等。在理解Ionic 2之class及其修饰器@App、@Pipe中我们接触到了修饰器的概念,并且简单介绍了@App和@Pipe的相关使用方式,使用组件也需要先使用修饰器@Component定义,下面是其基本使用方式: import {Component} from '@angular/core'; @Component({ templateUrl: "template.html" }) export class PageName(){ constructor(){ } } 使用@Component首先需要使用import导入

30分钟?不需要,轻松读懂IL

假装没事ソ 提交于 2019-12-30 07:24:55
先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用。到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西。最重要的理由就是一个:当面试官看你简历上写着精通C#时,问你一句: "懂不懂IL?" 怎么回答? "不好意思,那东西没什么卵用,所以我没学。" 还是 "还行,可以探讨一下。" 你觉得哪个回答好呢,答得好才更有底气要到更多的薪资,多个几千块也说不定,而这只不过花上不到半小时学习就可以跟面试官吹上一阵了,很实用,有没有。 为什么取这个标题呢,记得很久之前看过一篇文章,叫"正则表达式30分钟入门教程",学正则最重要的就是记住各个符号的含义。个人觉得相比难以直接看出实际意义的正则符号如"\w","\d","*","?","{}[]"等,IL的指令要容易得多。 很多人见到IL一大堆的指令,和汇编一样,就感觉头大不想学了。其实IL本身逻辑很清楚,主要是把指令的意思搞明白就好办了。记指令只要记住几个规律就好,我把它们分为三类。 第一类 :直观型 这一类的特点是一看名字就知道是干嘛的,不需要多讲,如下: 名称 说明 Add 将两个值相加并将结果推送到计算堆栈上。 Sub 从其他值中减去一个值并将结果推送到计算堆栈上。 Div 将两个值相除并将结果作为浮点( F 类型)或商( int32 类型)推送到计算堆栈上。 Mul

Mono为何能跨平台?聊聊CIL(MSIL)

做~自己de王妃 提交于 2019-12-30 07:24:06
前言: 项目紧赶慢赶总算在年前有了一些成绩,所以沉寂了几周之后,小匹夫也终于有时间写点东西了。以前匹夫写过一篇文章,对CIL做了一个简单地介绍,不过不知道各位看官看的是否过瘾,至少小匹夫觉得很不过瘾。所以决定写几篇关于CIL的文章,即和各位看官一起进行个交流,同时也是匹夫自己总结和巩固一下这些知识点。俗话说的好, “万事开头,Hello World” ,那么作为匹夫总结CIL的第一篇文章,就从 Hello World 开始吧。当然,正式开始写CIL代码之前,我们还有点闲话要说,那就是运行时的选择为何是它? 为何是CIL ?而 CIL为何又是基于堆栈 的?内存或者寄存器难道不是更理想的选择吗? 为何是CIL? 开始正文内容之前,匹夫带领大家先回顾一下《 Mono为何能跨平台?聊聊CIL(MSIL) 》的简要内容:首先,用C#写的代码被C#的编译器编译成CIL(当然除了C#还有很多其他的语言,比如VB等等),之后再有JIT编译器在程序运行时即时编译或者AOT(或者NGEN)进行提前编译将CIL代码编译成对应平台的机器码,最后运行在平台上的便是机器码。小匹夫在那篇文章中提过,首先将各种不同的语言都统一编译成CIL,再由CIL编译成各个平台的机器码是跨平台的基础。那么仔细想想,一定有人会提出这样的疑问,直接从C#编译到机器码,省略掉“多余”的中间语言,是不是也可行呢?这个问题的确值得讨论

【译】并发模型和事件循环

不羁岁月 提交于 2019-12-29 02:40:04
JavaScript有一个基于“事件循环”的并发模型。这种模型完全不同于从其他语言的,如C和java。 运行时的概念 下面的章节解释一个理论模型。现代JavaScript引擎实现和优化所描述的语义。 直观表示 栈 函数调用形成一个堆栈的帧。 当调用bar函数时,第一个帧被创建,它包含了bar的参数和局部变量。当bar调用foo时,第二个帧被创建并被推到第一个帧上,该第一个帧包含foo的参数和局部变量。返回时,顶部帧元素从堆栈中弹出(只留下bar的调用帧)。当bar返回时,堆栈为空。 1 function foo(b) { 2 var a = 10; 3 return a + b + 11; 4 } 5 6 function bar(x) { 7 var y = 3; 8 return foo(x * y); 9 } 10 11 console.log(bar(7)); 堆 对象在堆中分配,该堆只是一个名称,用来表示内存的一个很大的非结构化区域。 队列 JavaScript运行时包含消息队列,它是要处理的消息的列表。消息队列是一个与每个消息关联的函数。当堆栈有足够的容量时,将从队列中取出消息并进行处理。处理包括调用关联函数(从而创建初始堆栈帧)。当堆栈再次变空时,消息处理结束。 事件循环 事件循环这个名字的由来,因为它通常是如何实现的,它通常类似于: while (queue

运行库中的泛型

≯℡__Kan透↙ 提交于 2019-12-29 02:36:09
将泛型类型或方法编译为 Microsoft 中间语言 (MSIL) 时,它包含将其标识为具有类型参数的元数据。泛型类型的 MSIL 的使用因所提供的类型参数是值类型还是引用类型而不同。 第一次用值类型作为参数来构造泛型类型时,运行库会创建专用泛型类型,将提供的参数代入到 MSIL 中的适当位置。对于每个用作参数的唯一值类型,都会创建一次专用泛型类型。 例如,假设您的程序代码声明了一个由整数构造的堆栈,如下所示: Stack < int > stack; 在此位置,运行库生成 Stack <T> 类的专用版本,并相应地用整数替换其参数。现在,只要程序代码使用整数堆栈,运行库就会重用生成的专用 Stack<T> 类。在下面的示例中,创建了整数堆栈的两个实例,它们共享 Stack<int> 代码的单个实例: Stack < int > stackOne = new Stack < int > (); Stack < int > stackTwo = new Stack < int > (); 但是,如果在程序代码中的其他位置创建了另一个 Stack<T> 类,这次使用不同的值类型(如 long 或用户定义的结构)作为其参数,则运行库会生成泛型类型的另一版本(这次将在 MSIL 中的适当位置代入 long )。由于每个专用泛型类本身就包含值类型,因此不再需要转换。 对于引用类型

进程内核栈、用户栈

扶醉桌前 提交于 2019-12-27 10:18:34
Linux 进程栈和线程栈的区别 http://www.cnblogs.com/luosongchao/p/3680312.html 总结: 线程栈的空间开辟在所属进程的堆区,线程与其所属的进程共享进程的用户空间,所以线程栈之间可以互访。线程栈的起始地址和大小存放在pthread_attr_t 中,栈的大小并不是用来判断栈是否越界,而是用来初始化避免栈溢出的缓冲区的大小(或者说安全间隙的大小) 进程内核栈、用户栈 1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存 在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内 容是内核栈空间地址,使用内核栈。 2.进程用户栈和内核栈的切换 当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈。 进程陷入内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内 核态恢复到用户态之行时,在内核态之行的最后将保存在内核栈里面的用户栈的地址恢复到堆栈指针寄存器即可。这样就实现了内核栈和用户栈的互转。 那么

Go 开发关键技术指南 | Go 面向失败编程 (内含超全知识大图)

*爱你&永不变心* 提交于 2019-12-26 15:45:06
作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读 :从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出 《Go 开发的关键技术指南》 ,共有 4 篇文章,本文为第 2 篇。 Could Not Recover 在 C/C++ 中, 最苦恼的 莫过于上线后发现有野指针或内存越界,导致不可能崩溃的地方崩溃; 最无语的 是因为很早写的日志打印,比如 %s 把整数当字符串,突然某天执行到了崩溃; 最无奈的 是无论因为什么崩溃都导致服务的所有用户受到影响。 如果能有一种方案,将指针和内存都管理起来,避免用户错误访问和释放,这样虽然浪费了一部分的 CPU,但是可以在快速变化的业务中避免这些头疼的问题。在现代的高级语言中,比如 Java、Python 和 JS 的异常,以及 Go 的 panic-recover 都是这种机制。 毕竟,用一些 CPU 换得快速迭代中的不 Crash,怎么算都是划得来的。 哪些可以 Recover Go 有 Defer, Panic, and Recover 。其中 defer 一般用在资源释放或者捕获 panic。而 panic 是中止正常的执行流程,执行所有的 defer

JavaScript 究竟是怎样执行的?

假装没事ソ 提交于 2019-12-25 22:23:54
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 摘要: 理解 JS 引擎运行原理。 作者:前端小智 原文: 搞懂 JavaScript 引擎运行原理 Fundebug 经授权转载,版权归原作者所有。 一些名词 JS 引擎 — 一个读取代码并运行的引擎,没有单一的“JS 引擎”;每个浏览器都有自己的引擎,如谷歌有 V。 作用域 — 可以从中访问变量的“区域”。 词法作用域 — 在词法阶段的作用域,换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变。 块作用域 — 由花括号{}创建的范围 作用域链 — 函数可以上升到它的外部环境(词法上)来搜索一个变量,它可以一直向上查找,直到它到达全局作用域。 同步 — 一次执行一件事, “同步”引擎一次只执行一行,JavaScript 是同步的。 异步 — 同时做多个事,JS 通过 浏览器 API 模拟异步行为 事件循环(Event Loop) - 浏览器 API 完成函数调用的过程,将回调函数推送到回调队列(callback queue),然后当堆栈为空时,它将回调函数推送到调用堆栈。 堆栈 —一种数据结构,只能将元素推入并弹出顶部元素。 想想堆叠一个字形的塔楼; 你不能删除中间块,后进先出。 堆 — 变量存储在内存中。 调用堆栈 — 函数调用的队列