系统初始化

JVM类加载机制

我们两清 提交于 2019-12-27 11:08:12
1 什么是类的加载   类的加载是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的 方法区 内(将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构),然后再 堆 区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口。 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。 加载.class文件的方式 – 从本地系统中直接加载 – 通过网络下载.class文件 – 从zip,jar等归档文件中加载.class文件 – 从专有数据库中提取.class文件 – 将Java源文件动态编译为.class文件 2 类的生命周期 生命周期 : 装载 - 链接 - 初始化 - 使用 - 卸载 其中类加载的过程包括了 装载、验证、准备、解析、初始化 五个阶段。在这五个阶段中,装载、验证、准备和初始化这四个阶段发生的顺序是确定的, 而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定

深入理解C语言内存管理

北慕城南 提交于 2019-12-27 02:10:21
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。 问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int var1 = 1; 4 5 int main(void) { 6 int var2 = 2; 7 printf("hello, world!\n"); 8 exit(0); 9 } 经过gcc hello.c进行编译之后得到了名为a.out的可执行文件 [tuhooo@localhost leet_code]$ ls -al a.out -rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out ls命令是查看文件的元数据信息 [tuhooo@localhost leet_code]$ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),

【linux】嵌入式 Linux 启动时间优化

久未见 提交于 2019-12-24 12:56:50
1 简介 本章包含的话题有启动时间的测量、分析、人因工程(human factors)、初始化技术和优化技巧等。 产品花在启动方面的时间直接影响终端用户对该产品的第一印象。 一个消费电子设备不管如何引人注目或者设计得怎么好,设备从关机状态到可交互的使用状态所需的时间对于获得正面的用户体验尤为关键。案例 #1 就是在关机状态从头启动一个设备的例子。 启动一个设备涉及到许多步骤和一系列的事件。为了使用前后一致的术语,消费电子 Linux 论坛(CE Linux Forum)的启动时间优化工作组起草了一个术语词汇表,该表包括了相关术语在该领域内通用的定义。该词汇表如下: 启动时间相关的词汇表 2 技术/项目主页 下面主要介绍与减少 Linux 启动时间有关的各种技术。 有一部分描述了 eLinux.org 上可以下载的本地补丁,而其余部分则介绍了在其他地方维护的项目或者补丁。 2.1 测量启动时间 Printk Times – 用于显示每个 printk 的执行时间 内核函数跟踪(Ftrace) – 用于报告内核中每个函数的调用时间 Linux 跟踪工具箱(LTT) – 用于报告确切的内核和进程事件的时间数据 Oprofile(译注:最新替代品是 perf) – 通用的 Linux 分析器(Profile) Bootchart – 用于 Linux 启动过程的性能分析和数据展示

路由器开发

最后都变了- 提交于 2019-12-18 01:28:01
宽 带上网已经不是什么新鲜事情,人们对相关的网络器件已经不再陌生,比如说常见的路由器。对于一般的网络用户,他们能知道怎样使用路由器来上网、玩游戏等就 已经感到很满足了,通常情况下对路由器的深层技术很少去过问研究,但做为兴趣广泛的技术爱好者,对这方面的知识是非常感兴趣的。但限于各种条件的制约,这 些爱好者都非开发者,很大程度上无法深入了解真正的技术实现过程以及相关的核心内幕。正是基于此点,笔者凭借自身的知识沉淀,尽最大努力为爱好技术的读者 架设一坐能通向深层核心的桥梁,为大家揭开路由器的神秘面纱,剖开其核心内脏。为使读者能清晰明白的理解掌握,笔者尽量将专业的技术内容转化为容易接受的 知识讲解,其中可能有不足偏颇之处,还请大家多见谅。 概述 什么是路由器? 互联网是依靠路由器连接起来的,路由器是互联网或者说IP网络的核心设备。宽带接入的不断增长,带动了路由器的需求不断增加。 路由器究竟是什么样的技术产物? 谈到路由器的开发,我们就不免要谈到“嵌入式”设备的开发,没错,通俗的说,路由器就是一种嵌入式产品。那么究竟什么是嵌入式设备呢?    其实就目前而言,嵌入式设备已经不断深入我们的日常生活方方面面。通俗的讲,嵌入式设备是指具有计算机功能,但又不称为计算机的设备或器材,它几乎包括 了我们周围的所有电器设备 PDA、手机、机顶盒、汽车、微波炉、电梯、安全系统、自动售货机、医疗仪器、立体音响

程序性能优化之启动速度与执行效率优化(一)上篇

我的未来我决定 提交于 2019-12-06 02:44:00
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将先从以下三个内容来介绍启动速度与执行效率优化: [冷启动和热启动解析] [APP启动黑白屏解决办法] [APP 卡顿问题分析及解决方案] 一、冷启动和热启动解析 1.1 启动方式 通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动。 1、冷启动:当启动应用时。后台没有该应用的进程,这时系统会又一次创建一个新的进程分配给该应用,这个启动方式就是冷启动。 2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用尽管会退出,可是该应用的进程是依旧会保留在后台,可进入任务列表查看)。所以在已有进程的情况下。这样的启动会从已有的进程中来启动应用。这个方式叫热启动。 1.2 特点 1、冷启动:冷启动由于系统会又一次创建一个新的进程分配给它。所以会先创建和初始化Application类,再创建和初始化MainActivity类(包含一系列的測量、布局、绘制),最后显示在界面上。 2、热启动:热启动由于会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包含一系列的測量、布局、绘制)。所以热启动的过程仅仅须要创建和初始化一个MainActivity即可了

android6.0系统Healthd深入分析

女生的网名这么多〃 提交于 2019-12-05 17:36:08
概述 Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework层的BatteryService用以计算电池电量相关状态信息,BatteryServcie通过传递来的数据来计算电池电量显示,剩余电量,电量级别等信息,如果收到过温报警或者严重低电报警等信息,系统会直接关机,保护硬件。 主模块处理流程 Healthd模块代码是在system/core/healthd/,其模块入口在healthd的main函数,函数代码如下: int main(int argc, char **argv) { int ch; int ret; klog_set_level(KLOG_LEVEL); healthd_mode_ops = &android_ops; if (!strcmp(basename(argv[0]), "charger")) { healthd_mode_ops = &charger_ops; } else { while ((ch = getopt(argc, argv, "cr")) != -1) { switch (ch) { case 'c': healthd_mode_ops = &charger_ops; break; case 'r': healthd_mode_ops =

1.4 重置root用户密码

感情迁移 提交于 2019-12-04 08:46:26
图1-45 系统的欢迎界面 1.4 重置root用户密码 平日里让运维人员头疼的事情已经很多了,因此偶尔把Linux系统的密码忘记了并不用慌,只需简单几步就可以完成密码的重置工作。 但是,如果您是第一次阅读本书,或者之前没有Linux系统的使用经验,请一定先跳过本节,等学习完Linux系统的命令后再来学习本节内容。 如果您刚刚接手了一台Linux系统,要先确定是否为RHEL 7系统。如果是,然后再进行下面的操作。 [root@linuxprobe ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.0 (Maipo) 第1步:重启Linux系统主机并出现引导界面时,按下键盘上的e键进入内核编辑界面,如图1-46所示。 图1-46 Linux系统的引导界面 第2步:在linux16参数这行的最后面追加“rd.break”参数,然后按下Ctrl + X组合键来运行修改过的内核程序,如图1-47所示。 图1-47 内核信息的编辑界面 第3步:大约30秒过后,进入到系统的紧急求援模式,如图1-48所示。 图1-48 Linux系统的紧急救援模式 第4步:依次输入以下命令,等待系统重启操作完毕,然后就可以使用新密码linuxprobe来登录Linux系统了。命令行执行效果如图1-49所示。 mount

类的加载过程

旧城冷巷雨未停 提交于 2019-12-03 04:59:21
一,类的加载过程 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行加载。( 要注意的是,对于main函数所在的类,在程序刚开始运行时就会被加载。) 1,加载 在加载之前,JVM要先从磁盘上寻找字节码文件(文件名.class):JVM根据系统环境变量的CLASSPATH里面找字节码文件的搜索路径。 (路径中 . 代表当前工程目录,例如一般自己写的程序编译的字节码文件都在当前工作目录下,但是系统自带的类则在其他路径中,如:System Out 类等。) 加载指的是JVM将类的class文件读入到内存,并为之创建一个java.lang.Class对象,(这个对象里面放的是该对象的属性,方法和访问限定等)也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。类的加载由类加载器完成,类加载器通常由JVM提供,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。 2,链接 当类被加载之后,系统为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中。类连接又可分为如下3个阶段。 1> 验证: 验证的目的在于确保 Class文件的字节流中 包含信息符合当前虚拟机要求,能够在JVM上运行

自学QT之QApplication类和&lt;qapplication.h&gt;头文件

匿名 (未验证) 提交于 2019-12-03 00:03:02
它包含主事件循环,在其中来自窗口系统和其它资源的所有事件被处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。它也处理绝大多数系统范围和应用程序范围的设置。 对于任何一个使用Qt的图形用户界面应用程序,都正好存在一个QApplication对象,而不论这个应用程序在同一时间内是不是有0、1、2或更多个窗口。 QApplication对象是可以通过全局变量qApp访问。它的负责的主要范围有: 应用程序排演实例包含了一个QApplication通常用法的典型完整的main()。 因为QApplication对象做了如此多的初始化,它必须在所有与用户界面相关的其它类被创建之前被创建。 因为它也处理命令行参数,在应用程序中对argv解释和修改之前创建它通常是一个好主意。(注意,也对于X11,setMainWidget()可以根据-geometry选项来改变主窗口部件。为了保持这个功能,你必须在setMainWidget()和它的任何重载之前设置你的默认。) 转载于:https://my.oschina.net/u/2505464/blog/542368 来源:51CTO 作者: chizhou4731 链接:https://blog.csdn.net/chizhou4731/article/details/100732236

Java Web(6)论如何在 Listener获取Spring Bean

你离开我真会死。 提交于 2019-12-02 08:51:33
1. 在Web系统开始运行前,需要在数据库里填充一些预置的数据。这里就需要一个在系统运行时,只运行一次的方法,来实现系统的初始化过程。 在这里,自然而然的想到了ServletContextListener这么一个监听器,在serlvet-api文档是这么描述的 Interface for receiving notification events about ServletContext lifecycle changes. 而刚好,一个web系统,就只有一个servletContext。 2. 然后问题来了,spring的初始化,加载xml配置也是使用这个么一个监听器——org.springframework.web.context.ContextLoaderListener。 那要怎么样才能在自己定义的Listener中通过spring ApplicationContext来获取Bean呢? 3. 答案就是 WebApplicationContextUtils 。这是spring-web里的一个组件,可以使用它来获取ApplicationContext,在得到了ApplicationContext,自然而然就得了Bean 来源: oschina 链接: https://my.oschina.net/u/1582029/blog/530820