jvm的内存管理【转】

【转】JVM内存管理

这些日子一直在研究jvm内存管理的东西,网上的知识很多,总结一下,能沉淀下来的就是自己的!

首先,刚学java的时候就知道java类文件是以 .java为后缀的文件,经过javac命令编译后,编译成class文件,class文件中都是二进制格式的数据,所以想要看编译后的内容是什么,可以采用jdk自带的javap命令查看。

记得刚学java的时候觉得java虚拟机厉害的很,java的风光正是建立在它的功劳之上。JVM (java vitual machine)。JVM中有个组成部分为类加载器(ClassLoader),负责java文件编译后class文件的加载,加载到哪呢,加载到内存。那下面来说一下JVM的内存管理。

JVM的内存分栈内存、堆内存、本地方法栈和方法区四部分。java通过类加载器来加载class文件,加载到内存后,会把类、方法、常变量放到堆内存中。因为java是自动进行垃圾回收的,所以放入堆内存中的东西,哪些该回收,哪些不该回收?这都需要jvm去额外的线程去进行判断。但如果对于一个大型的J2EE系统来说,当创建的对象及方法变量比较多时,即堆内存中的对象比较多,如果一个一个对象去进行循环判断是否该回收时,这样的回收机制未免太耗时了,系统的性能一定会下降,jvm为了提高jvm执行效率,采用了堆内存分区管理的机制。

JVM把堆内存分三大块:Young Generation Space 新生区(也称新生代)、Tenure generation space养老区(也称旧生代)、Permanent Space 永久存储区。分区是为了进行模块化管理,管理不同的对象及变量以提高JVM的执行效率。

对于Young Generation Space ,它主要用来存储新创建的对象,内存大小会比较小,垃圾回收会比较频繁。对此区又分三个区域:一个Eden Space和两个Survivor Space。有一个前辈对这三个区域描述的相当透彻:

  • 当对象在堆创建时,将进入年轻代的Eden Space。
  • 垃圾回收器进行垃圾回收时,扫描Eden Space和A Suvivor Space,如果对象仍然存活,则复制到B Suvivor Space,如果B Suvivor Space已经满,则复制 Old Gen
  • 扫描A Suvivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个Old对象,则将其移到Old Gen。
  • 扫描完毕后,JVM将Eden Space和A Suvivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和BSuvivor Space。

对于Tenure generation space,它主要是用来存储那些长时间被引用的对象。因为它里面存放的是经过几次在Young Genderation Space 进行扫描判断过仍存活的对象,内存大小会比较大,垃圾回收频率会比较小。

 对于Permanent Space 永久存储区,它是用来存储一些值信息不经常变更的东东,有类定义、字节码和常量等。(注:这里的类定义和字节码,我现在还不是很清楚)

先总结这么多吧!

时间: 2024-10-12 21:23:25

jvm的内存管理【转】的相关文章

JVM自动内存管理机制——Java内存区域

一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄漏和内存溢出的问题.显然,这里的不容易只是相对而言的,如果我们想要降低这种代码隐患的发生,就需要对Java虚拟机怎样使用内存有了解,这样的话就算产生错误,排查起来也会相对容易.下面我们来说一说JVM运行时数据区域 1.程序计数器(PC寄存器): 被看作是当前线程所执行的字节码的行号指示器,字节码解析

JVM自动内存管理机制——Java内存区域(下)

一.虚拟机参数配置 在上一篇<Java自动内存管理机制--Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a)下面是一些简单的使用参数 其中最后一个是一个运行时参数设置的简单实例.一般-XX是系统级别的配置(日志信息,或者是配置使用什么样的垃圾回收器等等),后面跟上+表示启用.不是-XX基本上是对于应用层面的配置信息 下面是一个简单的实例:表示设置初始堆大小为5M,最大堆大小为20M,并将虚拟机的参数设置打印出来,后

JVM堆内存管理与自定义分配参数详解

堆内存模型: 在Java中,堆被划分成两个不同的区域:新生代(Young),老年代(Old).而Permanent属于永久代(方法区),不属于堆内存.新生代又被分为了三个区域:Eden,from  survivor,to survivor.这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存分配以及回收. 从图中可以看出: 堆大小=新生代+老年代,默认的,新生代与老年代的比例为1:2(该值可以通过参数-XX:NewRatio指定),即:新生代=1/3堆空间大小,老年代=2/3堆空间

JVM自动内存管理:对象判定和回收算法

可回收对象的判断方法 1.引用计数算法 2.可达性分析算法 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 引用计数算法的缺陷:循环引用 可达性分析算法 可达性分析算法基本原理: 通过一些列的称为"GC Roots"的对象作为起始点,从这些节点开始进行向下搜索,搜索 所走过的路径成为引用链(Reference Chain),当一个对象到GC Roots没有任何引用连(用图论的

JVM之内存管理

运行时数据区包括五部分: 程序计数器,JVM栈,本地方法栈,堆,方法区,前三种线程私有,后两种内存分配是动态的,所以GC只关注这两部分. 程序计数器:线程执行字节码的行号指示器,记录字节码指令地址,执行本地方法为空 JVM栈:方法执行时建立栈帧,存放 局部变量表,基本数据类型的值,对象引用,动态链接,方法出口 堆:存放对象实例,成员变量,数组值,分为新生代(包括三部分 Eden from to 8:1:1)和老生代 比例默认1:2 方法区:包括永久代(存放类信息),和运行时常量池(存放编译期生成

JVM的内存管理

所有的数据和程序都是在运行数据区存放,它包括以下几部分: Stack 栈 栈也叫栈内存,是Java程序的运行区,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就Over.问题出来了:栈中存的是那些数据呢?又什么是格式呢? 栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中

JVM 自动内存管理:对象判定和回收算法

Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确实很低,一方面,Java语言采用面向对象思想,这也决定了其必然是开发效率高,执行效率低.另一方面,Java语言对程序员做了一个美好的承诺:程序员无需去管理内存,因为JVM有垃圾回收(GC),会去自动进行垃圾回收. 其实不然: 1.垃圾回收并不会按照程序员的要求,随时进行GC. 2.垃圾回收并不会及时

从JVM内存管理的角度谈谈JAVA类的静态方法和静态属性

在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的内存分为两部分:Stack和Heap.(stack和heap都是位于RAM中的) stack(栈)是JVM的内存指令区.stack管理很简单,push一定长度字节的数据或者指令,stack指针压栈相应的字节位移:pop一定字节长度数据或者指令,stack指针弹栈.stack的速度很快,管理很简单,并