当前位置: 首页 > 图灵资讯 > 技术篇> 【图灵干货】Jvm性能如何调优

【图灵干货】Jvm性能如何调优

来源:图灵教育
时间:2021-12-14 11:41:14

  如何优化Java基本JVM性能?有什么方法进行优化?查看内存释放,集合类检查,目标树,查看堆空间大小分配(年轻的,年老的,)持久性代发)提供即时垃圾回收功能,垃圾监测(监测(长期监测再循环))查看堆内类别,目标信息查看:数量,型别等等,对象参考可见。

<a href=https://www.tulingxueyuan.cn/tags-Java%E5%9F%BA%E7%A1%80-0.html target=_blank class=infotextkey>java基础</a> Jvm性能如何调优

  查看存储器释放,集合类检查,目标树。

  显示堆空间大小的分布情况(年轻的、老年的、持久的代分配)

  可以立即进行垃圾收集。

  废物监测(长期监测再循环)

  浏览堆内类,查看对象信息:数量,类型等。

  查看对象参考情况。

  通过查看堆信息的功能,我们通常能够顺利地解决下列问题:

  --年轻代人口规模划分是否合理。

  --内存泄漏。

  ——设置垃圾收集算法是否合理。

  线程化信息监视:系统线程数。

  线程态监视:每个线程都处于何种状态。

  Dump线程细节:查看线程的内部运行。

  死锁检验

  检查内存泄露。

  记忆体泄露是比较常见的问题,并且解决方法比较一般,在这里可以着重介绍,而线程、热点方面的问题就是具体问题具体分析了。

  通常可将内存泄漏理解为系统资源(所有方面的资源、堆、栈、线程等等)由于不正确地使用而导致使用完的资源无法回收(或不回收),从而导致无法完成新的资源分配请求,造成系统错误。

  存储器泄露对系统的危害是很大的,因为它会直接导致系统崩溃。

  内存泄漏与系统负载之间存在着差别,尽管最终产生的结果是相同的。存储器泄漏是指已耗尽的资源未回收导致错误,而系统过载则是系统确实没有足够的资源可分配(其他资源正在使用)

  解决:

  此方法解决起来也比较简单,一般是根据垃圾回收前后的情况进行对比,同时根据对象引用(共同的集合对象引用)分析,泄漏点基本上可以找出。一个持久化的代名词。

  例外情况:java.lang.OutOfMemoryError:PermGenspace。

  说明:

  Perm的空间被占用了。未能为新class分配存储空间时引发的异常。这一异常以前不存在,但如今Java反射的大量出现使得这种异常更加普遍。其主要原因是不断地装入动态反射的类,并最终造成Perm区占去。

  更为糟糕的是,尽管不同的classLoader虽然使用同样的类,但还是会装载它,这等同于同一事物,如果你有N个classLoader,它就会装载N次。所以,在某些情况下,这个问题基本上是没有答案的。自然,几乎没有多少classLoader和大量反射类存在。

  解决:

  1.-XX:MaxPermSize=16m。

  2.更换JDK。例如JRocket。栈溢流。

  例外情况:java.lang.StackOverflowError。

  这个就不多说了,一般是指递归没有返回,或者循环调用所致。

  线程已满。

  例外情况:错误:启动:启动。

  解释:在java中,线程的空间大小受到限制。在JDK5.0之后,该值为1M。此线程相关的数据保存在该线程中。但上面的异常是在线程空间满了之后发生的。

  处理:增大线程栈大小。-Xss2m。但是这种配置并不能解决根本问题,而是查看代码部分是否有导致泄漏的部分。

  系统内存已满。

  例外情况:java.lang.OutOfMemoryError:unabletocreatenewnativethread。

  说明:

  出现此异常是因为操作系统没有足够的资源来生成此线程。当系统创建线程时,除了Java堆中的内存分配之外,操作系统本身还需要分配资源以创建线程。

  所以,当线程的数量较大时,堆中也许还有空间,但操作系统无法分配资源,这就会发生异常。为Java虚拟机分配的内存越多,系统所剩的资源就越少,因此,当系统内存固定时,分配给Java虚拟机的内存越多,那么系统总能生成的线程就越少,这两者成反比关系。与此同时,通过修改-Xss,可以减少分配给各个线程的空间,或者增加系统产生的总数量。

  解决:

  1.重新设计系统,减少线程数。

  2.如果无法减少线程数目,则使用-Xss减小单个线程大小。这样就可以生成更多线程