java内存那点事

我主要针对的是sum jdk1.5 因为我经常用

一、首先说sun的jdk 内存概述

java的内存分为

堆区 是用我程序使用的区老外起的名字是heap space

非堆区 也就是永久保留区 老外起的名字是PermGen space 全称是 Permanent Generation space


堆栈区 java GC来处理垃圾回收的,垃圾回收包括 young gc,full gc

这个区又被划分了四个区Eden space,Survivor0 space,Survivor1 space,Old space

我估计是young gc后会对Eden,Survivor0,Survivor1做垃圾回收 然后将Eden的幸存者移到Survivor0或 Survivor1,而一次full gc会对整个heap 做一次垃圾回收 然后将Eden ,Survivor1,Survivor1的幸存者移到Old 中


非堆区 一般是不做GC垃圾回收的 存放了一些 class 相关的东西 ( 所以我觉得 java的类第一次运行比后面几次慢)

所以当有一大堆类要加载的时候那他会 抛出臭名昭著的java.lang.OutOfMemoryError: PermGen space

而有趣的事 spring Hibernate都用的了cglib做方法的拦截 cglib 又用到了asm 。asm是webobject出的一个在运行过程中动态生成class字节码的工具 cglib 通过asm 在内存中生成一个class继承你原有的class然后覆盖需要拦截的方法

把拦截内容写入覆盖的方法中在调用原有方法。这样你看着好像在用自己的类可用的是cglib 动态生成的类这样完成了拦截

可这个样 需要拦截的类比较多就会填满PermGen space而出现java.lang.OutOfMemoryError: PermGen space




二、然后是设置jdk的内存


-Xms起始heap内存m

-Xmx最大heap内存m

-XX:PermSize=起始Perm内存M

-XX:MaxPermSize=最大Perm内存M


注:bea jrockit参数PermSize和MaxPermSize 参数是不起作用的因为他没有PermGen space


那sun jdk1.5最大能设置多少内存哪?我们测试一下

---------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java -XX:MaxPermSize=1445M -version

java version "1.5.0_04"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)

Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode)


---------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java -XX:MaxPermSize=1446M -version

Error occurred during initialization of VM

Could not reserve enough space for object heap

Could not create the Java virtual machine.


---------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java -Xmx1444M -version

java version "1.5.0_04"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)

Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode)

-----------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java -Xmx1445M -version

Error occurred during initialization of VM

Could not reserve enough space for object heap

Could not create the Java virtual machine.

-------------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java -Xmx1444M -XX:MaxPermSize=65M -version

java version "1.5.0_04"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)

Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode)


------------------------


C:\Program Files\Java\jdk1.5.0_04\bin>java -Xmx1444M -XX:MaxPermSize=66M -version

Error occurred during initialization of VM

Could not reserve enough space for object heap

Could not create the Java virtual machine.

-----------------------


由此可见 jdk1.5 heap space +PermGen space最大不能超过1509M 而 heap space最大不能超过1444M, Gen space最大不能超过1445M

当然这个只是sun1.5的jdk。还有这只是测试的值 实际应用中我们不会将内存设置为这么大因为这是极限值。 内存不是设置的越大越好的。GC的效率并不是看次数而是总时间。若果你设置的很大内存 GC的次数是少了 可每次的时间会变长,打个不不恰当的比喻 你在一个小区里找人和你在一个城市里找人哪个更快?所以要适可而止


三、最后 我们如何监控sun1.5的jdk内存使用哪?


jstat 要介绍下这个命令。

这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息

具体参数如下:

-class:统计class loader行为信息

-compile:统计编译行为信息

-gc:统计jdk gc时heap信息

-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况

-gccause:统计gc的情况,(同-gcutil)和引起gc的事件

-gcnew:统计gc时,新生代的情况

-gcnewcapacity:统计gc时,新生代heap容量

-gcold:统计gc时,老年区的情况

-gcoldcapacity:统计gc时,老年区heap容量

-gcpermcapacity:统计gc时,permanent区heap容量

-gcutil:统计gc时,heap情况

-printcompilation:不知道干什么的,一直没用过。


例如:


C:\Program Files\Java\jdk1.5.0_04\bin>jstat -gcutil 2748 1000 1000

S0 S1 E O P YGC YGCT FGC FGCT GCT


0.00 25.66 88.70 71.05 80.54 423 2.325 2 1.578 3.904

24.82 0.00 18.71 71.05 80.54 424 2.329 2 1.578 3.907

24.82 0.00 34.89 71.05 80.54 424 2.329 2 1.578 3.907

24.82 0.00 72.83 71.05 80.54 424 2.329 2 1.578 3.907

24.82 0.00 90.11 71.05 80.54 424 2.329 2 1.578 3.907

0.00 100.00 9.48 71.95 80.54 425 2.335 2 1.578 3.914

0.00 100.00 27.06 71.95 80.54 425 2.335 2 1.578 3.914

0.00 100.00 47.96 71.95 80.54 425 2.335 2 1.578 3.914

22.69 0.00 11.48 72.75 80.54 426 2.340 2 1.578 3.919

22.69 0.00 11.48 72.75 80.54 426 2.340 2 1.578 3.919


参数含义:

S0:Heap上的 Survivor space 0 段已使用空间的百分比

S1:Heap上的 Survivor space 1 段已使用空间的百分比

E: Heap上的 Eden space 段已使用空间的百分比

O: Heap上的 Old space 段已使用空间的百分比

P: Perm space 已使用空间的百分比

YGC:从程序启动到采样时发生Young GC的次数

YGCT:Young GC所用的时间(单位秒)

FGC:从程序启动到采样时发生Full GC的次数

FGCT:Full GC所用的时间(单位秒)

GCT:用于垃圾回收的总时间(单位秒)


(个人理解,仅供拍砖)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值