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) 收藏 举报
浙公网安备 33010602011771号