(一)jvm内存管理(其实就是内存的虚拟化)

306 阅读3分钟

一、java程序的运行过程

1.一个java程序通过javac编译成.class文件。

2.jvm会把.class文件加载到方法区。

3.执行引擎会执行这些字节码。(翻译成操作系统相关的函数)

image.png

二、JVM\JDK\JRE之间的关系。

JVM:把.class字节码翻译成机器识别的代码,jvm不能生成代码,所以需要JRE提供各种类库。 JRE:JAVA运行时环境(Java Runtime Environment),包括jvm + 基础类库(读写操作、网络连接、I/O操作) JDK:包括JAVM和jre。同时还有很多的其它工具。编译代码的javac,反编译代码的javap打包等工具。

三、jvm是一种规范

image.png

1.jvm的跨平台性

   jvm跨平台性:在不同操作系统下使用的是不同平台的JVM,而不是说在不同平台用同一个jvm
   

2.jvm语言无关性。

   JVM可以说是跨语言的平台,不同的语言只要编译成字节码,是基于字节码规范的,那么就可以在jvm上执行。

四、运行时数据区

定义:java虚拟机在执行java程序的时候会把它所管理的内存,划分成若干的不同区域。(也叫规范化) 划分的方式按照线程的私有和共享进行划分。

image.png

  1. jdk1.7及以前叫永久代。之后的叫原空间。
  2. 永久代和原空间是方法区的一种实现。
  3. 线程共享的是:方法区和堆。
  4. 线程私有的是:虚拟机栈、本地方法栈、程序计数器
  5. 直接内存都是通过unsafe类去申请的,它已经跨越了虚拟机的规范。

五、虚拟机栈

1.程序每调用一个方法都会进行压栈操作,虚拟机栈里存储的都是每个方法的栈帧数据。当方法执行完后会出栈。

2.栈的大小默认值取决于平台。

1)64位的操作系统栈的默认大小往往是1024KB
2)通过-Xss 可以设置栈的大小。后面直接加大小(不需要空格,单位是小写,没加单位默认是比特)

3.虚拟机栈的组成

image.png

1) 程序计数器:指向当前程序正在执行的字节码指令的地址。不会记录本地方法栈里的地址。

2)虚拟机栈:局部变量表、操作数栈、动态链接、返回地址等。

4.部分字节码指令

1)iconset_1:这种方法能获取到的值是-1,0,1,2,3,4,5.其它的值只能用push的指令获取。(把对应的数据压入操作数栈)

六、JVM

1.adb命令查看程序的设置。

1)jps:查找当前运行应用的ID号。
2)jinfo -flags id .查看id应用对应的默认设置。command line:自己设置的内容。

2.实例代码的运行,JVM内存处理的流程。

1)JVM 向操作系统申请内存:
2)JVM 获得内存空间后,会根据配置参数分配堆、栈以及方法区的内存大小
3)类加载
4)执行方法及创建对象

3.HSDB的使用