收藏 分销(赏)

JAVA的缓存应用.ppt

上传人:精**** 文档编号:12707695 上传时间:2025-12-01 格式:PPT 页数:48 大小:827KB 下载积分:12 金币
下载 相关 举报
JAVA的缓存应用.ppt_第1页
第1页 / 共48页
JAVA的缓存应用.ppt_第2页
第2页 / 共48页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,JAVA,缓存体系及应用,2010.10.27,目录,带着问题来,带着答案走,JAVA内存体系介绍,基本缓存的使用,缓存框架的介绍,内存溢出状况分析,内存检查工具的使用,问题,JVM内存的分配原理?,JVM启动的时候如何正确的设置内存参数?,JVM内存是不是越大越好?,什么情况下大家用到了缓存处理,很好的解决了问题?,缓存框架帮我们解决哪些问题,为什么要使用缓存框架?,你是如何进行内存溢出检查的?,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,应用程序,1,内存,磁盘,1,激活应用程序,2,分配相应的内存,3,4,回收内存,5,将内存内容映射到页面文件,并重新建立映射,最小化应用程序,6,7,关闭应用程序,释放虚拟内存,应用程序,2,8,9,切换应用程序,2,读取页面文件放到物理内存中,并重新建立映射,10,操作系统来调度,当物理内存吃紧的情况下,会产生大量的页入,页出动作,从而降低系统运行速度,3-5,:表示页入动作,8-10,:表示页出动作,再来看看任务管理器,总数:,RAM,物理内存总大小,可用数:当前,RAM,内存还剩余多少,系统缓存:指的是系统共享内存使用量,提交更改,(,前面的,),:,实际是虚拟内存使用量,包括,RAM,和页面文件,提交更改,(,后面的,),:,虚拟内存的总量总,RAM+,总的页面文件,进程内存使用量,该数据指的是程序独占,RAM,内存和使用到的系统共享内存因为有共享成分在里面,所以所有程序内存加起来不一定等于系统,RAM,使用的总量。,虚拟内存大小,指的是程序所用到的所有,2G,虚拟内存的寻址空间大小,一般会包含在,RAM,、页面文件、,exe,和,dll,中。,关于,Linux,的内存管理,Windows,管理内存更加规范和统一,通过统一的内存映射和跟踪机制来完成,但是同时也失去了一定的灵活性。,Linux,管理内存不是很规范,省去了内存映射,而是直接将内存提交到页面,并且只有当页面被真正使用了,才会将其绑定到内存中中。,JVM,内存分类,系统级内存分配,JVM,的内存分配机制其实也是基于操作系统分配机制,JVM,最大的内存在,win32,下是,2G,JVM,的内存使用情况实际被分为:,JVM,虚拟机、,JAVA,程序的字节码,(classes),、系统内存空间,Native Heap(,主要用于存放线程和一些系统级的对象和操作,),、,JAVA,内存,Java Heap(,真正的存放,Java Object,的内存区域,),Application 2GB,用于程序存放代码,数据,堆栈,自由存储区,Windows System 2GB,共享内存,所有进程都用到的内存区域,Jvm,Permanet,Native Heap,Java Heap,System lib,JAVA,程序本身使用的内存区域,存放线程、系统变量、一些类似,Runtime,的操作,存放具体的,Classes,、,Jar,信息,注意:所以我们在给,Java,程序分配内存时是分不到,2G,空间的,JNI,的调用,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,所有管理的内存,永久内存区域,(Permanent),:,存放,Classes,、,Jar,等数据,养老区,(Tenured),(,其实可以看作是,”,终极,”,幸存者,),伊甸园区,(eden),幸存者区,0(survivor0),From,幸存者区,1(survivor1),To,堆空间,(Java Heap Space),JVM,内存参数设置,Permagnet,(,永久区,),Extend Virtual,(,永久区虚拟内存,),Tenured,(,养老区,),Extend Virtual,(,养老区虚拟内存,),Enden,(,伊甸园,),Survivor0,(,幸存者,0),Survivor0,(,幸存者,1),Extend Virtual,(,幸存者区虚拟内存,),-XX:MaxPermSize,-XX:PermSize,-Xmx(,最大内存配置,),-Xms(,最小内存配置,初始养老区,+,年轻区,),-XX:MaxNewSize(,最大年轻区大小,),-XX:NewSize(,年轻区大小,),-XX:SurvivorRatio(,设置年轻代中,Eden,区与,Survivor,区的大小比值,),-XX:NewRatio(,设置年轻代(包括,Eden,和两个,Survivor,区)与年老代的比值,),Permagnent,空间,Java Heap Space,空间,垃圾回收机制,首先当启动,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,)”。,System.gc();,其实并不一定立即触发垃圾回收。只是告诉系统现在该进行垃圾回收了。,JVM,的垃圾回收一种自动的处理机制。,垃圾回收太频繁会对系统造成一定的压力,因为要遍历所有的内存区域。,基本缓存的使用,为什么使用缓存,JAVA,集合类的应用,(HashMap),JAVA,单例,为什么使用缓存,大量的数据库,IO,操作;例如:循环获取一个用户信息,从缓存中读取则能提交几十倍至上百倍的性能。,Socket,通信的异步缓冲池,避免线程的阻塞,将通信的信息放置到缓存中。,一些通用页面、,JS,、,CSS,的加载,减少对本地文件的操作。,异步信息存储,例如:,UCALL,的中的消息存储。,统计和计算时暂存的一些信息,加快统计的效率。,JAVA,集合类,HashMap,基本上所有的缓存都是基于,HashMap,结构存储的;,HashMap,是一种高效的数据存储方式。,HashMap,的,get,和,put,方法,HashMap,与,ArrayList,的比较,JAVA,单例,要使得缓存生效,一般而言都需要将持有缓存对象的对象设置成单例的,变成不可销毁的对象,让垃圾回收器在处理的时候不会自动将其销毁掉,这样下次能继续进行使用。,由于不同的,Cache,我们需要不同的实体去处理,因为不可能所有的对象都存储在一个,Cache,里面,这样就没法索引和获取当前,Cache,的数量了,因此需要进行区分和管理;所以就需要框架的支持。,缓存框架的介绍,Oscache,缓存架构,Ehcache,缓存架构,Memcached,缓存架构,JiveCache,缓存架构,Terracotta JVM,级缓存架构,OSCache,缓存架构,快速缓存机制,控制缓存的时间和大小,支持页面式的缓存方式,支持本地文件、,JDBC,、,JNI,缓存方式,支持集群缓存的部署,(,性能比较差,),截至到,2007,没发现有任何更新,AbstractCacheAdministrator,该类主要是进行缓存的初始化:缓存算法、大小、集群等的配置。,GeneralCacheAdministrator,所有缓存对象的抽象基类,如果需要使用缓存,则必须扩展该类。该类出要处理缓存的添加、获取、删除等基本动作。,Abstract,Abstract,Cache,AbstractConcurrentReadCache,FIFOCache,(,最先进来的最先清理掉,),LRUCache,(,最少使用的最先清理掉,),UnlimitedCache,(,缓存大小,=-1,的情况下不用计数也不用清理,),缓存,MAP,Size,不为,0,的情况下,OSCache,UcstarCacheManager,BaseCache,Cache1,Cache2,Oscache,集群,JMS,、,RMI,、,Jgroups,Oscache01,Application01,Cache,JavaCacheListnener,Oscache02,Application02,Cache,JavaCacheListnener,Oscache03,Application03,Cache,JavaCacheListnener,基于,RMI,、,Jgroups,、,JMS,的集群通信协议,需自己编写本地的集群扩展实现类并更新本地缓存,优缺点,优点:使用简单,开发容易。,缺点:性能太差,集群部署麻烦。,Ehcache,从,Hibernate,项目发展起来,目前被,Terracotta,收购开发统一的缓存的解决方案,持续的维护和发布中,标准的缓存支持,(,最大数配置、移除算法、磁盘持久化、重启缓存持久化,),分布式缓存,(RMI,、,Jgroups,、,JMS),集中式缓存,(,类似,Memcached),页面缓存技术,(Oscache),CacheManager(,缓存管理中心,),ehcache.xml,Ehcache,的管理类,所有的缓存的控制都是通过该管理类来进行处理的。,Cache,Store,Memory Store,Disk Store,包含,LRU,、,FIFO,、,LFU,三种,CacheLoader,CacheListener,RMI Replication,JMS Replication,Jgroups Replication,核心模块,分布式扩展模块,UcstarCacheManager,IEhCache,Cache1,Cache2,UcstarEhcache,集群部署方式,-,分散部署,JMS,、,RMI,、,Jgroups,Ehcache01,Application01,Cache,JavaCacheListnener,Ehcache02,Application02,Cache,JavaCacheListnener,Ehcache03,Application03,Cache,JavaCacheListnener,与,Oscache,比较相似,只是,Ehcache,不用自己进行这些维护,可全部交由,Ehcache,程序来处理,可手动配置,RMI,地址或者采用,Jgroups,自动分配,Server,集群,集群部署方式,-,集中部署,LoadBalace,Ehcache Server01,这种方式比较类似,MemCache,,但是因为是,Http,请求,所以效率不高。,Application,(JAVA,、,PHP,、,ASP),Ehcache Server02,Ehcache Server03,Http,请求,优缺点,优点:结构清晰,使用简单,效率高,扩展性比较好。,缺点:集中式缓存部署比较鸡肋,页面缓存过于麻烦。,MemCached,缓存体系,MemCached,是一种集中式缓存部署,采用,C,代码编写,客户端的访问有多种不同的代码实现方式,支持大规模集群的部署方式,支持横向的分布式扩展方式,支持,Slave,、,Master,模式,FaceBook,、阿里巴巴都是采用这种部署方式,最简单的应用,Memcached,Application1,(JAVA,、,PHP,、,ASP),Socket,请求,Application2,(JAVA,、,PHP,、,ASP),Socket,请求,Load Balance,分布式应用,Memcached1,Application1,(JAVA,、,PHP,、,ASP),Socket,请求,Application2,(JAVA,、,PHP,、,ASP),Load Balance,Memcached2,Memcached3,将实例分布在不同的,Memcached,中,分布式,+,集群,Memcached1,Application1,(JAVA,、,PHP,、,ASP),Application2,(JAVA,、,PHP,、,ASP),Load Balance,Memcached2,Memcached3,通过扩展集群解决部分数据单点丢失问题。,Memcached4,Client,MemcacheCluster1,Client,MemcacheCluster2,数据同步,本地程序调用,CacheManager,优缺点,优点:集中式管理,不用考虑数据的复制,部署简单;支持分布式扩展,减少数据全部丢失的问题,减少数据的存储;客户端调用无关。,缺点:性能不如节点均衡网状结构,需考虑单点故障问题,缓存遍历很麻烦因为不支持不同类型的缓存存储方式,对于复杂的缓存结构支持的较差。,一般应用在网站、电子商务等系统上,JiveCache,缓存架构,类似Oscache的实现机制,只有基本的本地缓存实现方式,通过适配器模式扩展出了Ehcache、Memcached、Oscache的解决方案,CacheManager,Cache,Cache1,Cache2,UcstarMemCached,UcstarOsCache,UcstarEhCache,UcstarCacheManager,适配了其他的实现方式,Terracotta JVM,级缓存架构,Terracotta,核心平台是一个基于,JVM,的集群解决方案,允许用户在不修改代码的情况下把单机,Java,应用程序运行在多,JVM,的集群中。,其主要功能特点如下:,实现单机,Java,应用到集群环境的平滑移植,允许,Java,程序像访问本地数据数据一样访问集群共享数据,并且实现对共享数据的集群范围内的访问同步,提供给予网络的虚拟内存管理,允许,Java,程序访问超过其内存空间(,heap,)的数据,数据保存在服务器端,因此客户端,JVM,宕机不会造成数据丢失,增量数据传递,智能数据推送,最大限度减少对网络的负担,使得客户端,JVM,可以横向扩展,主从服务器配置,支持多台从服务器,实现高可用服务器,服务器分片,实现服务器数据存储及数据吞吐量横向扩展,通过,JMX,开放服务器监控信息,提供可视化监控和管理界面,大大方便对整合集群的共享数据、性能数据、软硬件指标等的实施监控、调试、优化,Terracotta DSO,核心平台提供了一个稳健、高效、高可用、易用、易管理的,Java,集群平台。,Terracotta,为了进一步帮助,J2EE,开发人员充分利用其核心平台提供的各项特性,针对,Java,开发人员常用的,Java,技术平台提供了一系列快捷模式(,Express Mode,)的解决方案,包括,Ehcache,分布式缓存、,Hibernate,分布式二级缓存、,Web Session,集群、,分布式,Java,任务调度,Quartz,等等。,使用快捷模式,可以避免客户端程序对,JDK,和应用服务器的依赖、避免配置,tc-config.xml,文件等等。用户直接拷贝相应的,jar,文件,对方案相关的配置文件进行简单修改(比如,ehcache.xml,hibernate.cfg.xml,文件等等),就可以实现集群化了。,后面将逐一介绍,Terracotta,快捷模式支持的解决方案。,内存溢出状况分析,Java heap space,溢出:,JAVA,本身的内存不足,通过修改,-Xms,和,-Xmx,来解决。,Java PermGen space,溢出:,JAVA,的,Permgenant,区域的内存不足,修改,-XX:PermSize,和,-XX:MaxPermSize,来解决。,Java Native space,溢出:,JAVA,线程内存不够、,JNI,调用内存不够;是属于,JAVA,本身以外的内存泄漏。,内存检查工具的使用,Jconsole,:,JDK1.5,以后增加的检查工具,Jrockit,:前身是,BEA,公司开发的,JVM,,后被,IBM,收购,是目前最好的内存检查工具。,Jconsole,JConsole,是一个基于,JMX,的,GUI,工具,用于连接正在运行的,JVM,,不过此,JVM,需要使用可管理的模式启动。如果要把一个应用以可管理的形式启 动,可以在启动是设置,com.sun.management.jmxremote,。例如,启动一个可以在本地监控的,J2SE,的应用,Java2Demo,,需输入以下命令:,JDK_HOME,/bin/java-Dcom.sun.management.jmxremote-jar b,JDK_HOME,/demo/jfc/Java2D/Java2Demo.jar,JRockit,在需要被,jrockit,调用的应用中添加以下参数:,%JAVA_HOME%binjava%JAVA_VM%-Xms32m-Xmx256m-Xmanagement:port=7091,ssl=false,authenticate=false,谢谢,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服