java 内存结构

JVM的内存分配机制是基于操作系统的。
JVM最大的内存在win32下是2G
JVM的内存使用情况被分为:
    JVM虚拟机
    永久存储区:JAVA程序的字节码 classes ,jar
      系统内存空间 Native Heap(主要用于存放线程和一些系统级的对象和操作)
     堆空间: JAVA内存 Heap(真正的存放Java Object的内存区域)
              新生区 (Young (New) generation space):新生区的作用包括JAVA对象的创建和从JAVA对 中筛选出能进入养老区的JAVA对象。
              伊甸园(Eden space) JAVA对空间中的所有对象在此出生,该区的名字因此而得名。也即是说当你的JAVA程序运行时,需要创建新的对象,JVM将在该区为你创建一个指定的对象供程序使用。创建对象的依据即是永久存储区中的元数据。
              幸存者0区,幸存者1区:当伊甸园的控件用完时,程序又需要创建对象;此时JVM的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象进行销毁工作。同时将伊甸园中的还有其他对象引用的对象移动到幸存者0区。如果0区域也没有空间了就会向1区移动。
              养老区(Tenure (Old) generation space):用于保存从新生区筛选出来的JAVA对象。

GC原理:
          首先当启动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)”。

GC特性:
    System.gc( ) 并不一定触发垃圾回收,只是告诉服务器现在应该进行垃圾回收。
    JVM的垃圾回收是一种自动的回收机制。
    垃圾回收会对系统造成一定的压力,因为要遍历所有的内存区域。

内存溢出的三种情况:
     Java heap space溢出:JAVA本身的内存不足,通过修改-Xms和-Xmx来解决。
    Java PermGen space溢出:JAVA的Permgenant区域的内存不足,修改-XX:PermSize和-XX:MaxPermSize来解决。
    Java Native space溢出:JAVA线程内存不够、JNI调用内存不够;是属于JAVA本身以外的内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值