JVM简介

JVM组成结构谈谈

JVM简介

 

JVM是运行在操作系统之上的,它与硬件没有直接的交互,一下是JVM结构体系

JVM简介

1 Class Loader类加载器

2 Runtime data area 运行数据区

3 Execution Engine执行引擎负责解释命令,提交操作系统执行。

4 Native Interface 本地接口

 

Class Loader类加载器

将硬盘里的.class文件加载到JVM中

Runtime data area 运行数据区

一、Stack

    栈也叫栈内存,是 Java程序的运行区,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题和内存溢出,只要线程一结束该栈就Over。一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配

二、Heap

    一个 JVM 实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,以方便执行器执行,堆内存分为三部分:

堆内存示意图:

JVM简介JVM简介

1、新生区: 新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。

   1)伊甸园区(Eden space)

     一般刚new 出来的对象,被放在伊甸园区;大对象放在养老区如 new byte[1024*1024*100] 100兆的对象

   2)幸存0区(Survivor 0 space)/(From)

       当new对象,伊甸园区空间用完时,程序又要创建对象,jvm的垃圾回收机制将对伊甸园区进行垃圾回收,将伊甸园区中不再被引用的对象 进行销毁,然后将伊甸园区中剩余的依然被引用的对象移动到幸存0区,若幸存0区也满了,jvm对该区进行垃圾回收,将剩余的仍在被引用的对象移动到幸存1区,1区也满了移动到养老区

   3)幸存1区(Survivor 1 space )/(To)      

yong区内存比例为:Eden : From : To = 8 : 1 : 1 

2、养老区

     养老区用于保存从新生区筛选出来的 JAVA 对象,一般池对象都在这个区域活跃(线程池,数据库连接池等)

3、永久存储区

      永久存储区是一个常驻内存区域,用于存放JDK自身所携带的 Class,Interface 的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭 JVM 才会释放此区域所占用的内存。默认64M大小

三、Method Area 方法区

    方法区是被所有线程共享,该区域保存所有字段和方法字节码,静态变量、常量类信息(但是实力变量存放在堆内存中,和方法区无关),以及一些特殊方法如构造函数,接口代码也在此定义。

四、PC Register 程序计数器

    每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令

五、Native Method stack(Native interface) 本地方法栈(调用本地接口)

    它的具体做法是 Native Method Stack中登记native方法,在Execution Engine 执行时加载native libraies。

 

JVM的垃圾回收 ( GC )

频繁收集Young区、较少收集Old区、基本不动Perm

java -Xmx2048m -version 可以验证jvm最多可以分配的内存大小,直到报错为止 

    32位最大撑到4G  64位没有内存限制

JVM调优与上线排查(jdk安装目录下bin目录下的命令)

1.  jps:虚拟机进程状况工具

2.  jstat:虚拟机统计信息监视工具

3.  jinfo:java配置信息工具

4.  jhat:虚拟机堆转储快照分析工具

5.  jmap:内存映像工具

6.  jstack:java堆栈跟踪工具

7.  VisualVM:多合一故障处理工具

8.  jconsole:在开始运行处直接输入此命令即可(其他命令要在黑窗口下进行)

9. Memory Analyzer Tool(MAT)Eclipse插件