JVM内存模型简介

一、什么是JVM

     JVM 全称是Java Virtual Machine ,Java 虚拟机。

所有的Java程序都在Java虚拟机中运行,存在于内存中。

二、执行过程

    1、装载 :二进制字节码并加载至JVM中

2、链接:字节码校验,解析接口、类。初始化静态变量赋值。校验属性、方法的存在

3、初始化:静态代码块、构造函数、静态属性

三、JVM内存模型

  寄存器:PC寄存器是用于存储每个线程下一步将执行的JVM指令

  方法区:类信息(名称、修饰符等),类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。方法区域也是全局共享的。

  本地方法堆栈:此区域用于存储每个native方法调用的状态。

  JVM栈:线程私有的,基本类型(int,double)、对象地址(指向堆),每个方法就是一个栈帧。

  一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java的方法:该方法的实现由非Java语言实现,比如C或C++。

四、类加载机制

  双亲委派机制。类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,

如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

五、堆内存分析

  

        JVM将内存划分为

New(年轻代)

Tenured(年老代)

永久代(Perm)

六、垃圾回收机制

  1、引用计数(reference counting)
      原理:此对象有一个引用,则+1;删除一个引用,则-1。只用收集计数为0的对象。
    
  2、复制
      原理:把内存空间划分为2个相等的区域,每次只使用一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外一个区域。
      优点:不会出现碎片问题。
      缺点:1、暂停整个应用。2、需要2倍的内存空间。

  3、标记-清扫
      原理:对于“活”的对象,一定可以追溯到其存活在堆栈、静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。第一阶段:从GC roots开始遍历 所有的引用,对有活的对象进行标记。第二阶段:对堆进行遍历,把未标记的对象进行清除。这个解决了    循环引用的问题。
      缺点:1、暂停整个应用;2、会产生内存碎片。

  4、标记-压缩
      原理:第一阶段标记活的对象,第二阶段把为标记的对象压缩到堆的其中一块,按顺序放。
      优点:1、避免标记扫描的碎片问题;2、避免停止复制的空间问题。
      
  5、分代
      原理:基于对象生命周期分析得出的垃圾回收算法。把对象分为年轻代、年老代、持久代,对不同的生命周期使用不同的算法(2-3方法中的一个即4自适应)进行回收。

(1) minor gc

(2)full  gc

            

1、Full GC将会同时回收年轻代、年老代

2、当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载

  七、内存调优      

  系统崩溃前的一些现象

    1、每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4、5s

    2、FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC

    3、年老代的内存越来越大并且每次FullGC后年老代没有内存被释放

Q:为什么崩溃前垃圾回收的时间越来越长?

A:根据内存模型和垃圾回收算法,垃圾回收分两部分:内存标记、清除(复制),标记部分只要内存大小固定时间是不变的,变的是复制部分,因为每次垃圾回收都有一些回收不掉的内存,所以增加了复制量,导致时间延长。所以,垃圾回收的时间也可以作为判     断内存泄漏的依据

   Q:为什么Full GC的次数越来越多?

   A:因此内存的积累,逐渐耗尽了年老代的内存,导致新对象分配没有更多的空间,从而导致频繁的垃圾回收

     Q:为什么年老代占用的内存越来越大?

     A:因为年轻代的内存无法被回收,越来越多地被Copy到年老代

    内存调优原则

      1、多数的Java应用不需要在服务器上进行GC优化;

      2、多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;

      3、在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);

      4、减少创建对象的数量;

      5、减少使用全局变量和大对象;

      6、GC优化是到最后不得已才采用的手段;

      7、在实际使用中,分析GC情况优化代码比优化GC参数要多得多;

   GC优化的目的

1、将转移到老年代的对象数量降低到最小;

2、减少full GC的执行时间;

为了达到上面的目的,一般地,你需要做的事情有

      1、减少使用全局变量和大对象;

      2、调整新生代的大小到最合适;

      3、设置老年代的大小为最合适;

      4、选择合适的GC收集器;

时间: 2024-10-06 10:35:28

JVM内存模型简介的相关文章

jvm-垃圾回收gc简介+jvm内存模型简介

gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm是在计算机系统上又虚拟出来的一个伪计算机系统,它存在于计算机内存中并运行在操作系统之上, jvm在执行字节码时,把字节码解释成具体平台上的机器指令执行,那我们就来看看这个JVM伪计算机系统是怎么设计的,如下是jvm的体系图,运行数据区是jvm的内存模型: 程序计数器:一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是

JVM内存模型与GC算法(简介)

JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明. 1.1程序计数器 程序计数器是众多编程语言都共有的一部分,作用是标示下一条需要执行的指令的位置,分支.循环.跳转.异常处理.线程恢复等基础功能都是依赖程序计数器完成的. 对于Java的多线程程序而言,不同的线程都是通过轮流获得cpu的时间片运行的,这符合计算机组成原理的基本概念,因此不同的线程之间需要不停的获得运行,挂起等待

JVM内存模型 三

本文章节: 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介 i.内存模型概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Java同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型.究竟什么是内存模型?内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和

JVM内存模型-转载

http://my.oschina.net/u/567296/blog/303780 JVM的内部结构如下图: JVM主要包括两个子系统和两个组件: 1. 两个子系统分别是Class loader子系统和Execution engine(执行引擎) 子系统: 1.1 Class loader子系统的作用:根据给定的全限定名类名(如 java.lang.Object)来装载class文件的内容到 Runtime data area中的method area(方法区域).Java程序员可以exten

jvm的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集(转)

深入Java虚拟机:JVM中的Stack和Heap(转自:http://www.cnblogs.com/laoyangHJ/archive/2011/08/17/gc-Stack.html) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的内存分为两部分:Stack和Heap. Stack(栈)是JVM的内存指令区.Stack管理很简单,push

JVM内存模型以及HotSpot的GC策略

概述 想要进一步掌握Java语言,必须要深入了解一下Java程序的运行环境.本文会对JVM的内存模型.Java内存自动管理机制.以及Oracle官方虚拟机HotSpot在GC方面的实现策略进行大概的梳理. 什么是Java的内存模型? 众所周知,Java程序是运行在JVM上面的,但是不具体指定是哪一款JVM,只要是符合一定的规范的JVM,都可以正确的运行Java字节码.该规范由Oracle官方提供,旨在描述一个抽象的JVM,它包含很多部分,包括class文件结构.运行时内存状态.指令集等. 而上述

jvm内存模型及分配

1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域.(3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行. 2.jdk.jre.jvm是什么关系?(1)JRE(Java

JVM内存模型理解

Java虚拟机(Java VirtualMachine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一. JVM内存模型 1.方法区和堆是所有线程共享的数据区 1)堆:存放对象的实例 2)方法区:存放已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码 3)运行时常量池:是方法区的一部分,存放Class的版本.字段.方法.接口等描述信息,字符串池就是这个!!! 2.程序计数器.虚拟机栈.本地方法栈是线程隔离的数据区 4)程序

JVM内存模型及垃圾回收机制

JVM内存模型1.栈Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.存储局部变量.引用.方法.返回值等.StackOverflowError:如果在线程执行的过程中,栈空间不够用,那么JVM就会抛出此异常,这种情况一般是死递归造成的.2.堆 Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等. 2.1堆的分代JVM堆一般分为三个部分:Young:年轻代Young区被划分为三部分,Eden区和两个大小严格相同的Su