JVM知识整理2

Posted jfcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM知识整理2相关的知识,希望对你有一定的参考价值。

JVM基础知识

C++和JAVA对比

需要理解的3个核心问题

1、字节码文件是什么格式和含义?

2、类加载器是怎么加载class文件并转化为对象的?

3、虚拟机内存是怎么管理的?

字节码文件是什么格式和含义?

ByteCode是由单字节指令组成,理论上占有一个byte,就是256个操作码;

指令分为四类

1、栈操作指令、包括与局部变量交互的指令

真实的计算机有基于栈的有基于寄存器的,jvm是基于栈的,需要基于栈的指令

2、程序流程控制指令

Jvm运行方法的时候,需要一些程序流程控制指令

3、对象操作指令,包括方法调用指令

Java面向对象的,需要调用对象的指令

4、算术运算以及类型转换指令

javap -c demo.jvm.0104.HelloByteCode 编译

javap -g demo.jvm.0104.HelloByteCode 增加debug信息

javap -c -verbose demo.jvm.0104.HelloByteCode 查看编译后的jvm信息

字节码解析

字节码的运行时结构

每个线程都有一个独属于自己的线程栈,用于存储栈帧

从助记符到二进制

操作指令 操作数

类型转换

加载指令

算术指令

JVM类加载器

类的生命周期 

1、加载:找class文件

2、验证:验证格式、依赖

3、准备:静态字段、方法表

4、解析:符号解析为引用

5、初始化:构造器、静态变量赋值、静态代码块

6、使用

7、卸载

三类加载器

1、启动类加载器 BootstrapClassLoader

2、扩展类加载器 ExtClassLoader

3、应用类加载器 AppClassLoader

加载器特点:

1、双亲委托

2、负责依赖

3、缓存加载

JVM内存模型

JVM内存堆栈

每个线程都只能访问自己的线程栈,不能访问其他线程的局部变量

所有原生类型的局部变量都存在在线程栈中,因此对其他线程不可见

堆内存中包含了java代码中创建的所有对象;

原生数据类型的局部变量的内容保存在线程栈上

如果是对象引用,则变量槽位保存着对象的引用地址,实际对象内容保存在堆中

堆内存右称为共享“堆”,堆中所有对象可以被所有线程访问,只要他们拿到对象引用地址

JVM 内存整体结构

每启动一个线程JVM就会在栈空间分配对应的线程栈

线程执行过程中,一般会有多个方法组成调用栈,就会创建对应的栈帧

JVM栈内部结构

栈帧是一个逻辑概念,具体大小在一个方法完成后就基本已经确定。

2、类加载器是什么,怎么把class文件加载到内存里,怎么转化为技术对象的?

3、虚拟机内存怎么管理?

什么是JMM

就是java momery model和thread speciation 就是java内存模型和线程规范。

其中定义了通过什么方式在什么时候可以看到其他线程保存的变量的值,这样的好处屏蔽了各平台和操作系统间访问的差异,实现跨平台。

可以理解为在底层系统和编译器提供的内存模型和线程规范下加了一层包装,是上层逻辑更通用,不受底层变化的影响。

JAVA启动参数

java [options] classname [args]

java [options] -jar filename [args]

-开头的参数是所有jvm都需要实现的,并先后兼容

-D 设置系统属性

-X 开头非标准参数

-XX 开头为非稳定参数,主要用控制jvm的行为

-XX: +-Flags形式,+-是对布尔值进行开关

-XX: Key=value指定选项的值

1、系统属性参数

 

2、运行模式参数

-server

-client

-Xint

-Xcomp

-Xmixed

3、 堆内存设置参数

4、GC设置参数

5、分析诊断参数

6、JavaAgent参数

GC的背景与一般原理

为什么有GC?

本质是内存资源的有限性

解决引用计数可能出现的循环依赖问题,可以使用引用跟踪算法

标记清楚算法 Mark and Sweep

除了清楚还要压缩,使用STW, 让全世界停止下来

新对象怎么在Eden区创建,然后进入存活区,最后进入老年代

标记Eden区存活的对象就会复制到存活区

为什么是复制,不是移动?

因为整体删除效率更高。

老年代默认都是存活对象,采用移动方式

1、标记所有通过GC roots可达的对象

2、删除所有不可达对象

3、 整理老年代空间中的内容, 方法是将所有的存活对象复制,从老年代空间开始的地方一次存放

哪些可以作为GC root对象

1、当前正在执行的方法里面的局部变量和输入参数

2、活动线程

3、所有类的静态字段

4、JNI引用

GC算法

1、清除算法Mark-Sweep

主要用在young区

2、复制算法Mark-copy

3、整理算法Mark-sweep-compact

串行GC Serical GC

-XX: UseSerialGC 配置串行GC

并行GC Parallel GC

-XX:+UseParallel GC

-XX:+UsePallaelOldGC

-XX:+UsePallelGC -XX:+UseParallelOldGC

以上是关于JVM知识整理2的主要内容,如果未能解决你的问题,请参考以下文章

JVM超神之路:年后跳槽需要的JVM知识点,周末给你整理了一份!!!

Java基础知识整理

最全Java核心知识点整理,jvm专题

带你整理面试过程中关于 JVM 的运行内存划分垃圾回收算法和 4种引用类型的相关知识点

JVM知识整理1

JVM知识点整理