MemoryAnalyzer介绍及使用

Eclipse Memory Analyzer  Tools(MAT)是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减少内存占用。

使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对象的 Retained Size,查看是谁在阻止垃圾回收,并自动生成一个 Leak Suspect(内存泄…

IntelliJ Idea 复制粘贴的问题

分析

尝试从外部复制内容向Idea工作空间内粘贴文件时,有一定的几率会发生复制粘贴失败的问题:复制了新的内容,粘贴的却还是早些时候复制的旧的内容。

我使用的IDEA是最新版(2016.1.3),操作系统是Win7/Win10。

这个问题是因为Idea的历史粘贴板已经满了,无法向历史粘贴板中写入新的内容导致的。这应该是Idea的一个BUG。

解决思路有两个:

  • 增加历史粘
…

Java实现邮件发送过程中遇到的几个问题

发送邮件的代码是我从以前的一个应用上直接拷贝过来的。以前使用的腾讯的邮件服务,程序执行起来没有任何问题。后来修改为微软office365邮件服务后,却遇到了两个问题。

问题一,tls加密设置

异常信息如下:

…

关于Heap Dump

Heap Dump是什么?

Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。

我们可以通过Heap Dump做哪些

…

Lambda表达式2 – 语法说明

语法说明

一个lambda表达式由如下几个部分组成:

1. 在圆括号中以逗号分隔的形参列表。在CheckPerson.test方法中包含一个参数p,代表了一个Person类的实例。注意:lambda表达式中的参数的类型是可以省略的;此外,如果只有一个参数的话连括号也是可以省略的。比如上一节曾提到的代码:

…

Lambda表达式1 – 一个简单用例

我对java中lambda表达式的看法是相当纠结的:

一个我这么想:lambda表达式降低了java程序的阅读体验。java程序一直不以表现力出众,正相反使Java流行的一个因素正是它的安全和保守——即使是初学者只要注意些也能写出健壮且容易维护的代码来。lambda表达式对开发人员的要求相对来说高了一层,因此也增加了一些维护难度。

另一个我这么想:作为一个码代码…

使用Memory Analyzer分析Java集合

上一节里说了如何发现JVM内存中的空集合对象,这对减少JVM内存的浪费有些帮助。这一节要说的内容更有意思一些,可以让我们更深入地了解Java集合的使用。

先说明一点:这里仅仅是通过内存分析来得到一些结论。分析出来的结论通过JDK源码也许可以很轻易地得出,但是请关注分析过程和分析思路,毕竟源码不常有。

在上一节分析空集合对象的过程中难免会产生一些疑问:每个集合的长…

找出被空集合占用的内存

在平时的内存分析中发现有很大一部分集合对象在实例化后就从没有被使用过。集合类是我们平时使用最多的一种类,部分集合类在实例化时就会得到一部分空间(比如ArrayList、HashMap等)。这些空的集合实例虽然价值不大,但也有可能会浪费很多的内存空间。接下来演示一下如何去发现并解决这个问题。

案例

看一下下面这个MyValueStorage类的代码,在这个类里定义…

使用Memory Analyzer分析内存泄漏

概述

检测内存泄漏通常采用的方式是检查内存中某些对象的数量是否存在单调递增的现象。这可以通过“在线”实时监控分析的方式或者比较不同时段的内存快照来实现。然而实时监控的方案通常并不可行,尤其是在生产环境上,得考虑到因此导致的性能消耗;并且内存泄漏的产生通常也是非常偶然的,只有在某些特定条件下才会发生。这篇文章将介绍一些使用MAT发现内存泄漏的技巧。

准备工作

首先一…

使用MAT找出重复引用的jar或类

这篇文章将介绍一种处理应用中的类(或库)的重复引用以及版本冲突问题的解决方案。这在应用集成阶段非常有效。适用于如下案例:

  • NoClassDefFoundError:在classpath中有两个不同版本的同名类;
  • 集成大型产品:检查同一个版本的jar包是否被重复引入,减少内存占用。

准备工作

安装Memory Analyzer Tools,在eclipse上搜mat插件、…