堆栈

无聊系列 - 教你怎么正确处理异常

自作多情 提交于 2020-04-08 10:51:48
在工作中,常遇见乱处理Exception的情况: 要么吞掉异常,不打印任何日志; 要么记录日志时,日志级别不对、或者把重要的出错堆栈信息干掉,在做生产问题排查时,简直让人抓狂。 我这篇博文,也是对记录的一个开源组件,对异常自行K掉,造成我排查耗费了好久的时间--。 https://www.cnblogs.com/chongsha/p/11931109.html 下面我们用一段代码对 1 进行举例,该代码是网上随便搜的,原作者请勿见怪。 1 /* 2 * 加密 3 * 1.构造密钥生成器 4 * 2.根据ecnodeRules规则初始化密钥生成器 5 * 3.产生密钥 6 * 4.创建和初始化密码器 7 * 5.内容加密 8 * 6.返回字符串 9 */ 10 public static String AESEncode(String encodeRules,String content){ 11 try { 12 //1.构造密钥生成器,指定为AES算法,不区分大小写 13 KeyGenerator keygen=KeyGenerator.getInstance("AES"); 14 //2.根据ecnodeRules规则初始化密钥生成器 15 //生成一个128位的随机源,根据传入的字节数组 16 keygen.init(128, new SecureRandom

深度探索JFR

[亡魂溺海] 提交于 2020-04-07 19:54:35
2. JAVA 应用相关 2.4. Java Monitor 同步锁相关 主要是三种 Event: 当进入同步块,尝试获取锁的时候,产生 JavaMonitorEnter Event;当调用 Object.wait() 进入等待时,会产生 JavaMonitorWait Event;当 锁升级(另一种说法是锁膨胀)时,产生 JavaMonitorWait Event。 下面我从网上看到的这张图,有助于理解这三种事件: JavaMonitorEnter(Java Monitor Blocked):进入 Java Monitor Event。当需要进入同步代码时(字节码 monitorenter),会产生这个 Event。在 default.jfc 中默认为启用的,并且会追踪堆栈,阈值是 20ms;采集的信息包括:开始时间,持续时间,结束时间,线程,Monitor Address,Monitor Class,之前持有这个 Monitor 的线程。 JavaMonitorInflated(Java Monitor Inflated):发生锁升级的时候的 Event。在 default.jfc 中默认为启用的,并且会追踪堆栈,阈值是 20ms;采集的信息包括:开始时间,持续时间,结束时间,线程,Monitor Address,Monitor Class,锁升级原因

同一进程下的线程可以共享

一世执手 提交于 2020-04-07 05:55:12
同一进程下的线程可以共享以下? ( BD ) A . stack B . data section C . register set D . file fd 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括: 1.线程ID 每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标 识线程。 2.寄存器组的值 由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线 程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便 将来该线程在被重新切换到时能得以恢复。 3.线程的堆栈 堆栈是保证线程独立运行所必须的。 线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程 必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影 响。 4.错误返回码 由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用 后设置了errno值,而在该线程还没有处理这个错误,另外一个线程就在此时 被调度器投入运行,这样错误值就有可能被修改。 所以,不同的线程应该拥有自己的错误返回码变量。 5.线程的信号屏蔽码

汇编

青春壹個敷衍的年華 提交于 2020-04-06 22:00:40
一、介绍 汇编语言是一种面向机器的低级程序设计语言 汇编语言以助记符形式表示每一条计算机指令 助记符是便于人们记忆、并能描述指令功能和指令操作数的符号 助记符一般就是表明指令功能的英语单词或其缩写 MOV AX , 30H ADD AX , 50H MOV [2100H] , BX HLT 汇编语言的主要特点: 汇编语言程序与处理器指令系统密切相关 程序员可直接、有效的控制硬件系统 形成的可执行文件运行速度快、占用主存容量少 汇编语言程序中可以出现不同进制的数,但一定要有标识字母加以区别 数据的组织形式:位(bit)、字节(Byte)、字(Word)、双字(Dword) 无论是数据还是指令在计算机中都是以二进制形式存放的 无符号整数——所有有效位都当作数值处理,当然这样的数全部都是正数,故不保留符号位,常用于表示地址,或运算中表示计数值等 ASCII编码——在内存中使用一个字节(8位二进制数)存放一个字符(它的ASCII码),最高位没用(写0).在通信过程中最高位有时用于奇偶校验 数码0~9:30H~39H 大写字母A~Z:41H~5AH 小写字母a~z:61H~7AH 空格:20H 带符号数的表示方法——采用补码表示法(补码存储、补码运算) 与、或、异或、非运算 二、计算机硬件相关知识 1、硬件 中央处理单元CPU 控制器、运算器、寄存器 存储器 主存储器:RAM和ROM

MRAM关键工艺步骤

我与影子孤独终老i 提交于 2020-04-06 17:37:31
非易失性MRAM芯片组件通常在半导体晶圆厂的后端工艺生产,下面英尚微电子介绍关于 MRAM 关键工艺步骤包括哪几个方面. (1)底部电极的形成(参考图1):经由传统图案化与镶嵌工艺形成的底部电极层需要抛光至平坦,并为MTJ堆栈沉积提供超光滑的表面。在这个步骤中,测量和控制底部电极的平滑度对组件性能至关重要,必须控制和监控金属电极的最终高度,同时也必须毫无缺陷。 图1:MRAM底部电极(BE)形成。 (2) MTJ堆栈沉积(参考图2):MRAM是使用单个一体化的机台进行物理气相沉积(PVD),可以精确地沉积20至30个不同的金属和绝缘层,每个金属层和绝缘层的厚度通常在0.2至5.0nm之间。必须精确测量和控制每一层的厚度、均匀性、粗糙度和化学计量。氧化镁(MgO)膜是MTJ的核心,它是在自由层(free layer)和参考层(reference layer)之间形成障壁(barrier)的关键层,需要以0.01nm的精度进行沉积,以重复实现目标电阻面积乘积(RA)和隧道磁阻(TMR)特性。RA和TMR是决定组件性能、良率和可靠性的关键参数,甚至只有几个缺失的原子也会严重影响RA和TMR,这解释了为什么量测在MRAM制造中如此重要。 图2:典型的MRAM堆栈沉积范例。 (3) 磁退火:沉积后的堆栈退火确定了参考层(MgO下方的界面)和MgO穿遂障壁的晶体取向。通常

单片机常用名词解释与常用逻辑电路

↘锁芯ラ 提交于 2020-04-06 16:52:45
MCS-51系列单片机 MCS-51系列单片机分为两大系列,即51子系列与52子系列。 51子系列:基本型,根据片内ROM的配置,对应的芯片为8031、8051、8751、8951 52子系列:增强型,根据片内ROM的配置,对应的芯片为8032、8052、8752、8952 这两大系列单片机的主要硬件特性如下表: 从上表中可以看到,8031、8031、8032、80C32片内是没有ROM的,对应着上表看,我们可以发现,51系列的单片机的RAM大小为128B,52系列的RAM大小为256B,51系列的计数器为两个16位的,52系列的计数器为三个16位计数器。51系列的中断源为5个,52系列的中断源为6个。 8051与80C51的区别: 80C51单片机是在8051的基础上发展起来的,也就是说在单片机的发展过程中是先有8051,然后才有80C51的。 8051单片机与80C51单片机从外形看是完全一样的,其指令系统、引脚信号、总线等完全一致(完全兼容),也就是说在8051下开发的软件完全可以在80C51上应用,反过来,在89C51下开发的软件也可以在8051上应用。这两种单片机是完全可移植的。 既然这两种单片机外形及内部结构都一样,那它们之间的主要差别在哪里呢? 8051与80C51单片机的主要差别就在于芯片的制造工艺上。80C51的制造工艺是在8051基础上进行了改进。

IAR编译器的常见问题

*爱你&永不变心* 提交于 2020-04-06 07:10:18
最近因为项目需要开始使用IAR for AVR,我用的是5.40版本的,主要是5.40以上才包括了aTtiny87,至于安装文件和和谐文件,大家自己找吧,很好找的。 1.编译报错如图所示: 很显然你没有使能寄存器的位定义。方法如下: Project ——> Option ——> General Options ——> System (如下图所示),勾选 Enable bit definitions in I/O-Include files即可 2.MCU型号选择 如果和我一样都次都是以空工程创建的话,不过忘了第一步先进 Project ——> Option ——> General Options ——> Target 选择所使用的MCU型号,不然编译免不了要报错,如下图所示。 3. 堆栈大小 今天下午编译一个程序,0错误0警告,挺好,可一运行就跑飞,根本不能正常运行。 其实是我没有正常设置堆栈大小导致的这种问题,尤其是在写大工程时,这种错误出现的概率很高。GCC和IAR分配堆栈的方式不同,IAR先分配堆栈空间,相当于定义一个全局数组为堆栈空间,堆栈初始为堆栈空间最高地址;GCC不用先分配堆栈,自动把RAM剩余空间作为堆栈空间,堆栈初始为RAM最高地址。 先编译看看自己的程序用了多少ram,在看看总共有多少ram。 然后 Project ——> Option ——> Linker —

深度探索JFR

会有一股神秘感。 提交于 2020-04-06 03:45:20
本文基于 OpenJDK 11 并涉及一些之后版本的特性,非 OpenJDK 11 的特性会被特殊标记出来 什么是 JFR? 我们都知道,黑匣子是用于记录飞机飞行和性能参数的仪器。在飞机出问题后,用于定位问题原因。JFR 就是 Java 的黑匣子。 JFR 是 Java Flight Record (Java飞行记录) 的缩写,是 JVM 内置的基于事件的JDK监控记录框架。这个起名就是参考了黑匣子对于飞机的作用,将Java进程比喻成飞机飞行。顾名思义,这个记录主要用于问题定位和持续监控。 如果是利用默认配置启动这个记录,性能非常高效,对于业务影响很小,因为这个框架本来就是用来长期在线上部署的框架。这个记录可以输出成二进制文件,用户可以指定最大记录时间,或者最大记录大小,供用户在需要的时候输出成文件进行事后分析。 JFR 的前身也是 JFR,只不过这个 J 不是 Java 而是 JRockit。在 JRockit 虚拟机时代,就有这样一个工具用来记录 Java 虚拟机运行时各项数据。在 Oracle 收购 Sun 公司之后,Hotspot 虚拟机时代,也一直延续了这个工具: JFR 0.9 版本对应 JDK 7 和JDK 8:JDK 7u40 之后,实现了和 JRockit Flight Recorder 一样的功能,并添加了各项数据配置,用来打开或者关闭一些统计数据功能。而且,在

Java新特性快速笔记

被刻印的时光 ゝ 提交于 2020-04-05 15:42:10
Java 9 是 Java 新的版本发布周期公布之前的最后一个新版本,并且因此,他这个版本特性极多,有着81个 JEP。 发布日期: 2017-9-21 所有的 JEP 链接地址: https://openjdk.java.net/projects/jdk9/ 在这个版本中,最重要的特性就是 Java 模块化 JPMS,也就是 Project Jigsaw ( https://openjdk.java.net/jeps/261) 另外一些值得关注并且实际使用的新特性: VarHandles ( https://openjdk.java.net/jeps/193): 用于替换 sun.misc.Unsafe 类中对于内存的操作 Jshell( https://openjdk.java.net/jeps/222): 类似于 python 脚本语言的 REPL(Read-Eval-Print-Loop) 工具 G1 垃圾收集器从这个版本开始成为默认的垃圾收集器( https://openjdk.java.net/jeps/248) Stack-Walking API ( https://openjdk.java.net/jeps/259):在之前版本中,想获取调用堆栈,一般通过抛出异常来读取异常堆栈从而获取调用堆栈, 或者通过 SecurityManager 来获取。从这个版本开始

PTA-7-22 堆栈模拟队列

若如初见. 提交于 2020-04-03 21:11:42
本题考点:采用堆栈模拟队列 目录 解题思路 情况分析 代码实现 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S) :判断堆栈 S 是否已满,返回1或0; int IsEmpty (Stack S ) :判断堆栈 S 是否为空,返回1或0; void Push(Stack S, ElementType item ) :将元素 item 压入堆栈 S ; ElementType Pop(Stack S ) :删除并返回 S 的栈顶元素。 实现队列的操作,即入队 void AddQ(ElementType item) 和出队 ElementType DeleteQ() 。 输入格式: 输入首先给出两个正整数 N1 和 N2 ,表示堆栈 S1 和 S2 的最大容量。随后给出一系列的队列操作: A item 表示将 item 入列(这里假设 item 为整型数字); D 表示出队操作; T 表示输入结束。 输出格式: 对输入中的每个 D 操作,输出相应出队的数字,或者错误信息 ERROR:Empty 。如果入队操作无法执行,也需要输出 ERROR:Full 。每个输出占1行。 输入样例: 3 2 A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D