在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
Java基础 Jvm性能如何调优?调优的方法有哪些?观察内存释放情况、集合类检查、对象树;可查看堆空间大小分配(年轻代、年老代、持久代分配)提供即时的垃圾回收功能、垃圾监控(长时间监控回收情况)查看堆内类、对象信息查看:数量、类型等,对象引用情况查看。

观察内存释放情况、集合类检查、对象树
可查看堆空间大小分配(年轻代、年老代、持久代分配)
提供即时的垃圾回收功能
垃圾监控(长时间监控回收情况)
查看堆内类、对象信息查看:数量、类型等
对象引用情况查看
有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:
--年老代年轻代大小划分是否合理
--内存泄漏
--垃圾回收算法设置是否合理
线程信息监控:系统线程数量。
线程状态监控:各个线程都处在什么样的状态下
Dump 线程详细信息:查看线程内部运行情况
死锁检查
内存泄漏检查
内存泄漏是比较常见的问题,而且解决方法也比较通用,这里可以重点说一下,而线程、热点方面的问题则是具体问题具体分析了。
内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下导致使用完毕的资源无法回收(或没有回收),从而导致新的资源分配请求无法完成,引起系统错误。
内存泄漏对系统危害比较大,因为他可以直接导致系统的崩溃。
需要区别一下,内存泄漏和系统超负荷两者是有区别的,虽然可能导致的最终结果是一样的。内存泄漏是用完的资源没有回收引起错误,而系统超负荷则是系统确实没有那么多资源可以分配了(其他的资源都在使用)
解决:
这种方式解决起来也比较容易,一般就是根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。持久代被占满
异常:java.lang.OutOfMemoryError: PermGen space
说明:
Perm 空间被占满。无法为新的 class 分配存储空间而引发的异常。这个异常以前是没有的,但是在 Java 反射大量使的今天这个异常比较常见了。主要原因就是大量动态反射生成的类不断被加载,最终导致 Perm 区被占满。
更可怕的是,不同的 classLoader 即便使用了相同的类,但是都会对其进行加载,相当于同一个东西,如果有 N 个classLoader 那么他将会被加载 N 次。因此,某些情况下,这个问题基本视为无解。当然,存在大量 classLoader 和大量反射类的情况其实也不多。
解决:
1. -XX:MaxPermSize=16m
2. 换用 JDK。比如 JRocket。堆栈溢出
异常:java.lang.StackOverflowError
说明:这个就不多说了,一般就是递归没返回,或者循环调用造成
线程堆栈满
异常:Fatal: Stack size too small
说明:java 中一个线程的空间大小是有限制的。JDK5.0 以后这个值是 1M。与这个线程相关的数据将会保存在其中。但是当线程空间满了以后,将会出现上面异常。
解决:增加线程栈大小。-Xss2m。但这个配置无法解决根本问题,还要看代码部分是否有造成泄漏的部分。
系统内存被占满
异常:java.lang.OutOfMemoryError: unable to create new native thread
说明:
这个异常是由于操作系统没有足够的资源来产生这个线程造成的。系统创建线程时,除了要在 Java 堆中分配内存外,操作系统本身也需要分配资源来创建线程。
因此,当线程数量大到一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,就出现这个异常了。分配给 Java 虚拟机的内存愈多,系统剩余的资源就越少,因此,当系统内存固定时,分配给 Java 虚拟机的内存越多,那么,系统总共能够产生的线程也就越少,两者成反比的关系。同时,可以通过修改-Xss 来减少分配给单个线程的空间,也可以增加系统总共内生产的线程数。
解决:
1. 重新设计系统减少线程数量。
2. 线程数量不能减少的情况下,通过-Xss 减小单个线程大小。以便能生产更多的线程。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
String s = "Hello";s = s + " world!"码执行变化
String s = "Hello";s = s + " world!";这两行代码执行后原始的 String 对象中的内容变了吗? 没有。因为 String 被设计成不可变(immutable)类,所以它所有对象都是不可变对象。在这段代码中,s 原先指向一个 String 对象,内容是 "Hello",然后我们对 s 进行了+操作。
11299
2019-05-24 16:23:20
Dubbox和Dubbo哪个好?为什么?
Dubbox和Dubbo哪个好?其实Dubbox和Dubbo都是很好的服务框架,简单来说,Dubbox和Dubbo本质上没有区别,Dubbox是Dubbo的升级版本。这样说来,好像Dubbox更好一些,为什么?毕竟它是升级的版本,扩展了Dubbo没有的内容。现在,我们来详细分析一下它们两者的区别吧!
14951
2019-08-06 10:12:07
MySQL学习总结之DQL查询语句
DQL查询语句又叫数据库查询语句,这是Java学习者在学习MySQL时,必须了解和掌握的知识点之一。众所周知,DQL查询语句有四种查询方式:排序查询、聚合函数、分组查询和分页查询。下面让我们一一仔细梳理这四种查询方式,有需要学习的小伙伴赶紧来看看MySQL学习总结之DQL查询语句的知识点吧!
6826
2020-02-11 23:24:05
MySQL中数据库的设计归纳讲解
谈到MySQL中数据库的设计,相信大家都知道这是实现实际业务的重要一步,因此对于Java学习者来说,深入了解和学习数据库的设计是十分有必要的。本文为大家准备了一份MySQL中数据库的设计归纳讲解,内容包括了多表之间的关系,像是分类、实现以及案例分析,还有数据库设计的范式概念和分类等等。有学习兴趣的朋友现在赶紧接着看下去吧!
5706
2020-02-13 14:53:59
Java是什么?有哪些特点?
Java是一门高级程序设计语言,从1995年被发布,到今天已经有25年的历史了。它的一大特点是跨平台,可运行于不同的操作系统,如Windows,Mac OS,以及多种UNIX版本的系统。根据Java的不同用途,可分为三个版本,分别是JavaSE、JavaEE以及JavaME。下面我们一起来深入了解一下Java这门编程语言。
6565
2020-08-07 14:53:47
