Java虚拟机八 分析Java堆
常见的内存溢出的原因及其解决思路
1.堆溢出:
由于大量的对象都直接分配在堆上,因此它最有可能发生溢出。因为大量对象占据了堆空间,而这些对象都持有强引用,导致无法回收,当对象大小之和大于堆空间时就会发生溢出。
为了解决堆溢出错误,一方面可以使用-Xmx参数指定一个更大的堆空间,另一方面,由于堆空间不可能无限增长,通过MAT或者Visual VM等工具,分析找到大量占用堆空间的对象,并在应用程序上作出合理的优化也是十分必要的。
2.直接内存溢出
在Java的NIO(New IO)中,直接内存的使用,也就是通过Java代码,获得一块堆外的内存空间,这块空间是直接向操作系统申请的。直接内存的申请速度一般要比堆内存慢,但是其访问速度要快于堆内存。因此对于那些可复用的,并且会被经常访问的空间,使用直接内存可以提高系统性能。但是由于直接内存没有被Java虚拟机完全托管,若使用不当,也会发生内存溢出而宕机。
3.过多线程导致OOM
由于每一个线程的开启都要占用系统内存,因此当线程数量太多时,也有可能导致OOM。由于线程的栈空间也是在堆外分配的,因此和直接内存非常相似,如果想让系统支持更多的线程,应该使用一个较小的堆空间。
4. 永久区溢出
永久区(Perm)是存放类元数据的区域。如果一个系统定了太多的类型,那么永久区是有可能溢出的。在JDK1.8中,永久区被一块成为元数据的区域替代,但是他们的功能是类似的,都是为了保存类的元信息。
一般来说,要解决永久区溢出的问题,可以从以下几个方面考虑;
- 增加MaxPermSize的值
- 减少系统需要的类的数量
- 使用ClassLoader合理的装载各个类,并定期进行回收。
5.GC效率低下引起的OOM
GC是内存回收的关键,如果GC效率低下,那么系统的性能会受到严重的影响。如果系统的堆空间太小,那么GC所占的时间就会较多,并且回收所释放的内存就会较少。根据GC占用的系统时间,以及释放的内存的大小,虚拟机会评估GC的效率,一旦虚拟机任伟GC的效率过低,就有可能抛出OOM异常: GC overhead limit exceeded.
Java虚拟机八 分析Java堆的更多相关文章
- 实战Java虚拟机之中的一个“堆溢出处理”
从今天開始.我会发5个关于java虚拟机的小系列: 实战Java虚拟机之中的一个"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之 ...
- 【java虚拟机序列】java中的垃圾回收与内存分配策略
在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...
- 转 Java虚拟机5:Java垃圾回收(GC)机制详解
转 Java虚拟机5:Java垃圾回收(GC)机制详解 Java虚拟机5:Java垃圾回收(GC)机制详解 哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无 ...
- Java虚拟机如何运行Java字节码
一.Java的class文件的内容 1.首先编写一个简单的代码 public class StringDemo { public static void main(String[] args) { S ...
- <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...
- java虚拟机学习-触摸java常量池(13-1)
java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深 ...
- Java虚拟机2:Java内存区域
1.几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念. 1.计算机存储单位 从小到大依次为位Bit.字节Byte.千字节KB.兆M.千兆GB.TB, ...
- 《深入理解 Java 虚拟机》学习 -- Java 内存模型
<深入理解 Java 虚拟机>学习 -- Java 内存模型 1. 区别 这里要和 JVM 内存模型区分开来: JVM 内存模型是指 JVM 内存分区 Java 内存模型(JMM)是指一种 ...
- 【Java虚拟机6】Java内存模型(Java篇)
什么是Java内存模型 <Java虚拟机规范>中曾试图定义一种"Java内存模型"(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异, ...
随机推荐
- Bat注释符号
打开命令显示:echo on关闭命令显示:echo off, @ echo off, (加@表示连echo off都不显示,不然会显示出echo off的命令) rem : 注释, 表示不执行rem ...
- JavaBridge
有的时候我们需要在PHP里调用JAVA平台封装好的jar包里的class类和方法 一般的做法是采用php-java-bridge做桥接 1.实现原理: 先打开java的一个监听端口,php调用java ...
- mysql5.7 启动报发生系统错误2
1. http://dev.mysql.com/downloads/mysql/ 下载mysql5.7 zip包 2. 下载好后解压文件,解压的内容如图,您可以把内容解压到想要的位置 ...
- ios学习之UIWebView网页视图调整
//先来一个可行的小Demo程序:结合searchBar的google搜索 #import <UIKit/UIKit.h> @interface ViewController : UIVi ...
- ios开发之 -- NSData 和 NSString , UIImage 等之间的互转
//NSData转换为UIImage NSData *imageData = [NSData dataWithContentsOfFile: imagePath]; UIImage *image = ...
- Python中的yield和Generators(生成器)
本文目的 解释yield关键字到底是什么,为什么它是有用的,以及如何来使用它. 协程与子例程 我们调用一个普通的Python函数时,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函 ...
- Redis 操作哈希数据
通常我们将一些结构化的信息打包成哈希映射表,结构如下,key/value 键值对模式不变,但 value 是一个键值对 name: "Tom" age: ...... > h ...
- 如何构建日均千万PV Web站点(二) 之~缓存为王~
随着网站业务的不断发展,用户的规模越来越大:介于中国无比蹩脚复杂的网路环境:南电信:北联通:中间竟然只用一条链路进行互联通信!有研究表明,网站访问延迟和用户流失率正相关,网站访问速度越慢,用户越容易失 ...
- 开启mysql远程连接访问权限的几种方法
1.改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...
- Stratix内嵌存储器测试报告
Stratix和Stratix GX系列器件内嵌TriMatrix存储块包括512-bit M512块.4-Kbit M4K块及512-Kbit M-RAM块.TriMatrix存储结构可对 ...