framework层、ROM定制、Ubuntu、Linux之类的问题

1,java虚拟机的特性

答:

  • 特点 
    java语言的重要特点是与平台无关性,java虚拟机是实现这一特点的关键。

  • 【对比高级语言】 
    一般高级语言要想在不同平台运行,至少需要生成不同目标代码。而java虚拟机屏蔽了与具体系统平台信息,只要编译生成在java虚拟机运行的字节码,就可以在多种平台运行,不需要重复编译。

  • 【解释字节码】 
    java虚拟机在执行字节码时,把字节码解释成具体平台的机器指令执行。

2,谈谈对jvm的理解

答:

这里和大家简单分享一下JAVA和JVM运行的原理,Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器

JAVA和JVM运行的原理

1.Java语言运行的过程

Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行。

Java语言运行的过程

也相当与

Java语言运行的过程

注:JVM(java虚拟机)包括解释器,不同的JDK虚拟机是相同的,解释器不同。

2.JVM:

JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。

java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。

JVM执行程序的过程 :

I.加载。class文件

II.管理并分配内存

III.执行垃圾收集

JRE(java运行时环境)由JVM构造的java程序的运行环境 

JVM执行程序的过程

3,JVM内存区域,开线程影响哪块内存

4,对Dalvik、ART虚拟机有什么了解?

5,Art和Dalvik对比

6,虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派)

7,谈谈对双亲委派模型理解

8,JVM内存模型,内存区域

9,类加载机制

10,谈谈对ClassLoader(类加载器)的理解

答:ClassLoader顾名思义就是用来加载Class文件到JVM,以供程序使用的,java程序可以动态加载类定义,而这个动态加载的机制就是通过ClassLoader来实现的

ClassLoader的类型有很多,但是最重要的是Bootstrap Classloader,这个是启动类加载器,这个ClassLoaderJVM运行时候加载java核心的API以满足java程序的基本需求,这就包括了其他的ClassLoader,其中包括用户自定义的ClassLoaderExtClassLoader,还有一个是AppClassLoader

其实,也就是说当运行一个程序的时候,JVM启动,运行bootstrap classloader,该ClassLoader加载java核心APIExtClassLoaderAppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。 

在定义一个ClassLoader的时候都必须继承ClassLoader这个抽象类,而每个ClassLoader都会有一个parent ClassLoader,我们可以看一下ClassLoader这个抽象类中有一个getParent()方法,这个方法用来返回当前ClassLoaderparent,注意,这个parent不是指的被继承的类,而是在实例化该ClassLoader时指定的一个ClassLoader,如果这个parentnull,那么就默认该ClassLoaderparentBootstrap Classloader。 

如果自定义了一个UserClassLoader,使用这个自定义的ClassLoader加载java.lang.String,那么这里String是否会被这个ClassLoader加载呢?事实上java.lang.String这个类并不是被这个UserClassLoader加载,而是由Bootstrap Classloader进行加载,这就是双亲委托模式机制,也就是在任何一个自定义ClassLoader加载一个类之前,它都会先委托它的父亲ClassLoader进行加载,只有当父亲ClassLoader无法加载成功后,才会由自己加载

在ClassLoader中的一段源代码中有描述: 

Java代码  

[javascript] view plain copy

  1. protected synchronized Class loadClass(String name, boolean resolve)    
  2. throws ClassNotFoundException    
  3.    {    
  4. // 首先检查该name指定的class是否有被加载    
  5.  Class c = findLoadedClass(name);    
  6.  if (c == null) {    
  7.      try {    
  8.     if (parent != null) {    
  9.         //如果parent不为null,则调用parent的loadClass进行加载    
  10.   = parent.loadClass(name, false);    
  11.     } else {    
  12.         //parent为null,则调用BootstrapClassLoader进行加载    
  13.         c = findBootstrapClass0(name);    
  14.     }    
  15.     } catch (ClassNotFoundException e) {    
  16.         //如果仍然无法加载成功,则调用自身的findClass进行加载                
  17.         c = findClass(name);    
  18.     }    
  19. }    
  20. if (resolve) {    
  21.     resolveClass(c);    
  22. }    
  23. return c;    
  24.    }    

这种双亲委托模式可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。还有一个原因就是如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患。当ClassLoader加载class的时候会经过三步装载、连接、初始化。

其中装载就是找到相应的class文件,读入JVM;连接分三步,第一步是验证class是否符合规格,第二步是准备,就是为类变量分配内存同时设置默认初始值,第三步就是解释。初始化就是将类实例化成对象,以待其他应用程序使用。

其实ClassLoader就这样简单,知道了这些原理和理论,如果项目或者产品中遇到使用ClassLoader的情况就应该会非常轻松。 

11,谈谈对动态加载(OSGl)的理解

12,内存对象的循环引用及避免

13,内存回收机制、GC回收策略、GC原理时机以及GC对象

14,垃圾回收机制与调用System.gc()区别

15,Ubuntu编译安卓系统

16,系统启动流程是什么?(提示:Zygote进程->SystemServer进程->各种系统服务->应用进程)

17,大体说清一个应用程序安装到手机上时发生了什么

18,简述Activity启动全部过程

答:七大生命周期讲解

19,App启动流程,从点击桌面开始

20,逻辑地址与物理地址,为什么使用逻辑地址?

21,Android为每个应用程序分配的内存大小是多少?

22,Android 中进程内存的分配,能不能自己分配定额内存?

23,进程保活的方式

24,如何保证一个后台服务不被杀死?(相同问题:如何保证service在后台不被kill?)比较省电的方式是什么?

25,App中唤醒其他进程的实现方式

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I. 简介 1. 简介 如何构建一个 LFS 系统? 与上一版本有何不同? 更新日志 资源 帮助 II. 构建前的准备工作 2. 准备一个新分区 简介 创建一个新分区 在新分区上创建文件系统 挂载新分区 3. 软件包和补丁 简介 全部软件包 需要的补丁 4. 最后的准备工作 关于环境变量 $LFS 创建 $LFS/tools 目录 添加 LFS 用户 设置工作环境 关于 SBU 关于软件包测试套件 5. 构建临时编译环境 简介 工具链技术说明 Binutils-2.16.1 - 第一遍 GCC-4.0.3 - 第一遍 Linux-Libc-Headers-2.6.12.0 Glibc-2.3.6 调整工具链 Tcl-8.4.13 Expect-5.43.0 DejaGNU-1.4.4 GCC-4.0.3 - 第二遍 Binutils-2.16.1 - 第二遍 Ncurses-5.5 Bash-3.1 Bzip2-1.0.3 Coreutils-5.96 Diffutils-2.8.1 Findutils-4.2.27 Gawk-3.1.5 Gettext-0.14.5 Grep-2.5.1a Gzip-1.3.5 M4-1.4.4 Make-3.80 Patch-2.5.4 Perl-5.8.8 Sed-4.1.5 Tar-1.15.1 Texinfo-4.8 Util-linux-2.12r 清理系统 改变所有者 III. 构建 LFS 系统 第六章 安装系统基础软件 简介 挂载虚拟内核文件系统 包管理 进入 Chroot 环境 创建系统目录结构 创建必需的文件与符号连接 Linux-Libc-Headers-2.6.12.0 Man-pages-2.34 Glibc-2.3.6 再次调整工具链 Binutils-2.16.1 GCC-4.0.3 Berkeley DB-4.4.20 Coreutils-5.96 Iana-Etc-2.10 M4-1.4.4 Bison-2.2 Ncurses-5.5 Procps-3.2.6 Sed-4.1.5 Libtool-1.5.22 Perl-5.8.8 Readline-5.1 Zlib-1.2.3 Autoconf-2.59 Automake-1.9.6 Bash-3.1 Bzip2-1.0.3 Diffutils-2.8.1 E2fsprogs-1.39 File-4.17 Findutils-4.2.27 Flex-2.5.33 GRUB-0.97 Gawk-3.1.5 Gettext-0.14.5 Grep-2.5.1a Groff-1.18.1.1 Gzip-1.3.5 Inetutils-1.4.2 IPRoute2-2.6.16-060323 Kbd-1.12 Less-394 Make-3.80 Man-DB-2.4.3 Mktemp-1.5 Module-Init-Tools-3.2.2 Patch-2.5.4 Psmisc-22.2 Shadow-4.0.15 Sysklogd-1.4.1 Sysvinit-2.86 Tar-1.15.1 Texinfo-4.8 Udev-096 Util-linux-2.12r Vim-7.0 关于调试符号 再次清理系统 最终的清理 7. 配置系统启动脚本 简介 LFS-Bootscripts-6.2 启动脚本是如何工作的? LFS 系统的设备和模块处理 配置 setclock 脚本 配置 Linux 控制台 配置 sysklogd 脚本 创建 /etc/inputrc 文件 Bash Shell 启动文件 配置 localnet 脚本 定制 /etc/hosts 文件 为设备创建惯用符号连接 配置网络脚本 8. 使 LFS 系统能够启动 简介 创建 /etc/fstab 文件 Linux-2.6.16.27 使 LFS 系统能够启动 9. 结束 结束 看看你是第几个? 重启系统 现在做什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值