JAVA的缓存应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
注意:所以我们在给Java程序分配内存时是分不到2G空间的
存放具体的Classes、 Jar信息
JVM内存分配管理
• • • • • JVM如何管理内存 永久存储区(Permanent Space):永久存储区是JVM的驻留内存,用于存放JDK 自身所携带的Class,Interface的元数据。 堆空间(The Heap Space):JAVA对象的出生,成长,死亡都在这个区域完成;堆 空间又分为养老区和新生区。 新生区(Young (New) generation space):新生区的作用包括JAVA对象的创建和 从JAVA对象中筛选出能进入养老区的JAVA对象。 伊甸园(Eden space):JAVA对空间中的所有对象在此出生,该区的名字因此而 得名。也即是说当你的JAVA程序运行时,需要创建新的对象,JVM将在该区为 你创建一个指定的对象供程序使用。创建对象的依据即是永久存储区中的元 数据。 幸存者0区(Survivor 0 space)和幸存者1区(Survivor1 space):当伊甸园的 控件用完时,程序又需要创建对象;此时JVM的垃圾回收器将对伊甸园区进 行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象进行销毁工作。 同时将伊甸园中的还有其他对象引用的对象移动到幸存者0区。如果0区域也 没有空间了就会向1区移动。 养老区(Tenure (Old) generation space):用于保存从新生区筛选出来的JAVA 对象。
JAVA集合类HashMap
• 基本上所有的缓存都是基于HashMap结构存 储的;HashMap是一种高效的数据存储方式。 • HashMap的get和put方法 • HashMap与ArrayList的比较
•
• System.gc();其实并不一定立即触发垃圾回收。 只是告诉系统现在该进行垃圾回收了。 • JVM的垃圾回收一种自动的处理机制。 • 垃圾回收太频繁会对系统造成一定的压力, 因为要遍历所有的内存区域。
基本缓存的使用
• 为什么使用缓存 • JAVA集合类的应用(HashMap) • JAVA单例
JVM内存参数设置
Permagnent 空间 Java Heap Space空间 Extend Virtual (永久区虚拟 内存) Extend Virtual (养老区虚拟内 存) Extend Virtual (幸存者区虚拟 内存)
Permagnet (永久区)
Tenured (养老区)
Enden (伊甸园)
虚拟内存大小,指的是程序所用到的所 有2G虚拟内存的寻址空间大小,一般会 包含在RAM、页面文件、exe和dll中。
关于Linux的内存管理
• Windows管理内存更加规范和统一,通过统 一的内存映射和跟踪机制来完成,但是同 时也失去了一定的灵活性。 • Linux管理内存不是很规范,省去了内存映 射,而是直接将内存提交到页面,并且只 有当页面被真正使用了,才会将其绑定到 内存中中。
JAVA内存体系介绍
• • • • • 操作系统的内存使用和管理 JVM内存的分类 JVM内存参数设置及作用 垃圾回收机制 内存实时状态查询
操作系统的内存使用和管理
• Windows内存使用 • 虚拟内存是Windows管理所有可用内存的方式。 • Windows 32位为每个进程分配了4G的虚拟地址空间(用 于表示该进程有这么多的空间可用),4G是由于操作系 统+CPU是32位的,寻址空间就只有2的32次方,因此得 出4G的存储空间。 • Windows操作系统默认会给程序和系统预留2G的内存寻 址空间;我们可以通过配置将应用程序的最大内存配置 到3G。 • 4G配置 但电脑显示最多3.5内存 。因为:xp/vista 32bit 在安装4G内存后会分配其中部分内存作为设备保留的内 存地址。 • 64位就不存在4GB空间的束缚了。
Application 2GB
用于程序存放代码,数据,堆栈,自由存储区
Windows System 2GB
共享内存,所有进程都用到的内存区域
操作系统规定:一个应用程序所能承载的最大寻址内存 是2GB(可以通过配置改变到3GB),因为主要是为了预留 一部分给操作系统使用,叫做共享内存区。 所以虽然一个程序理论上可以访问4GB内存,但是实际 上只能分配2GB的空间。
所以我们可以得出2个程序的最大使用内存是:2G(共享内存)+2*2G(程序内存)=6G
为什么我的电脑是2G内存,但是在系统可以使用超过2G的内存空间,大概有 4G!
页面文件
• 以上情况是由于页面文件控制的。 • 这里很容易混淆一个概念,认为以上windows磁盘用来充当内 存的叫做虚拟内存,其实windows管理的内存都叫做虚拟内存。 所以虚拟内存是:RAM(物理内存)+页面文件(磁盘内存) • 页面文件即当内存不够时系统会拿出一部分硬盘空间来充当内 存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存, 以缓解内存的紧张。比如:你的机器有2G内存,当使用的内存 超过2G时,超过的部分就会将硬盘上的文件映射成内存来使用。 • 按照这样逻辑我们不难得出只要虚拟内存够大,我们就可以无 限制的使用,不过考虑到性能这也是不切实际的。 • 以上只是很浅显的一个理解,其实Windows虚拟内存的管理是 一个比较复杂的处理过程,由于windows的多任务机制,再配 合虚拟内存,其实windows运行的程序所占用的内存是远远超 过可分配内存的。
JAVA缓存体系及应用
2010.10.27
目录
• • • • • • 带着问题来,带着答案走 JAVA内存体系介绍 基本缓存的使用 缓存框架的介绍 内存溢出状况分析 内存检查工具的使用
问题
• JVM内存的分配原理? • JVM启动的时候如何正确的设置内存参数? • JVM内存是不是越大越好? • 什么情况下大家用到了缓存处理,很好的 解决了问题? • 缓存框架帮我们解决哪些问题,为什么要 使用缓存框架? • 你是如何进行内存溢出检查的?
当物理内存吃紧的情况下,会产生大量的页入,页出动作, 当物理内存吃紧的情况下,会产生大量的页入,页出动作,从而降低系统运行速度
再来看看任务管理器
总数: 总数:RAM物理内存总大小 物理内存总大小 可用数:当前RAM内存还剩余多少 可用数:当前 内存还剩余多少 系统缓存: 系统缓存:指的是系统共享内存使用量
JVM内存分类
• 系统级内存分配 • JVM的内存分配机制其实也是基于操作系统 分配机制 • JVM最大的内存在win32下是2G • JVM的内存使用情况实际被分为:JVM虚拟 机、JAVA程序的字节码(classes)、系统内存 空间Native Heap(主要用于存放线程和一些 系统级的对象和操作)、JAVA内存Java Heap(真正的存放Java Object 的内存区域)
•
•
JAVA所有管理的内存 堆空间(Java Heap Space)
伊甸园区(eden)
永久内存区域 (Permanent): 存放Classes、 Jar等数据
养老区(Tenured) (其实可以看作是”终极”幸 存者)
幸存者区0(survivor0) From
幸存者区1(survivor1) To
为什么使用缓存
• 大量的数据库IO操作;例如:循环获取一个用 户信息,从缓存中读取则能提交几十倍至上百 倍的性能。 • Socket通信的异步缓冲池,避免线程的阻塞, 将通信的信息放置到缓存中。 • 一些通用页面、JS、CSS的加载,减少对本地 文件的操作。 • 异步信息存储,例如:UCALL的中的消息存储。 • 统计和计算时暂存的一些信息,加快统计的效 率。
Application 2GB
用于程序存放代码,数据,堆栈,自由存储区
Windows System 2GB
共享内存,所有进程都用到的内存区域
Jvm
Permanet
源自文库Native Heap
Java Heap
System lib
JAVA程序本身使用的内存区域
JNI的调用 存放线程、系统变量、 一些类似Runtime的操 作
提交更改(前面的 : 提交更改 前面的): 前面的 实际是虚拟内存使用量,包括 包括RAM和页面文件 实际是虚拟内存使用量 包括 和页面文件 提交更改(后面的 后面的): 提交更改 后面的 : 虚拟内存的总量总RAM+总的页面文件 虚拟内存的总量总 总的页面文件
进程内存使用量,该数据指的是程序独 占RAM内存和使用到的系统共享内存因 为有共享成分在里面,所以所有程序内 存加起来不一定等于系统RAM使用的总 量。
Survivor0 (幸存者0)
Survivor0 (幸存者1)
-XX:MaxPermSize
-Xmx(最大内存配置) -Xms(最小内存配置,初始养老区+年轻区)
-XX:PermSize -XX:MaxNewSize(最大年轻区大小) -XX:NewSize(年轻区大小) -XX:SurvivorRatio (设置年轻代中Eden区与Survivor区的大小比值) -XX:NewRatio (设置年轻代(包括Eden和两个Survivor区)与年老代的比值)
垃圾回收机制
• 首先当启动J2EE应用服务器时,JVM随之启动,并将JDK的类和接口,应用服务器运行时需要的类和接口以 及J2EE应用的类和接口定义文件也及 编译后的Class文件或JAR包中的Class文件装载到JVM的永久存储区。在 伊甸园中创建JVM,应用服务器运行时必须的JAVA对象,创建 J2EE应用启动时必须创建的JAVA对象;J2EE应 用启动完毕,可对外提供服务。 JVM在伊甸园区根据用户的每次请求创建相应的JAVA对象,当伊甸园的空间不足以用来创建新JAVA对象的时 候,JVM的垃圾回收器执行对伊甸园区的垃 圾回收工作,销毁那些不再被其他对象引用的JAVA对象(如果 该对象仅仅被一个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类 推),并 将那些被其他对象所引用的JAVA对象移动到幸存者0区。 如果幸存者0区有足够控件存放则直接放到幸存者0区;如果幸存者0区没有足够空间存放,则JVM的垃圾回 收器执行对幸存者0区的垃圾回收工作,销毁那些不 再被其他对象引用的JAVA对象(如果该对象仅仅被一 个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并将那些被其他对 象 所引用的JAVA对象移动到幸存者1区。 如果幸存者1区有足够控件存放则直接放到幸存者1区;如果幸存者0区没有足够空间存放,则JVM的垃圾回 收器执行对幸存者0区的垃圾回收工作,销毁那些不 再被其他对象引用的JAVA对象(如果该对象仅仅被一 个没有其他对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并将那些被其他对 象 所引用的JAVA对象移动到养老区。 如果养老区有足够控件存放则直接放到养老区;如果养老区没有足够空间存放,则JVM的垃圾回收器执行 对养老区区的垃圾回收工作,销毁那些不再被其他对象引 用的JAVA对象(如果该对象仅仅被一个没有其他 对象引用的对象引用的话,此对象也被归为没有存在的必要,依此类推),并保留那些被其他对象所引用 的 JAVA对象。如果到最后养老区,幸存者1区,幸存者0区和伊甸园区都没有空间的话,则JVM会报告 “JVM堆空间溢出 (java.lang.OutOfMemoryError: Java heap space)”,也即是在堆空间没有空间来创建对 象。 这就是JVM的内存分区管理,相比不分区来说;一般情况下,垃圾回收的速度要快很多;因为在没有必要 的时候不用扫描整片内存而节省了大量时间。 通常大家还会遇到另外一种内存溢出错误“永久存储区溢出(java.lang.OutOfMemoryError: Java Permanent Space)”。
应用程序1
激活应用程序
内存 1 2 3
最小化应用程序 分配相应的内存
磁盘
切换应用程序2
应用程序2 9 8
读取页面文件放到物理内存中 并重新建立映射
10
4
回收内存 将内存内容映射到页面文件 并重新建立映射
5
6
关闭应用程序
7 3-5:表示页入动作 : 8-10:表示页出动作 :
释放虚拟内存
操作系统来调度