Java虚拟机 - JVM是什么?(11)


 
元空间是否有垃圾回收?
 
当然也会有垃圾回收,不可能说应用程序不用这个类了,这个类失效了,还要一直保留着这些信息,这个是绝对不合理的 。
 
元空间垃圾回收触发时机?
 
上面我们提到,元空间是存储类的元数据信息的,类加载器加载类的信息到元空间中,当这个类不在有引用时,这个类的信息就会给回收了 。
 
调试JVM 
为什么这里写的是调试,而不是优化 。
 
免得误人子弟,优化这个问题,是要根据不同的应用程序进行优化,而调试也是一个比较大的话题吧,具体的调试的参数还是要根据应用程序而定 。
 
这里分享下作者的思路:程序的定位(吞吐量等),程序的运行,位置定位 。
 

  1. 1. 系统内存泄漏时会先定位是程序的哪里的代码导致的内存泄漏,如果是NIO导致的内存泄漏,则可能是堆外内存泄漏,如果递归循环则有可能导致的是栈,先定位到位置,之后在进行参数的调试,一步一步的确认位置 。
  2. 2. 程序在运行的过程中,不断的越来越慢,而应用程序的吞吐量是比较大(这个时候我们还是要先定位到位置,如果是产生大量的对象,而这些对象的使用次数也不多,当有相当一部分在很多时候达到了进入老年代的条件,从而进入了老年代,但进入老年代后呈现就不在使用这个对象,我们都知道老年代的对象比较稳定,回收的不多,那么处理的时间长,所以对老年代的回收时间会比较久),那么可以通过调整进入老年代的条件,尽量使得对象在新生代时就给回收了,并减少GC次数 。
 
注:JDK7版本后(包含),部分JVM参数已经是拥有自动化调整的能力,如TLAB区域,除非是对系统等各个方面熟悉,否则建议不要乱调参数 。
 
可以写一个递归方法造成内存泄漏在程序启动时配置导出dump文件参数,可以使用Eclipse的MAT插件查看dump文件,或jvisualvm等工具查看 。
 
为什么要学JVM? 
学习了JVM后,我们来看个问题,为什么学JVM?
 
以下只是作者的个人观点:
 
工作:JVM是作为一名Java程序员所必备了解的过程,但随着工作的年限的增长,可能接触到的项目越来越多,而项目本身业务的复杂性可能会出现一次性加载的东西太多,导致内存出现泄漏,而我们当我们没有去了解JVM的时候,会认为是硬件问题,或许上百度查一下知道是内存泄漏,要把堆调大,但如果是堆外内存泄漏呢?那么当应用程序吞吐量大的时候,是否可以通过调整进入老年代的条件而利用好内存空间呢?
 
面试:现在很多公司在面试的时候都会问关于JVM的内容 。




推荐阅读