JVM 学习笔记

一、运行过程:

1:程序启动

2:申请内存,配置堆、栈、方法区大小

3:Java-C把.java文件编译为.class的字节码、

通过classloader将.class文件加载进JVM的运行时数据区所在的方法区

常量、静态变量入方法区

4:虚拟机栈压入方法的栈帧

5:栈帧的方法执行

JVM把字节码通过执行引擎转换为机器码 (解释执行、JIT)

 

二、运行时数据区

1、线程私有:虚拟机栈、本地方法栈、程序计数器

2、线程共享:方法区、堆

 

1、线程私有

Java的解释执行是基于栈的(操作数栈)基于软件、兼容性好、效率偏低

C语言是基于寄存器 基于硬件、移植性差、效率高

 

程序计数器:是JVM中唯一不会OutOfMemory的区域,防止在程序运行过程中被时间片轮转机制切走从而不止从何做起的一个标示位

 

虚拟机栈:存储当前线程运行方法所需的数据,指令、返回地址;

默认大小为1M

栈帧:局部变量表、操作数栈、动态连接、完成出口;

局部变量表:存储局部变量,只能存储基础类型和引用类型;

操作数栈:存放方法的执行、操作;

完成出口:返回地址

 

本地方法栈:保存的是native方法的信息,当JVM创建的线程调用native方法的时候,JVM不会未其在虚拟机中创建栈帧,采用动态连接的方法一直接调用native方法,不会被程序计数器记录

 

2、线程共享

方法区:类信息、常量、静态变量、即时编译期编译后的代码

Java堆:对象实例(对象几乎所有的内容)、数组

 

Java堆的大小参数设置:

-Xmx:堆区内存可被分配的最大上限

-Xms:堆区初始内存分配的大小

 

面试题:为什么要区分两个共享区域

堆:需要频繁的创建和回收

方法区:偏静态

 

方法区不同版本的实现

<=jdk1.7 永久代  受制于堆的大小

>=jdk1.8 元空间  使用机器内存、不受堆的大小限制、可以使用堆外内存

好处:方便拓展

坏处:挤压堆空间

 

3、堆外内存、直接内存

不受制于堆的大小限制、默认大小跟堆的大小一样

 

内存溢出

1、栈溢出—无限递归、线程过多

2、堆溢出

3、方法区溢出

4、本机直接内存溢出

 

编译优化技术:方法内联

栈的优化技术:栈帧之间的数据共享

 

虚拟机中对象的创建过程(new)

1、检查加载

2、分配内存:区域是否规整  是:指针碰撞、否:空闲列表

    2.1、并发安全问题:CAS 失败重试 、TLAB 本地线程分配缓冲

3、内存空间初始化:零值、默认值

4、设置:对象(对象头、实例数据、对齐填充)

5、对象初始化(构造方法)

 

对象的内存布局

1、对象头

  1.1、存储对象自身的运行时数据(Mark Word)

  1.2、类型指针

  1.3、若为对象数组,还应有记录数组长度的数据

2、实例数据

3、对象填充(非必须)

 

判断对象的存活

1、引用计数法

2、可达性分析(根可达)

3、实现finalize()方法可加一条命

 

对象分配的原则

1、对象优先分配在Eden区

2、空间分配担保

3、大对象直接进入老年代

4、长期存活的对象进入老年代

5、动态对象年龄判断

 

GC算法

1、复制算法 

实现简单、运行高效

内存复制、没有内存碎片

利用率只有一半

2、标记清除算法

执行效率不稳定

内存碎片导致提前GC

3、标记整理算法

效率偏低

对象移动

引用更新

用户线程暂停

没有内存碎片

 

 

Dalvik

是基于寄存器的虚拟机,没有操作数栈,但是有很多虚拟寄存器。

寄存器

是CUP的组成部分,寄存器是有限存储容量的高速存储部件,他们可以用来暂存指令、数据和位置。

区别

指令书明显减少,数据移动次数明显减少

 

ART和Dalvik

Dalvik虚拟机执行的是dex字节码,解释执行。从Android2.2之后支持JIT即时编译。

ART虚拟机执行的是本地机器码,Android5.0以上默认运行,自带AOT预编译机制。

Android7.0之后进行混合运用,运行过程中解释执行,对经常执行的方法进行JIT,然后存储在profile配置文件中,当设备闲置是对Profile文件中的代码进行APT编译,下次直接使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值