Java技术专题之JVM你的内存泄露了吗?
一、从一个例子开始
关于JVM的内存泄露,让我们从下面一个例子开始吧,大家来判断一下如果按照下面这种分配方式,会不会出现内存泄露呢?
import java.util.List;
import java.util.Vector; public class MemoryTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Vector vobj = new Vector(10);
for(int i=0;i<100;i++)
{
Object obj = new Object();
vobj.add(obj);
//注意此处Java如何清除内存
obj = null;
//GC会清除这一块内存吗?
}
System.out.print("end");
}
}
以上程序不会有任何异常提示,是不是就代表没有内存泄露了呢。如果此时i最大值设为:100000000会怎么样呢?不妨自己跑一下程序,下面是我实测的结果,与具体JVM参数设置有关,各人的极限值可能不同。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Vector.ensureCapacityHelper(Unknown Source)
at java.util.Vector.add(Unknown Source)
at MemoryTest.main(MemoryTest.java:14)
出现了内存泄露了吧。但是这种无限放大的方式,只能是事后发现,该出的事情已经出了,应经影响到了生产应用。所以事后检测于事无补。我们还需要另想办法。
二、如何判断是否出现了内存泄露
JVM虚拟机内存的结构上一篇博客已经做了说明,只要Java堆中尚有可用空间,即使泄露也不会出现问题,除非内存空间已经超出JVM内存设置。如果没有设置内存限制,并且内存空间很大的情况下是不会出现错误提示的。这就给我带来了困扰,难道非要等内存不足,发生异常才能发现内存泄露吗?非也。
(1)代码走审:技术要求较高,纯经验法,遗漏可能性较大,可操作性较强,但一般要求互相审查。
(2)工具一 输出JDK的GC日志数据:
设置:JAVA_OPTS增加以下参数打开jdk的GC输出日志:
-verbose:gc -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
(3)jmap获得运行中的JVM内存快照:
jmap -dump:format=b,file=jmap.hprof <PID>
(4)Eclipse Memory Analyzer:专业工具就是专业; 需要导入jmap.hprof文件,链接地址附上,详细的就不多说了,免得有做广告之嫌。
Java技术专题之JVM你的内存泄露了吗?的更多相关文章
- Java技术专题之JVM逻辑内存回收机制研究图解版
一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...
- JAVA技术专题综述之线程篇(1)
本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...
- 解Bug之路-记一次JVM堆外内存泄露Bug的查找
解Bug之路-记一次JVM堆外内存泄露Bug的查找 前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题.此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤 ...
- JVM笔记-Java技术体系与JVM概述
1. 简述 Java 不仅仅是一门编程语言,还是一个由一系列计算机软件和规范组成的技术体系. Java 的广告词为 "一次编写,到处运行",之所以能够做到"跨平台&quo ...
- java程序——CPU过高100%及内存泄露排查
CPU过高 这类问题可以使用 top 命令观察一些,CPU 是不是都被 Java 程序占用了.比如下面这个截图: 服务器的 CPU 大多都被 Java 占用了.这正是我们之前生产上 CPU 过高的一个 ...
- Java有了GC同样会出现内存泄露问题
1.静态集合类像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着. Static ...
- 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路
序列化和反序列化 序列化就是指把对象转换为字节码: 对象传递和保存时,保证对象的完整性和可传递性.把对象转换为有字节码,以便在网络上传输或保存在本地文件中: 反序列化就是指把字节码恢复为对象: 根据字 ...
- java后端知识点梳理——JVM
可以先看看我的深入理解java虚拟机笔记 深入理解java虚拟机笔记Chapter2 深入理解java虚拟机笔记Chapter3-垃圾收集器 深入理解java虚拟机笔记Chapter3-内存分配策略 ...
- Java 程序的内存泄露问题分析
什么是内存泄露? 广义的Memory Leak:应用占用了内存,但是不再使用(包括不能使用)该部分内存 狭义的Memory Leak:应用分配了内存,但是不能再获取该部分内存的引用(对于Java,也不 ...
随机推荐
- linux上定时运行scrapy
1 运行方式一 (proxy-ip) [root@192 ~]# cd /data/test-proxy-ip/ (proxy-ip) [root@192 test-proxy-ip]# scrapy ...
- JQuery, Silverlight 公用WCF
WCF web.config配置: <?xml version="1.0"?> <configuration> <system.web> < ...
- redis的主从复制和高可用集群
一.redis的简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.redis是一个key-value存储系 ...
- SHA1
整理于互动百科 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital ...
- ThinkPad 复刻计划 ThinkPad Time Machine
在快节奏的高科技市场中,针对性的进化 ThinkPad 的设计几乎是闻所未闻的.在汽车行业,保时捷无疑干的不错,但我不认为有任何其他的电脑公司可以顶住压力,坚持自己的初心这么久.没有任何一个竞争对手可 ...
- C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏
二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...
- UI基础:UILabel.UIFont 分类: iOS学习-UI 2015-07-01 19:38 107人阅读 评论(0) 收藏
UILabel:标签 继承自UIView ,在UIView基础上扩充了显示文本的功能.(文本框) UILabel的使用步骤 1.创建控件 UILabel *aLabel=[[UILabel alloc ...
- Vue CLI 3 配置兼容IE10
最近做了一个基于Vue的项目,需要兼容IE浏览器,目前实现了打包后可以在IE10以上运行,但是还不支持在运行时兼容IE10及以上. 安装依赖 yarn add --dev @babel/polyfil ...
- 【c++基础】ifstream的构造函数
公共成员函数: ) ifstream(); initialization () explicit ifstream (const char* filename, ios_base::openmode ...
- PHP webservice初探
背景:在最近的开发中,为了解决公司内部系统与外部系统的对接,开始接触到了webservice接口,外部公司提供接口供我们调用,已达到数据同步的目的,因此有必要普及一下web service的知识了! ...