虚拟机

http://www.bubuko.com/infodetail-2242063.html

1996 jdk1.0 (classic vm 虚拟机)
1997 jdk1.1
1998 jdk1.2 (javaee,javase区分)
2000 jdk1.3 (hotspot虚拟机发布)
2002 jdk1.4 (解密类库,正则表达式)
2004 jdk1.5 (泛型,注解,装箱,枚举)
2004 jdk1.6 (jdbc4.0,脚本语言支持)
2011 jdk1.7 (新的垃圾回收器G1)
2014 jdk1.8 (Lambda表达式)
2016 jdk1.9 (模块化)

oracle 两个虚拟机 JRockit和HotSpot。jdk8要进行整合成一个。

只要符合jvm语言规范的标准,什么语言都可以在jvm中运行。

jvm保存数据使用的是2进制,2进制是8位,第一位是符合位,1代表负数。

jvm为什么要使用补码? (正负数的补码相同)
正数的原码,反码,补码均相同。
负数的反码在原码的基础上,最高位(符号位)不变,其他位0变1,1变0,补码再在反码的基础上加1
0
正数:0000 0000

负数:1000 0000
反码:1111 1111
补码:0000 0000

-6+5 的运算?
-6的原码:1000 0110
-6的反码:1111 1001 (+1获得补码)
-6的补码:1111 1010

5的原码:0000 0101
5的补码:0000 0101

1111 1010

  • 0000 0101
    = 1111 1111 (符号位参与运算)
    -1
    = 1111 1110(反码)
    = 1000 0001 (原码)

jvm内存空间
堆 :1.对象实例 2.线程共享 3.GC主要工作区 4.数组 5.堆的划分
方法区 :
虚拟机栈 :1.线程私有 2.栈是由栈帧组成,每个帧是一个方法(静态和非静态)。3.局部变量
Native栈 :
计数器 :

对象的栈上分配:1)小对象 2)直接分配在栈上,可以自动回收,减轻gc压力

可见性:一个线程修改了变量,其他线程可以立刻知道
保证可见性的方法:
1)volatile :
2)synchronized
3)final : 被定义成常量的变量

线程的分类
1)守护线程:jvm自己使用的线程,例如:gc线程
2)普通线程:jvm中只要还存在普通线程,jvm就不会停止。

jvm加载并解析一个类后,将类信息保存到方法区,创建的对象保存对堆中。(方法区和堆是内存共享的)。
当一个线程被创建时,会被分配一个程序计数器(pc寄存器)和 虚拟机栈。虚拟机栈保存了该线程调用方法状态,
一个方法一个栈帧,里面保存了方法的局部变量,方法参数,返回值。当方法执行时,该帧进入栈,当执行完成,
帧出栈。计数器保存该线程执行的行号。

堆:
当创建一个类的实例或者数组时,都在堆中为新对象分配内存。jvm中只要一个堆,所有的线程都共享他。

jvm的生命周期:
执行java程序,程序开始执行jvm开始运行,当程序结束时它就停止。
同一台机子上运行三个程序,就会运行三个jvm。java的线程分两种,
守护线程和普通线程。只有当jvm中没有普通线程执行时,jvm就会停止。
守护线程是jvm自己使用的线程,比如GC线程。

1个字节 占8位
int 4个字节 32位

15.为什么要使用16进制?
人写的是10进制,转换为2进制的话,是32位太长了。
使用16进制就短了很多

16.class文件结构
魔数(4字节)+ class文件版本号(4个字节)+常量池 + 访问标志

  • 索引(知道父类是谁)+ 字段表集合(全局和类变量)+ 方法表集合
  • 属性表集合

常量池 = 字面量(字符串和常量) + 符号引用(类信息+方法描述)

17.操作数栈和寄存器的架构区别?

18.类加载时期:
加载 验证 准备 解析 初始化 使用 卸载

19.类进行初始化的时机?
主动引用(会进行初始化)
1)使用new关键字实例化对象
2)读取一个类的静态字段
3)调用一个类的静态方法
4)使用反射调用类
5)子类初始化时,发现父类未初始化,父类进行初始化
6)包含main()方法的主类
被动引用(不会进行初始化)
1)通过子类引用父类的静态字段,不会导致子类初始化
2)通过数组定义来引用类,不会触发此类的初始化 SupperClass[] sc = new SupperClass[10];
3) 使用(public static final String XXX)修饰的常量,不会初始化该类。

20.类的加载的过程,jvm需要做的事?
1)通过类全名获取该类的2进制流
2)将字节流转换为方法区可识别的数据结构
3)在堆中创建该对象,作为方法区这个类的访问入口。

21.类的验证过程?
主要目的就保证class文件符合jvm规范标准
1)文件格式验证(魔数,主次版本号,常量池)
2)元数据验证

  • 该类是否有父类
  • 父类是否继承了不允许继承的类
  • 该类不是抽象类,父类是抽象类,是否都实现了
  • 父类和子类之间的方法命名是否有冲突
    3)字节码验证(保证程序语言 语义合法符合逻辑)
    4)符号引用验证
  • 类全名是否能找到该类
  • 通过字段描述是否找到方法和字段
  • 引用类的访问性能否被当前类访问

22.类的准备过程?
为类变量(static修饰的)分配内存并设初始值(数据类型的初始值0)。
这个阶段内存分配仅包括类变量,不包括实例变量,实例变量将会在对象
实例化时,随着对象一起分配到java堆中。

23.类的初始化?
开始执行类中程序代码

24.类加载器

  • 启动类加载器:将类库加载到虚拟机中
  • 扩展类加载器:负责加载第三方类库
  • 应用程序类加载器:

25.栈帧结构:

  • 栈帧是用于支持虚拟机进行方法调用和执行的数据结构,其中保存了
    局部变量表,操作数栈,动态链接,方法返回地址。
  • 局部变量表:方法参数+局部变量
  • 操作数栈:方法执行时,各种字节码指令会出入
  • 动态链接:链接运行时常量池引用(具体也没明白)
  • 方法返回地址:
  1. 通过javap指令来获取类的字节码

  2. 可以眼看反编译class文件到java文件

  3. mat来检测内存溢出,lint 检测代码规范

  4. 内存溢出:

  • 堆溢出 (原因:对象太多 解决办法:增大堆空间)
  • 永久区溢出 (原因:类的数量太多 解决办法:增大perm区;允许class回收)
  • jvm栈溢出 (原因:创建线程的需要分配的栈空间 > 操作系统分配的空间
    解决办法:减少堆空间;减少线程栈的大小)
  • 直接内存溢出 (原因:操作系统分配空间 < 堆空间+线程栈空间+直接内存
    解决办法:触发GC)
  1. 内存管理,内存优化,oom

  2. 图片缓存的两种方式:软引用,Lru算法

  3. Lint进行代码检测 mat进行内存溢出检测

  4. 内存优化

  • 数据结构优化
    • 频繁使用数据添加使用StringBuilder
    • ArrayMap,SparseArray 代替HashMap
    • 内存抖动(突然申请大量内存,然后又取消)
  • 对象复用
    • 复用系统自带资源
    • ListView 的 ConvertView复用
    • 避免在onDraw方法中执行对象创建
  • 避免内存泄漏
    • 内存泄漏导致可用Heap越来越少,频繁触发GC
    • 尤其Activity的泄漏(内部类引起)
    • 使用Application context而不是Activtiy的
  • oom问题优化
    • 临时Bitmap对象的及时回收
    • 加载Bitmap:缩放比例,解码格式,局部加载
    • 软弱引用的使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容