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,也不 ...
随机推荐
- json 与字符串相互转换,
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 配置pycharm 一键安装 requirements.txt,一键生成requirements.txt
如上配置 打开项目,在requirements.txt上点右键,就可以安装了. 安装效果如下: 可以看出运行的命令是 C:\Python\Python36/scripts/pip install ...
- js 禁止剪切、复制、粘贴的文本框代码
有的网站中不允许用户复制.粘贴.剪切文本框中的内容的,是怎么实现的呢?看看下面的代码就知道了. <input id=”username” oncut=”return false” oncopy= ...
- 对HTML(HyperText Markup Language)的认识以及总结
一.HTML的基础结构 以上图片可以看出HTML的基础结构: 文档声明+<html>根元素(也叫顶级元素)------><html>里包括<head>元素+& ...
- 打开WORD文档出错提示
打开WORD文档出错提示: Microsoft Office Word 遇到问题需要关闭.我们对此引起的不便表示抱歉. 您正在处理的信息有可能丢失.Microsoft Office Word 可以尝试 ...
- 注解配置定时任务——@Scheduled
Java中注解@Scheduled 的注解代码如下: @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(Ret ...
- APP测试重点罗列
1.安装和卸载 应用是否可以在IOS不同系统版本或android不同系统版本上安装(有的系统版本过低,应用不能适配) 软件安装后是否可以正常运行,安装后的文件夹及文件是否可以写到指定的目录里. 安装过 ...
- 那些年,追寻JMeter的足迹,免费送……
我们测试技术部武汉团队自16年引入jmeter以来,利用jmeter做了很多事情.首先运用jmeter进行接口测试,后续实现jmeter自动化冒烟测试,顺带也实现了线上环境的巡检,节省了大量人力.j ...
- sed工具命令
sed是非交互式的编辑器.它不会修改文件,除非使用shell来重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件,并将结果发送到屏幕.具体过程如下:首先sed把当前 ...
- shell 脚本实战笔记(2)--环境变量PATH的恩怨情仇
在linux环境下, 相信大家对环境变量PATH, 多多少少有所接触, 这边讲讲PATH的在linux的前世因缘. 先讲讲一个列子 假如我们在为一个新的应用配置其PATH路径中时, 不小心忽略了原先 ...