Java小知识(十五)

堆内存设置:

原理

    JVM堆内存分为2块:Permanent Space和Heap Space。

Permanent即持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的JavaJava对象关系不大。

Heap={Old + NEW ={ Eden,from,to} },Old即年老代(Old Generation),NEW即年轻代(Young Generation)。年老代和年轻代的划分对垃圾收集影响较大。

年轻代:

       所有新生代的对象首先都是放在年轻代。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代一般分三个区,一个Eden区,一两个Survivor区(from 和 to)。

      大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当一个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当另一个Survivor区也满了的时候,从前一个Survivor区复制过来的并且此时还存活的对象,将可能被复制到年老代。

      2个Survivor区是对称的,没有先后干洗,所以同一个Survivor区中可能同时存在从Eden区复制过来的对象,和从另一个Survivor区复制过来的对象;而复制到年老去的只有从另一个Survivor区过来的对象。而且,因为需要交换的原因,Survivor区至少有一个是空的。特殊的情况下,根据程序需要,Survivor区是可以配置为多个的(多于2个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

针对年轻代的垃圾回收即Young GC。

年老代:

      在年轻代中经理了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

针对年老代的垃圾回收即Full GC。

持久代:

      用于存放静态类型数据,如Java Class,Method等。持久代对垃圾回收没有显著影响。但是有些应用可能动态生成或调用一些Class,例如Hibernate CGLib等,在这个时候往往需要设置一个比较大的持久代空间来存放这些运行过程中动态增加的类型。所以当一组对象生成时,内存申请过程如下:

①JVM会试图为相关Java对象在年轻代的Eden区中初始化一块内存区域。当Eden区空间足够时,内存申请结束。否则执行下一步。

②JVM试图释放在Eden区中所有不活跃的对象(Young GC)。释放后若Eden空间仍然不足以放入新对象,JVM则试图将部分Eden区中活跃对象放入Survivor区。

③Survivor区被用来作为Eden区及年老代的中间交换区域。当年老代空间足够时,Survivor区中存活了一定次数的对象会被移到年老代。

④当年老代空间不够时,JVM会在年老代进行完全的垃圾回收(Full GC)。

⑤Full GC后,若Survivor区及年老区仍然无法存放从Eden区为新生成的对象申请内存,及出现“Out of Memory”。

 

OOM(“Out of Memory”)异常一般主要有如下2个原因:

①年老代溢出,表现为:java.lang.OutOfMemoryError:Javaheapspace 这是最常见的情况,产生的原因可能是:设置的内存参数X模型过小或程序内存泄露及使用不当问题。

例如循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存。还有的时候虽然不会报内存溢出,却会使系统不间断的垃圾回收,也无法处理其他请求。这种情况下除了检查程序、打印堆内存等方法排查,还可以借助一些内存分析工具,比如MAT就很不错。

②持久代溢出,表现为:java.lang.OutOfMemoryError:PermGenspace 通常由于持久代设置过小,动态加载了大量Java类而导致溢出,解决办法唯有将参数-XX:MaxPermSize调大(一般256m能满足绝大多数应用程序需求)。将部分Java类放到容器共享区(例如Tomcat share lib)去加载的办法也是一个思路,但前提是容器里部署了多个应用,且这些应用有大量的共享类库。

 

Applet显示相关的方法主要有3个:

1.paint(Graphicsg)方法,具体执行Applet的绘制。

2.update(Graphicsg)()方法,主要用于更新Applet的显示。

3.repaint(0方法,主要用于Applet的重新显示,它调用update()方法实现对Applet的更新。

 

Java反射机制主要提供了以下功能:在运行时盘算任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值