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 堆(JDK1.7)

    一个 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 对象,一般池对象都在这个区域活跃(线程池,数据库连接池等)

     用于存放经过多次新生代GC仍然存活的对象(默认是15次),例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。2、大的数组对象,且数组中无引用外部对象。老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。 

3、永久存储区

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

JDK1.8 : 1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。

  • 年轻代 : 三分之一的堆空间
    • eden区: 8/10 的年轻代空间
    • survivor0 : 1/10 的年轻代空间
    • survivor1 : 1/10 的年轻代空间
  • 老年代 : 三分之二的堆空间

 1.7之前字符串常量池是放在永久代的,1.7把字符串常量池从永久代中剥离出来,存放在堆空间中。

如果服务器内存足够,升级到 JDK 1.8 修改 JVM 参数最简单的办法就是将 -XX:PermSize 和 -XX:MaxPermSize 参数替换为 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize

    1.8中-XX:PermSize 和 -XX:MaxPermSize 已经失效,取而代之的是一个新的区域 —— Metaspace(元数据区)。

    使用JDK1.8以及之后的版本,不会再碰上“java.lang.OutOfMemoryError: PermGen space”这个错误了

三、Method Area 方法区

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

四、PC Register 程序计数器

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

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

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

 

JVM的垃圾回收 ( GC )

GC(GarbageCollection)是垃圾回收机制,在java中开发人员无法使用指针来自由的管理内存,GC是JVM对内存(实际上就是对象)进行管理的方式。GC使得Java开发人员摆脱了繁琐的内存管理工作,让程序的开发更有效率。

对于程序员来说,分配对象使用new关键字;释放对象时,只要将对象所有引用赋值为null,让程序不能够再访问到这个对象,我们称该对象为"不可达的"或者"不被引用"。GC将负责回收所有"不可达"对象的内存空间。

GC工作原理

       1》新new的对象都放在Eden区

  2》Eden区满或者快满的时候进行一次清理,不被引用的对象直接被干掉;还有引用的对象,但是年龄比较大的,挪到S0区

  3》下次Eden区快满的时候,会进行上一步的操作,并且将Eden和S0区的年纪大的对象放到S1区【原理上随时保持S0和S1有一个是空的,用来存下一次的对象】

  4》下下次,Eden区快满的时候,会进行上一步操作,并且将Eden和S1区的年纪大的对象放到S0区【此时S1区就是空的】

  5》直到Eden区快满,S0或者S1也快满的时候,这时候就把这两个区的年纪大的对象放到Old区

  6》依次循环,直到Old区也快满的时候,Eden区也快满的时候,会对整个这一块内存区域进行一次大清洗,腾出内存,为之后的对象创建,程序运行腾地方。

Minor GC、Major GC和Full GC

  清理Eden区和 Survivor区叫Minor GC

  清理Old区叫Major GC

  清理整个堆空间—包括年轻代和老年代叫Full GC

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.  jVisualVM:多合一故障处理工具

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

9. Memory Analyzer Tool(MAT)Eclipse插件

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值