JVM运行优化学习笔记

一、JVM是什么

  大白话: 
     全称Java Virtual Machine(Java虚拟机), 它是一个虚构出来的计算机, 通过实际的计算机来模拟各种计算机的功能. 
  专业版:
     JVM是一个进程, 用来模拟计算单元, 将.class字节码文件转成计算机能够识别的指令.

二、JVM类加载机制

  1、java虚拟机的运行流程

  2、类加载机制

三、 JVM的内存模型(方法区, 堆区, 栈区, 程序计数器)

    类加载器是用来加载字节码文件的, 那加载完字节码文件之后, 就要运行起来

    1) A.class字节码文件被加载到内存. //存储在方法区中, 并且方法区中也包含常量池.	
	2) 创建本类的实例对象, 存储在堆中(heap)
	3) 通过对象名.的形式调用方法, 方法执行过程是在: 虚拟机栈中完成的. //一个线程对应一个虚拟机栈, 每一个方法对应一个: 虚拟机栈中的栈帧
	4) 程序计数器区域记录的是当前程序的执行位置, 例如: 线程1: print(), 第3行
	5) 将具体要执行的代码交给: 执行引擎来执行.
	6) 执行引擎调用: 本地库接口, 本地方法库来执行具体的内容.	//这部分了解即可, 用native修饰的方法都是本地方法.
	7) 本地方法栈: 顾名思义, 就是本地方法执行的区域.(C语言, 外部库运行的空间)
	8) 直接内存: 大白话翻译, 当JVM内存不够用的时候, 会找操作系统"借点"内存


  四、 线程安全和内存溢出的问题

五、JDK1.7的堆内存的垃圾回收算法

JDK1.7 将堆内存划分为3部分: 年轻代, 年老代, 持久代(就是方法区). 
	年轻代又分为三个区域:	//使用的是 复制算法(需要有足够多的空闲空间).
		Eden: 伊甸园
			//存储的新生对象, 当伊甸园满的时候, 会将存活对象复制到S1区.
			//并移除那些垃圾对象(空指针对象).
		Survivor: 幸存者区1
			//当该区域满的时候, 会将存活对象复制到S2区
			//并移除那些垃圾对象.
		Survivor: 幸存者区2
			//当该区域满的时候, 会将存活对象复制到S1区.
			//并移除那些垃圾对象.
		大白话翻译:
			s1区 和 s2区是来回互相复制的.
	
	年老代:	//使用的是标记清除算法, 标记整理算法.
		//当对象在S1区和S2区之间来回复制15次, 才会被加载到: 年老代.
		//当年轻代和年老代全部装满的时候, 就会报: 堆内存溢出. 
	
	持久代:	//就是方法区
		存储常量, 类的描述信息(也叫: 元数据).

六、JVM宏观整理

七、JDK1.8的内存模型

 

 

 

 

 

 

 

 

 

 

posted @ 2019-10-23 21:46  我の女王  阅读(211)  评论(0编辑  收藏  举报