JVM基础知识

  实例:TestJVM.java

public class TestJVM {
    public static void main(String[] args) {
        while(true) {
            System.out.println(System.currentTimeMillis());
            try {
                Thread.sleep(1000);
            }catch(Exception e) {
            }
        }
    }
}

一.如何查看JVM的内存大小?

jps
jps -q   //只显示java的进程号
jps -l    //显示java的进程号以及执行的全称
jps -m  //显示java进程号,执行的名称,传入的参数
jps -v   //java程序启动时,java虚拟机的参数

  程序后面如果没有跟任何参数,证明使用的是java默认的参数。

  运行TestJVM

   jps命令:

 

二.没有参数的时候,默认的内存大小是多少?

  java -XX:+PrintCommandLineFlags -version

 

 

三.我们如何设置JVM的大小?

  -Xmx:Java堆空间最大值

  -Xms:Java堆空间初始化值

  -Xmn:Java堆空间年轻代大小

  -Xss:Java中每个线程的Stack(栈)大小

  手动启动应用:

   线程的存储空间存在栈上的。

 

四.如何查看java程序的gc情况

  jstat -gc 进程ID 时间 次数

  JAVA获取当前JVM系统进程ID pid

import java.lang.management.ManagementFactory;

public class PID {
    
    public static void main(String[] args) {
        //在windows上,获取到的name格式为1234@userName
        //1234为PID,@为分隔符,userName为当前用户
        String pid = ManagementFactory.getRuntimeMXBean().getName();
        int indexOf = pid.indexOf('@');
        if(indexOf > 0) {
            pid = pid.substring(0,indexOf);
        }
        System.out.println("当前JVM Process ID:" + pid);
    }
}

  jstat -gc:看Java垃圾回收的

S0C:幸存者1区大小

S1C:幸存者2区大小

S0U:幸存者1区使用的大小

S1U:幸存者2区使用的大小

EC:伊甸园区大小

EU:伊甸园区使用的大小

OC:老年代大小

OU:老年代使用的大小

MC:方法区大小

MU:方法区使用大小

CCSC:压缩类空间大小(compressed class space)

CCSU:压缩类空间已使用大小

YGC:年轻代垃圾加收次数youngGC次数

YGCT:年轻代垃圾回收消耗的时间

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收时间

GCT:垃圾回收总的耗时

1.我们要避免full gc,因为full gc时候程序会停止。

2.如果伊甸园区大小和伊甸园区使用大小几乎相等怎么办?适当增加年轻代大小。或者程序有问题(程序会频繁大量创建对象,这是需要查看程序是不是有一些对象可以复用,而不用重新创建)。

3.如果老年代大小和老年代使用的大小几乎相等时,适当减少一点年轻代的大小(年轻代:老年代=5:5 4:6 3:7 2:8),或者查看程序,是不是频繁创建大对象,看看是否有必要频繁创建大对象,要对程序进行优化。

4.如果YGC过高,代表有太多的临时变量,需要优化代码。如果实在优化不了代码,增加整个堆内存或者增加年轻代。

5.如果YGCT过大,代表有太多的临时变量,需要优化代码。如果实在优化不了代码,增加整个堆内存或者增加年轻代。

6.如果FGC过大,证明系统非常危险。需要增加老年代的比例,或者增加整个堆空间的大小。

 

五.堆空间、栈空间、常量池、方法区

1.Java virtual machine

  垃圾回收,就是堆空间的内存回收。

2.C是低级的编程语言,Java是高级语言,哪里高级?

  Java和C最大的区别,Java不需要考虑变量内存回收。

  Java的垃圾回收机制,帮助释放Java的内存空间。

  Java的垃圾回收是有周期的。Java在达到垃圾回收周期的时候进行垃圾回收,Java在内存空间不足时进行垃圾回收。

3.Java在创建对象的时候,这个对象的信息存放在哪里?堆空间,Java的堆空间分成两大块,分别是年轻代和老年代。年轻代和老年代分别进行垃圾回收。

  年轻代(young gc)、老年代(full gc)

  现代的军事武器为什么不适用java语言进行编程?为什么都用C或者其它低级语言?年轻代(young gc)在不影响java程序运行的前提下,进行垃圾回收,老年代(full gc)停止所有运行中的程序,只进行垃圾回收。军事武器如果用java语言的话,进行full gc就不运行了。

 

六.什么样的数据存入年轻代?什么数的数据存入老年代?

60分的答法:

  新创建的对象放入年轻代,创建时间很久都没有被释放的对象,放入老年代。

80分的答法:

  新创建的对象放入年轻代,创建时间很久都没有释放的对象,放入老年代,如果是大对象,直接放入老年代。比如很长的数组,长度一般超过16就认为是大数组,长度超过100肯定算大数组。

  经过多次YoungGC(多少次不一定,不同的机器都不一定,要看Young的内存够不够大)都没有被回收的,属于创建时间很久。

90分以上的答法:

  

 

  

 

 

 

 

 

 

 

 

  

posted on 2019-10-27 20:35  bijian1013  阅读(208)  评论(0)    收藏  举报

导航