当前位置:文档之家› JAVA的缓存应用

JAVA的缓存应用


当物理内存吃紧的情况下,会产生大量的页入,页出动作, 当物理内存吃紧的情况下,会产生大量的页入,页出动作,从而降低系统运行速度
再来看看任务管理器
总数: 总数:RAM物理内存总大小 物理内存总大小 可用数:当前RAM内存还剩余多少 可用数:当前 内存还剩余多少 系统缓存: 系统缓存:指的是系统共享内存使用量

• System.gc();其实并不一定立即触发垃圾回收。 只是告诉系统现在该进行垃圾回收了。 • JVM的垃圾回收一种自动的处理机制。 • 垃圾回收太频繁会对系统造成一定的压力, 因为要遍历所有的内存区域。
基本缓存的使用
• 为什么使用缓存 • JAVA集合类的应用(HashMap) • JAVA单例
注意:所以我们在给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 对象。
Application 2GB
用于程序存放代码,数据,堆栈,自由存储区
Windows System 2GB
共享内存,所有进程都用到的内存区域
操作系统规定:一个应用程序所能承载的最大寻址内存 是2GB(可以通过配置改变到3GB),因为主要是为了预留 一部分给操作系统使用,叫做共享内存区。 所以虽然一个程序理论上可以访问4GB内存,但是实际 上只能分配2GB的空间。
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空间的束缚了。
垃圾回收机制
• 首先当启动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堆空间溢出 (ng.OutOfMemoryError: Java heap space)”,也即是在堆空间没有空间来创建对 象。 这就是JVM的内存分区管理,相比不分区来说;一般情况下,垃圾回收的速度要快很多;因为在没有必要 的时候不用扫描整片内存而节省了大量时间。 通常大家还会遇到另外一种内存溢出错误“永久存储区溢出(ng.OutOfMemoryError: Java Permanent Space)”。
JAVA缓存体系及应用
2010.10.27
目录
• • • • • • 带着问题来,带着答案走 JAVA内存体系介绍 基本缓存的使用 缓存框架的介绍 内存溢出状况分析 内存检查工具的使用
问题
• JVM内存的分配原理? • JVM启动的时候如何正确的设置内存参数? • JVM内存是不是越大越好? • 什么情况下大家用到了缓存处理,很好的 解决了问题? • 缓存框架帮我们解决哪些问题,为什么要 使用缓存框架? • 你是如何进行内存溢出检查的?
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
JVM内存参数设置
Permagnent 空间 Java Heap Space空间 Extend Virtual (永久区虚拟 内存) Extend Virtual (养老区虚拟内 存) Extend Virtual (幸存者区虚拟 内存)
Permagnet (永久区)
Tenured (养老区)
Enden (伊甸园)
Application 2GB
用于程序存放代码,数据,堆栈,自由存储区
Windows System 2GB
共享内存,所有进程都用到的内存区域
Jvm
Permanet
Native Heap
Java Heap
System lib
JAVA程序本身使用的内存区域
JNI的调用 存放线程、系统变量、 一些类似Runtime的操 作
Survivor0 (幸存者0)
Survivor0 (幸存者1)
-XX:MaxPermSize
-Xmx(最大内存配置) -Xms(最小内存配置,初始养老区+年轻区)
-XX:PermSize -XX:MaxNewSize(最大年轻区大小) -XX:NewSize(年轻区大小) -XX:SurvivorRatio (设置年轻代中Eden区与Survivor区的大小比值) -XX:NewRatio (设置年轻代(包括Eden和两个Survivor区)与年老代的比值)
所以我们可以得出2个程序的最大使用内存是:2G(共享内存)+2*2G(程序内存)=6G
为什么我的电脑是2G内存,但是在系统可以使用超过2G的内存空间,大概有 4G!
页面文件
• 以上情况是由于页面文件控制的。 • 这里很容易混淆一个概念,认为以上windows磁盘用来充当内 存的叫做虚拟内存,其实windows管理的内存都叫做虚拟内存。 所以虚拟内存是:RAM(物理内存)+页面文件(磁盘内存) • 页面文件即当内存不够时系统会拿出一部分硬盘空间来充当内 存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存, 以缓解内存的紧张。比如:你的机器有2G内存,当使用的内存 超过2G时,超过的部分就会将硬盘上的文件映射成内存来使用。 • 按照这样逻辑我们不难得出只要虚拟内存够大,我们就可以无 限制的使用,不过考虑到性能这也是不切实际的。 • 以上只是很浅显的一个理解,其实Windows虚拟内存的管理是 一个比较复杂的处理过程,由于windows的多任务机制,再配 合虚拟内存,其实windows运行的程序所占用的内存是远远超 过可分配内存的。
相关主题