一直对JVM的印象就是自动GC,新生代老生代,内存泄漏、内存溢出等概念性知识,但由于JVM的书太过生涩难懂,所以也没继续读下去。最近读Java性能优化时粗略的讲解了一下比较广泛的知识,在此记录一番。

    1. 新生代与老生代的默认比例是1:2
    2. 新生代有Eden、from Survivor、to Survivor三个区域,分别占比8:1:1
    3. 两个Survivor区同时只有一个区有数据
    4. Eden、from Survivor区同时储存,一次GC后,将剩下的数据放入to Servivor
    5. 默认老生代年龄为15次GC
    6. 大内存对象直接进入老生代

    然后是逃逸指针问题。
    当多个对象持有一个对象,如果没有很好的释放,将会造成该对象没有被GC捕捉到,就发生了逃逸。可以在对象在被使用的地方进行限制,这样回收起来也方便许多,能增加JVM回收效率。

    然后是full GC问题。full GC一直是拯救一个Java进程最好的方法,但他也导致程序在full GC期间无法运作。阿里深度定制的JVM当中引入了一个区域,该区域将保护对象不被full GC进行回收,这样一来需要持久使用的数据将会一直存在,提高对象的效率。
    但full GC始终是会影响到程序的使用,所以减少full GC的发生次数也是必不可少的优化方向。

    1. 新生代内存吃紧,老生代内存空闲

    当程序并发高时,就该考虑新生代的内存扩容,特别是该程序的new使用率增高的时候。

    1. 老生代内存吃紧,新生代内存空闲

    这是什么情况呢,思考一下,如果有很多java内缓存,比如ehcache,不断的加入,就会造成缓存数据过多,那么老生代的内存将会吃紧;自然,如果程序中大内存数据也很多,也会造成这样的结局。

    两种问题解决方法都可以是增加新生代、老生代的最大内存。但治本的方法还是排查程序中可能出现大批量内存使用的地方,对其进行优化。