一 性能监控
我们写的.java文件会被编译成.class文件 .class文件会被jvm的类装载器装载到jvm中。所有的数据都在运行时数据区,所以优化的大部分都在运行时数据区,然后由jvm的执行引擎负责执行 ,执行方法会在虚拟机栈中进行入栈 出栈的调用操作
java的JVM是由C来编写的(使用C语言的时候要开辟空间,释放内存等)
整个流程 垃圾回收是存在于新生代和老年代
新生代(一个是伊甸园区,一个是幸存者区)
对于新创建的对象,首先要分配内存,他首先会去新生代(伊甸园区)中看内存空间够不够,如果够的话,直接给他分配内存,如果不够,此时要进行一次GC 这次GC主要是用来清理新生代的空间 (比如说伊甸园区里面存了10个对象,有一个对象还在用,其他的9个都没用了,那么就把这9个踢出去,剩余的一个还会把他放到幸存者区中) 如果这次小的GC还是放不下,我们就认为这是一个大的对象,我们尝试把他放到老年代(老年代是新生代没办法处理的情况下才去的老年代) 如果老年代能放下,就直接分配内存,如果老年代还是放不下,那么接下来就要进行一次FullGC (把老年代和新生代中的数据都看一看,把没有用的踢出去) 如果FullGC后能放下了就可以,如果还是放不下,那么就会报GC异常 OOM FULLGC的速度非常的慢(如果MinorGC 100次才花费1s时间的话,FullGC不到10次就得花费1s时间 ) 后续优化监控的时候一定要注意 一定要避免应用经常发生FullGC的问题,
当YGC发生了以后, 伊甸园区的幸存者就会搬家到幸存者区 如果幸存者区的对象存活超过这个阈值(YGC了很多次都还活着 说明他的生命力顽强,每次YGC 他的生命力都长1岁),超过阈值以后,就把他搬到老年区,
在性能优化期间,要时刻关注这两个区的动态变化,并进行一些调优