文档章节

java虚拟机

Scofieldxs
 Scofieldxs
发布于 2015/07/01 19:04
字数 1735
阅读 36
收藏 1

好文章1

###一 Class文件结构 ####1.一次编写,到处运行的基石:

  1. 虚拟机
  2. 字节码存储结构:相比于之前的本地机器码存储

####2.class文件

以字节为基础单位的二进制流

用类似C语音结构体的伪结构体存储,两种数据类型:无符号数,表

无符号数以u1,u2,u4,u8代表1、2、4、8个字节,用于描述数字,索引引用

####3.class文件结构 #####1.魔数(4byte) 头四个字节,用于身份识别,说明自己可以被虚拟机接受

值为0xCAFEBABE #####2.class文件版本号(4byte) 5,6字节次版本号(minor version)

7,8字节主版本号(major version)

#####3.常量池(数量不固定) 开始2字节表示数目,例如0x0013,十进制的19,表示有18个常量(从1计数)

常量池放字面量和符号引用

  1. 字面量:文本字符串,final常量
  2. 符号引用:
    1. 类和接口的全限定名
    2. 字段的名称和描述符
    3. 方法的名称和描述符

每个常量是一个表


###二 类加载

对类型的加载和连接都是在运行期间完成 #####加载顺序 加载-->连接(验证-->准备-->解析)-->初始化-->使用-->卸载

#####加载

作用:把字节码转换成java.lang.Class类对象

  1. 通过类的全限定名获取二进制字节流
  2. 转化为方法区的运行时数据结构
  3. 堆中生成代表类的java.lang.Class对象

#####验证 保证字节流中的信息符合虚拟机要求

#####准备 创建java类中的静态域,并赋默认值值

public static int value=123

此阶段为value设置为初始值0

#####解析 将常量池中的符号引用替换为直接引用?

#####初始化

将初始默认值替换为程序里的实际值

####类加载器 ####双亲委派模型 三种类加载器:

  1. 启动类加载器:负责将JAVA_HOME\lib目录中的类库加载到内存中

  2. 扩展类加载器:负责将JAVA_HOME\lib\ext目录中类库加载到内存

  3. 应用程序类加载器:加载用户类路径(ClassPath)上的类库

  4. 自定义类加载器

双亲委派模型:

自定义类加载器-->应用程序类加载器-->扩展类加载器-->启动类加载器

除了启动类加载器,其余都有一个父类

工作过程:如果一个类加载器收到类加载请求,它首先会把这个请求委托给父类去执行,当父类反馈无法完成加载时自己再加载

对保证java稳定性非常重要


###三执行引擎 ####运行时内存区域 #####1.程序计数器

作用: 指示当前字节码执行到第几行了

是线程私有的,每个线程有一个独立的计数器

#####2.虚拟机栈

线程私有

以帧为单位保存线程的运行状态

方法执行过程对应栈帧入栈出栈

#####3.本地方法栈 作用跟虚拟机栈相似 专为native方法服务

####4.java堆 被所有线程共享

用于存放对象实例

#####5.方法区 被所有线程共享

存储类信息、常量、静态变量

#####6.直接内存

####访问对象过程

	Object obj=new Object();
  • Object obj --> 栈中本地变量表
  • new Object() --> java堆中
  • 对象类型数据(对象类型、父类、实现的接口、方法等) --> 方法区中

###四垃圾回收&内存分配

#####如何判断对象是否死去

  1. 引用计数算法:

    一个对象一个计数器,有一个地方引用它则加一,引用失效则减一;

    当计数器为0则对象不再被使用

    缺点:无法解决循环引用问题

  2. 根搜索算法 通过“GC root”的对象作为起点,向下搜索,有引用的则有路径。

    如果一个对象到根没有路径,则可回收

#####垃圾收集算法 分代收集算法:根据对象的存活周期分为新生代和老年代

  • 新生代大量死去,少量存活,因此使用复制算法

  • 老年代存活率高,使用“标记-整理”算法、

  • 新生代GC:Minor GC:新生代垃圾回收,比较频繁

  • 老年代GC:Full GC/Major GC,频率比新生代GC低10倍

  • 新生代有分为Eden,survivor0,survivor1

  • survivor0,survivor1分别做from和to

  • 当from和eden满了之后发生一次minor gc,此时留下的数据都存入to中,from和eden变空

    详细图解

#####对象年龄计数器

  • 新生代中对象没熬过一次Minor GC,年龄加一
  • 当年龄到阈值(默认15)进入老年代

###五 检测工具 #####1.jps -l

能显示所有的虚拟机进程,包括id和名字

#####2.jstat -gcutil 5432(进程号)

显示每个区域的内存占用百分比

#####3.图形化显示 jconsole

###六 java内存模型

主 <-->工作内存<-->java线程

内 <-->工作内存<-->java线程

存 <-->工作内存<-->java线程

线程间变量值的传递需要通过主内存

每个线程读写自己工作内存中的数据

#####java线程模型 线程调度是抢占式调度

可以通过设置线程优先级来影响线程执行时间,10个优先级

但不能依赖优先级,因为操作系统优先级是啥情况不知道啊

  • 5种进程状态

    1. 新建
    2. 运行(runnable)
    3. 无限期等待(waiting)
    4. 限期等待(timed waiting)
    5. 阻塞(blocked):在等待排它锁
    6. 结束
  • 关系:

    • start-->running
    • running<--synchronized-->block
    • running<--sleep-->timed waiting
    • running<--wait,notify-->waiting
    • running-->terminated

####线程安全 五个线程安全程度:

  1. 不可变:final关键字
  2. 绝对线程安全:不需要额外的同步措施
  3. 相对线程安全:通常意义上的线程安全:Vector,hashtable
  4. 线程兼容:本身不安全,可以通过调用手段让它变安全
  5. 线程对立

#####实现方法

  • 互斥同步(阻塞同步):最常用

synchronized:

	1. 会在同步块前后加monitorenter,monitorexit两个字节码指令,
	1. 执行monitorenter时会尝试获得对象锁,锁+1;否则阻塞等待
	2. 执行monitorexit时锁-1
	3. synchronized是重量级操作:因为java线程是映射到操作系统原生线程上的,阻塞或唤醒一条线程需要从用户态转换到核心态,耗费处理器
  • 非阻塞同步:冲突检测

####java引用 四种引用:

  • 强引用:最普遍,垃圾回收器宁愿抛outofmemory异常也不会回收
  • 软引用(softReference):内存不足会回收,适合实现内存敏感的高速缓存
  • 弱引用(weakReference):被垃圾回收期扫描发现失去强引用就回收
  • 虚引用:跟没有引用一样,任何时候都可能被回收。用来跟踪对象被垃圾回收器回收的活动

© 著作权归作者所有

Scofieldxs
粉丝 4
博文 24
码字总数 26524
作品 0
海淀
私信 提问
JVM学习心得体会 (第一天)

Java虚拟机 Java虚拟机(Java Virtual Machine) 简称JVM Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还...

seng
2013/06/25
0
3
云计算高级培训,Tomcat运维JVM 虚拟机常识

云计算高级培训,Tomcat运维JVM 虚拟机常识,作为了解JVM 虚拟机的开始。我们很有必要弄明白以下问题。 所谓虚拟机,就是一台虚拟的计算机。他是一款软件,用来执行一系列虚拟计算机指令。大...

长沙千锋
2018/05/17
0
0
java.lang.management

java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。它同时允许从本地和远程对正在运行的 Java 虚拟机进行监视和管理。 主要接口: Clas...

snail-
2015/08/17
0
0
android -------- java虚拟机和Dalvik虚拟机

java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚...

切切歆语
2018/04/29
0
0
JVM规范系列第6章:Java虚拟机指令集

一条 Java 虚拟机指令由一个特定操作的操作码和零至多个操作所使用到的操作数所构成。 虚拟机指令 = 操作码 + 操作数。 其中,操作码值分别为 254(0xfe)和 255(0xff),助记符分别为 impd...

陈树义
2018/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
27分钟前
2
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
4
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
8
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
4
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部