一只刚刚迈进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翻个底朝天,不然我是不会死心的。所以现在又来整这东西了,下面说说如何使用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)
是不是感觉像音符一样美妙,虽然看不懂。
相关文章推荐
- Java 6 JVM参数选项大全(中文版)
- 深入解析JVM对dll文件和对类的装载过程
- JVM Tomcat性能实战(推荐)
- Java虚拟机JVM性能优化(二):编译器
- Java程序员必须知道的5个JVM命令行标志
- Java虚拟机JVM性能优化(三):垃圾收集详解
- 简单谈谈JVM、JRE和JDK的区别与联系
- 解析Java虚拟机中类的初始化及加载器的父委托机制
- JAVA中JVM的重排序详细介绍
- 浅谈Java的虚拟机结构以及虚拟机内存的优化
- JVM角度调试优化MyEclipse
- Java虚拟机JVM性能优化(一):JVM知识总结
- Android Studio 报错failed to create jvm error code -4的解决方法
- 解析Linux系统中JVM内存2GB上限的详解
- 了解Java虚拟机JVM的基本结构及JVM的内存溢出方式
- Java堆空间占满的gc日志实例
- JVM调优之Tomcat启动参数配置及详解(一)
- java动态代理模式
- Groovy Meta Object Protocol
- java类文件结构