堆栈

jvm常用排错命令

冷暖自知 提交于 2019-12-06 15:16:17
jvm命令很多,有一篇博客整理的非常全 https://www.cnblogs.com/ityouknow/p/5714703.html 。我只列举一些常用的排错用到的。 jps -l -v 查看系统所有java(虚拟机)进程的信息。所在位置、启动执行的JVM参数。 jstat -gc [hostid] [ms] [count] ( jstat -gcutil [hostid] [ms] [count] ) 查看jvm进程hostid的垃圾回收统计概述 S0C : survivor0区的总容量 S1C : survivor1区的总容量 S0U : survivor0区已使用的容量 S1C : survivor1区已使用的容量 EC : Eden区的总容量 EU : Eden区已使用的容量 OC : Old区的总容量 OU : Old区已使用的容量 PC 当前perm的容量 (KB) PU perm的使用 (KB) YGC : 新生代垃圾回收次数 YGCT : 新生代垃圾回收时间 FGC : 老年代垃圾回收次数 FGCT : 老年代垃圾回收时间 GCT : 垃圾回收总消耗时间 jmap -dump:live,format=b,file=/test/test/test.hprof pid 输出dump文件到/test/test/test jstack [option] pid -F :

VxWorks基本OS介绍

前提是你 提交于 2019-12-06 12:36:41
这里我就偷点懒,直接复制粘贴文档了。可能会有一些图片无法显示 ,可以直接管我索要文档。 每一个被切换的程序实体就是“任务”。每一个任务都有其自己的上下文——所谓上下文就是指任务在每一次被核心调度时所需要的 CPU环境、系统资源。在上下文的切换过程中,每一个任务的上下文被存在该任务的任务控制块中(TCB )。 ◆ 执行的线程,也就是任务程序计数器; ◆ CPU 寄存器的内容和浮点寄存器中的内容; ◆ 动态变量和程序调用所使用的堆栈; ◆ 标准输入输出的I/O 分配和错误; ◆ 延时计时器; ◆ 时间片计时器; ◆ 核心控制结构; ◆ 信号处理句柄; ◆ 调试和性能监视值。 wind核心中使用了基于优先级抢占式的任务调度策略,但是用户也可以选择优先级轮转调度策略。 1.优先级抢占策略 通过使用优先级抢占策略,每一个任务都会拥有一个优先级,这样内核就会确信将 CPU资源分给了优先级最高的就绪任务。这种方法之所以叫做抢占式的,是指任何运行的任务会被一个变成就绪状态而且优先级更高的任务打断,这时系统会保存当前任务的上下文并立即切换到高优先级的任务上下文,并且开始执行这个任务。在图14.2所示的任务优先级抢占图中给出了优先级抢占的例子,例子中任务t1被优先级较高的任务t2抢占,而更高优先级的任务t3则抢占了t2的执行,当t3执行完后,t2开始继续执行,接下来t1在t2

python学习第一阶段总结

允我心安 提交于 2019-12-06 12:11:50
1、字符串切片的索引是可正,可负数 例子: +---+---+---+---+---+---+ | P | y | t | h | o | n | +---+---+---+---+---+---+ 0 1 2 3 4 5 6 -6 -5 -4 -3 -2 -1 有个办法可以很容易地记住切片的工作方式:切片时的索引是在两个字符 之间 。左边第一个字符的索引为 0,而长度为 n 的字符串其最后一个字符的右界索引为 n 。 2、循环 体 是 缩进 的:缩进是 Python 组织语句的方法。Python (还)不提供集成的行编辑功能,所以你要为每一个缩进行输入 TAB 或空格。 实践中建议你找个文本编辑来录入复杂的 Python 程序,大多数文本编辑器提供自动缩进。交互式录入复合语句时,必须在最后输入一个空行来标识结束(因为解释器没办法猜测你输入的哪一行是最后一行),需要 注意的是同一个语句块中的每一行必须缩进同样数量的空白。 3、因为 ** 的优先级高于 - ,所以 -3**2 将解释为 -(3**2) 且结果为 -9 。为了避免这点并得到 9 ,你可以使用 (-3)**2 。 4、与其它语言不同,特殊字符例如 \n 在单引号( '...' )和双引号( "..." )中具有相同的含义。两者唯一的区别是在单引号中,你不需要转义 " (但你必须转义 \' ),反之亦然。 5

gcc/g++堆栈保护技术

自闭症网瘾萝莉.ら 提交于 2019-12-06 11:50:15
  最近学习内存分布,通过gdb调试发现一些问题,栈空间变量地址应该是从高往低分布的,但是调试发现地址虽然是从高往低分布,但是变量地址的顺序是乱的,请教同事他说可能是gcc/g++默认启用了堆栈保护,关于堆栈保护可以查看这篇文章 https://www.ibm.com/developerworks/cn/linux/l-cn-gccstack/ #include <stdio.h> int main() { char a = 'a'; char b = 'b'; int i = 20; return 0; } 默认编译 gcc -g test.c -o test gdb test (gdb) p $rsp $1 = (void *) 0x7fffffffdde0 (gdb) p &a $2 = 0x7fffffffddda "ab\024" (gdb) p &b $3 = 0x7fffffffdddb "b\024" (gdb) p &i $4 = (int *) 0x7fffffffdddc 关闭堆栈保护编译 g++ -g -fno-stack-protector test.c -o test gdb test (gdb) p $rsp $1 = (void *) 0x7fffffffdde0 (gdb) p &a $2 = 0x7fffffffdddf "a FUUUU"

磁盘检查软件Checkpoint v1.1 macOS

拥有回忆 提交于 2019-12-06 11:47:41
你是否需要一款可以检查你的磁盘的工具呢?试试Checkpoint for Mac吧!Checkpoint Mac版是一款运行在MacOS系统上的磁盘检查软件。Checkpoint的运行界面简洁,功能单一。会定期检查你的堆栈备份是否损坏。支持通过网络复制镜像文件,同时使用另一台机器进行验证。 地址: Checkpoint for Mac 验证而不复制。在开始编辑之前,Checkpoint会确保旅行磁盘健康且完整。定期检查您的堆栈备份是否损坏。通过网络复制镜头,同时使用另一台机器进行验证。 Checkpoint for Mac功能特点 增强备份能力 不确定壁橱中的驱动器堆栈中存储了什么?那只是一个昂贵的镇纸。使用Checkpoint索引所有媒体,创建校验和(如果尚不存在),然后解锁存档。 100%完全健康 曾经收到旅行旅行证明不完整吗?不需要这样做:验证驱动器上应该存在的内容是否确实存在-并且状况良好。在编辑过程中,没有更多的惊喜或剪辑丢失。 重新利用现有备份 Checkpoint可以使用最现代的校验和算法来验证现有文件,而无需复制它们。它是定期检查备份堆栈是否处于正常工作状态的理想工具。 创建校验和 安全性有数字,在这种情况下,还包括校验和。能够显示媒体的数字指纹越来越成为专业视频制作中的要求。 解锁旧档案 您的MAM一无所知的那叠DVD或其他旧驱动器

【转】90%的人会遇到性能问题,如何用1行代码快速定位

白昼怎懂夜的黑 提交于 2019-12-06 09:40:28
90%的人会遇到性能问题,如何用1行代码快速定位? 原创: 齐光 阿里技术 阿里妹导读:在 《如何回答性能优化的问题,才能打动阿里面试官? 》 中,主要是介绍了应用常见性能瓶颈点的分布,及如何初判若干指标是否出现了异常。 今天,齐光将会基于之前列举的众多指标,给出一些常见的调优分析思路,即:如何在众多异常性能指标中,找出最核心的那一个,进而定位性能瓶颈点,最后进行性能调优。整篇文章会按照代码、CPU、内存、网络、磁盘等方向进行组织,针对对某一各优化点,会有系统的「套路」总结,便于思路的迁移实践。 1. 代码相关 遇到性能问题,首先应该做的是检查否与业务代码相关——不是通过阅读代码解决问题,而是通过日志或代码,排除掉一些与业务代码相关的低级错误。 性能优化的最佳位置,是应用内部。 譬如,查看业务日志,检查日志内容里是否有大量的报错产生,应用层、框架层的一些性能问题,大多数都能从日志里找到端倪(日志级别设置不合理,导致线上疯狂打日志);再者,检查代码的主要逻辑,如 for 循环的不合理使用、NPE、正则表达式、数学计算等常见的一些问题,都可以通过简单地修改代码修复问题。 别动辄就把性能优化和缓存、异步化、JVM 调优等名词挂钩,复杂问题可能会有简单解,「二八原则」在性能优化的领域里里依然有效 。当然了,了解一些基本的「代码常用踩坑点」,可以加速我们问题分析思路的过程,从 CPU、内存

程序运行时保存到什么地方(JAVA)

ぃ、小莉子 提交于 2019-12-06 07:39:29
程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据: (1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。 (2) 堆栈。驻留于常规 RAM (随机访问存储器)区域,但可通过它的 “ 堆栈指针 ” 获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时, Java 编译器必须准确地知道堆栈内保存的所有数据的 “ 长度 ” 以及 “ 存在时间 ” 。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些 Java 数据要保存在堆栈里 —— 特别是对象句柄,但 Java 对象并不放到其中。 (3) 堆。一种常规用途的内存池(也在 RAM 区域),其中保存了 Java 对象。和堆栈不同, “ 内存堆 ” 或 “ 堆 ” ( Heap )最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用 new 命令编制相关的代码即可

线程有堆么?堆栈和堆和栈什么区别?

好久不见. 提交于 2019-12-06 02:43:56
与线程“绑定”的是栈,用于存储自动变量。每一个线程建立的时候,都会新建一个默认栈与之配合。堆则是通常与进程相关,用于存储全局性的变量,进程建立的时候,会建立默认堆。于是,每一个线程都有自己的栈,然后访问共同的堆。当然,你可以通过OsApi建立其他堆栈。 堆:是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。 栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。操作系统在切换线程的时候会自动的切换栈,就是切换 SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。 来源: https://www.cnblogs.com/xuelixue/p/11958460.html

面试官:CPU百分百!给你一分钟,怎么排查?有几种方法?

浪尽此生 提交于 2019-12-06 02:21:52
Part0 遇到了故障怎么办? 在生产上,我们会遇到各种各样的故障,遇到了故障怎么办? 不要慌,只有冷静才是解决故障的利器。 下面以一个例子为例,在生产中碰到了CPU 100%的问题怎么办? 在生产中真的碰到了CPU 100%的问题,再来看这篇文章已经迟了,还是先来模拟演练下吧。 怎么模拟演练? (1)查找资料,选型排查CPU高负载问题的工具。 (2)安装一个高负载程序或手写个高负载应用部署。 (3)安装、执行分析工具,实战分析,找出故障原因。 (4)思考与总结。 Part1 工具选型 因为现在大部分的企业应用都是java编写的,所以我们本次排查的高负载应用也是针对java的,但是思路其实是相同的,如果也有php、python、go等语言写的程序,无非就是换个工具而已,排查的步骤都是类似的。 而top这个命令一定是Linux上不可动摇的资源监控工具。 以下三类工具从原生的top、jstack到功能强大的Arthas和一键式查找的show-busy-java-threads,它们都各有长处。在合适的环境选择合适的工具才是考验一个IT人员能力的时候。 运用之道,存乎一心。 1.1 原生方法 此方法无需额外安装工具,在没法连接互联网的情况下使用此方法排查效果较好。 top、printf都是Linux原生命令,jstack、jstat是jdk自带命令工具。

go中的关键字-go(下)

妖精的绣舞 提交于 2019-12-05 23:47:30
1. goroutine源码分析 1.1 初始化   go程序的启动流程分为四步 call osinit, 这里就是设置了全局变量ncpu = cpu核心数量 call schedinit make & queue new G (runtime.newproc, go func()也是调用这个函数来创建goroutine) call runtime·mstart   其中,schedinit 就是调度器的初始化,除了schedinit 中对内存分配,垃圾回收等操作,针对调度器的初始化大致就是初始化自身,设置最大的maxmcount, 确定p的数量并初始化这些操作。 schedinit   schedinit这里对当前m进行了初始化,并根据osinit获取到的CPU核数和设置的GOMAXPROCS确定P的数量,并进行初始化。 1 func schedinit() { 2 // 从TLS或者专用寄存器获取当前g的指针类型 3 _g_ := getg() 4 // 设置m最大的数量 5 sched.maxmcount = 10000 6 7 // 初始化栈的复用空间 8 stackinit() 9 // 初始化当前m 10 mcommoninit(_g_.m) 11 12 // osinit的时候会设置 ncpu这个全局变量