JVM 概述

JVM 布局

JVM 构成

1,Java 虚拟机栈  

       帧栈 方法执行的内存模型(组成部分)

               ①:操作数栈

               ②:局部变量表

               ③:动态链接表

               ④:方法退出地址

       运行过程:(简单理解,可以通过javap命令 帮字节码反编译为汇编语言,查看帧栈的操作过程)

             ①:每个方法的执行和返回,对应帧栈在JVM虚拟机栈中的入栈和出栈过程   

             ②:方法的执行过程中涉及到数据计算过程  对应操作数栈的入栈和出栈,以及局部变量表的更新

2,Java native方法栈

            上面的Java 虚拟机栈是操作Java 方法的,如果操作的是native 方法,那么对应的内存模型就是 native方法栈,其实执行的过程基本上和java 虚拟机栈大同小异。

3,程序计数器

            JVM 怎么知道每个线程 当前应该执行到那个字节码指令,就是通过程序计算器来操作的。

4,堆

            Java程序员经常接触的区域

          

            Minor GC 流程 :1,new 对象以后会在Eden区域分配一块内存,Minor GC 以后,会将存活的对象copy到to区域 清空Eden和From区域
                                        2,From对象和To对象角色互换 To变成From 

                                        3,再一次Minor GC 以后 Eden和From 区域 存活的对象 copy到 To 区域,清空Eden和From区域 ,From对象和To对象角色互换

            QA: 为啥年轻代 需要有Survivor From和Suvivor To  2个区域,为啥不能合并成一个

            答:如果只有1个,我们来模拟一次Minor GC 过程,首先需要标记Survivor 内存块中和Eden那些数据需要清除(标记-清除),清除过程需要一条一条清除,不能像上面的过程整个删除Survior From 内存块

                GC 效率低下,其次,删除完以后,Survivor 内存空间极其分散,给一个稍微大一点的对象分配内存,都因为有可能木有连续的内存可以分配而进行一次Minor GC 进行内存回收

5,元空间/方法区

           jdk8以前方法区称为永久代,意思就是垃圾回收器永远不会回收这一块(这一块内存主要存储 (class 对象,静态常量池,动态常量池)没啥可回收的,当然实际根据每个虚拟机的不同,会有不同的回收的策略哈,也有不回收的)),jdk8 以后元空间为堆外内存         啦,即在系统内存上直接分配。

   

6,常用工具

       jps 列出JVM 虚拟机Java线程状况工具 ,使用方法 jps

      

       jstack  Java堆栈跟踪工具(线程快照)jstack -l pid >> path

      

       jmap java 内存映射工具(堆内存快照)

       

       jstat 虚拟机统计信息监控工具(GC 统计信息)

       

         

原文地址:https://www.cnblogs.com/huxuhong/p/13387422.html