【转】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 永久存储区,它是用来存储一些值信息不经常变更的东东,有类定义、字节码和常量等。(注:这里的类定义和字节码,我现在还不是很清楚)

先总结这么多吧!

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

  1. JVM的内存管理机制-转载

    JVM的内存管理机制 一.JVM的内存区域 对于C.C++程序员来说,在内存管理领域,他们既拥有每一个对象的"所有权",又担负着每一个对象生命开始到终结的维护责任. 对Java程序 ...

  2. JVM的内存管理机制

    在做Java开发的时候常用的JVM内存管理有两种,一种是堆内存,一种是栈内存.堆内存主要用来存储程序在运行时创建或实例化的对象与变量,例如:我们通过new MyClass()创建的类MyClass的对 ...

  3. JVM自动内存管理学习笔记

    对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...

  4. JVM自动内存管理-Java内存区域与内存溢出异常

    摘要: JVM内存的划分,导致内存溢出异常的可能区域. 1. JVM运行时内存区域 JVM在执行Java程序的过程中会把它所管理的内存划分为以下几个区域: 1.1 程序计数器 程序计数器是一块较小的内 ...

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

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

  6. JVM自动内存管理机制——Java内存区域(上)

    一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...

  7. JVM自动内存管理机制--读这篇就GO了

    之前看过JVM的相关知识,当时没有留下任何学习成果物,有些遗憾.这次重新复习了下,并通过博客来做下笔记(只能记录一部分,因为写博客真的很花时间),也给其他同行一些知识分享. Java自动内存管理机制包 ...

  8. JVM自动内存管理:内存区域基础概念

    1.课程概要 (1)Java虚拟机和Java内存区域概述 (2)Java虚拟机栈和本地方法栈 (3)Java堆 (4)方法区和运行时常量池 (5)直接内存 2.Java虚拟机运行时数据区 运行时数据区 ...

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

    堆内存模型: 在Java中,堆被划分成两个不同的区域:新生代(Young),老年代(Old).而Permanent属于永久代(方法区),不属于堆内存.新生代又被分为了三个区域:Eden,from  s ...

随机推荐

  1. VBS解析时候遇到时间

    http://msdn.microsoft.com/en-us/library/aa393687(v=vs.85).aspx MSDN说的很详细么. http://msdn.microsoft.com ...

  2. Delphi 服务操作

    unit Service; interface uses Windows,Messages,SysUtils,Winsvc,Dialogs; function  StartServices(Const ...

  3. 第一章 andriod studio 安装与环境搭建

    原文 http://blog.csdn.net/zhanghefu/article/details/9286123 第一章   andriod studio 安装与环境搭建 一.Android Stu ...

  4. C语言的本质(6)——位运算

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型 ...

  5. 在linux下读取bmp文件头的完整代码。

    呵呵,贴在这里记录一下. [cpp] view plaincopy #include<stdio.h> #include<string.h> #include<sys/t ...

  6. 元数据(meta-data)

    本章所介绍的元数据的知识,可能在定制系统时会用到.因为那是后需要修改底层框架的一些内容 一.元数据的定义 在AndroidManifest.xml中如下书写: <activity android ...

  7. linux学习之(五)-linux文解压、压缩、安装

    查看一个文件的类型 命令:  file  文件名 创建一个.tar类型的压缩包使用命令:tar -cvf    [文件名].tar  目录   例:tar -cvf   a.tar    yasuo/ ...

  8. string和整数转换

    tostring(int) fromstring(string ) c++11新方式 stod Convert string to double (function template ) stold ...

  9. ios模拟器安装.app

    相对于xcode的run,然后再在安装到模拟器上测试,如果是个人开发的话,那还好. 要是是团队开发,那每次其他的童鞋就都需要update最新的文件下来再编译运行了. 而且,一些测试的童鞋也不会打开xc ...

  10. mysql-5.7.10-winx64 MySQL服务无法启动,服务没有报告任何错误的解决办法

      总结报错原因:在my.init文件下新增data目录(datadir = F:\mysqldata ) 最新解压版本的mysql 解压安装的时候报错D:\mysql\mysql-5.7.10-wi ...