您的位置:首页 > 其它

一只刚刚迈进JVM领域的脚印

2016-05-28 16:26 471 查看
     其实在这之前我早就已经受够了jvm包管一切的特点了,凭什么啊,凭什么我自己不能自己看到自己的内存使用情况,凭什么我不能管理啊。尽管JVM说它帮我们管理内存是为了我们好,但是我却不领情,因为我喜欢所有的都掌控在自己手中,及时我不想去控制我也得知道的清清楚楚。如果不是这样的话,那么出问题的时候,我就像一个傻子一样,我是非常讨厌这种感觉的。鉴于之前不知道怎么在eclipse上设置jvm的大小,也没有这个概念,所以之前一直都是在控制台上设置的,但是控制台上设置的方法,真的好麻烦,虽然程序员不应该怕麻烦,但是我是一名偷懒的程序员,并且以此为荣。所以呢对于JVM的了解也一直没有怎么深入的去了解,所以对JVM的了解也是七窍通了六窍,还是一窍不通

但是我一直都不死心,我肯定要把JVM翻个底朝天,不然我是不会死心的。所以现在又来整这东西了,下面说说如何使用exlipse来调试JVM

     其实很简单,但是自己一直都没有尝试过而已

     首先写一段程序,但是这不是重点:

    public class JVMTest {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        List<OOMTest> list=new ArrayList<OOMTest>();

        while(true){

            list.add(new OOMTest());

        }

    }

    static class OOMTest{

        

    }

}

    上面的程序只是一直的分配内存,但是结果会是怎么样呢?先说说我没有设置jvm的时候,我的内存是16g的,运行程序前内存使用率为30%,然后程序运行之后就一直飙升到50%左右,然后就不动了,接着就爆出了内存溢出的情况了,这样说来64位的window系统分配给线程的内存还是有限的吗?这个是个问题

   然后,我就设定jvm启动的内存大小了,右击程序,选择 run as -->run configurations

   设定如下图:

 


 -verbose:gc -Xms20M -Xmx30M -Xmn10M  -XX:+PrintGCDetails  -XX:SurvivorRatio=8

上面的 -verbose:gc表示输出虚拟机中GC的详细情况,-Xms20M -Xmx30M表示设置堆的最大内存和最小内存,-XX:+PrintGCDetails表示让虚拟机在出现内存溢出的异常时dump出当前内存堆转储快照以便进行分析,-XX:SurvivorRatio=8表示设置eden取和survior区的大小

输出结果如下:

[GC [PSYoungGen: 7771K->1001K(9216K)] 7771K->5404K(19456K), 0.0083666 secs] [Times: user=0.06 sys=0.00, real=0.01 secs]

[GC [PSYoungGen: 9193K->1024K(9216K)] 13596K->11272K(20480K), 0.0111387 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

[Full GC [PSYoungGen: 1024K->0K(9216K)] [ParOldGen: 10248K->11210K(20480K)] 11272K->11210K(29696K) [PSPermGen: 2575K->2574K(21504K)], 0.2763297 secs] [Times: user=0.61 sys=0.00, real=0.28 secs]

[Full GC [PSYoungGen: 8192K->0K(9216K)] [ParOldGen: 15958K->18790K(20480K)] 24150K->18790K(29696K) [PSPermGen: 2574K->2574K(21504K)], 0.2158919 secs] [Times: user=0.63 sys=0.00, real=0.21 secs]

[Full GC [PSYoungGen: 5667K->4088K(9216K)] [ParOldGen: 18790K->20325K(20480K)] 24458K->24413K(29696K) [PSPermGen: 2574K->2574K(21504K)], 0.4083778 secs] [Times: user=1.20 sys=0.00, real=0.41 secs]

[Full GC [PSYoungGen: 4088K->4088K(9216K)] [ParOldGen: 20325K->20314K(20480K)] 24413K->24402K(29696K) [PSPermGen: 2574K->2574K(21504K)], 0.3453737 secs] [Times: user=1.09 sys=0.02, real=0.35 secs]

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    at java.util.Arrays.copyOf(Arrays.java:2245)

    at java.util.Arrays.copyOf(Arrays.java:2219)

    at java.util.ArrayList.grow(ArrayList.java:242)

    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)

    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)

    at java.util.ArrayList.add(ArrayList.java:440)

    at JVMTest.main(JVMTest.java:11)

Heap

 PSYoungGen      total 9216K, used 4381K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)

  eden space 8192K, 53% used [0x00000000ff600000,0x00000000ffa477f8,0x00000000ffe00000)

  from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)

  to   space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)

 ParOldGen       total 20480K, used 20314K [0x00000000fe200000, 0x00000000ff600000, 0x00000000ff600000)

  object space 20480K, 99% used [0x00000000fe200000,0x00000000ff5d6818,0x00000000ff600000)

 PSPermGen       total 21504K, used 2605K [0x00000000f9000000, 0x00000000fa500000, 0x00000000fe200000)

  object space 21504K, 12% used [0x00000000f9000000,0x00000000f928b6c0,0x00000000fa500000)

是不是感觉像音符一样美妙,虽然看不懂。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm