zoukankan      html  css  js  c++  java
  • 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的内存模型

  • 相关阅读:
    bys_tu_2016
    ciscn_2019_es_1
    jarvisoj_level5
    axb_2019_brop64
    [ZJCTF 2019]EasyHeap
    ciscn_2019_es_7
    Exp1 PC平台逆向破解 相关wp
    picoctf_2018_shellcode
    cmcc_simplerop
    axb_2019_fmt32
  • 原文地址:https://www.cnblogs.com/haojia/p/12386207.html
Copyright © 2011-2022 走看看