java堆分析——工具与实践


这篇文章承接上一篇继续对堆进行分析

我们首先来了解一下Memory Analyzer(MAT),它是基于Eclipse的软件,显然用于内存分析,附下载地址 链接 ,我用的版本是是1.5.0 打开后点击 file->Acquire Heap Dump 选择要分析的堆内存后可以多种方式查看

显示堆总体信息,比如消耗最大的一些对象等

1.png


深入JVM内核(七)


这里我们将对JVM中的堆进行详细分析。

内存溢出(OOM)的原因 在JVM中,内存区间包括:堆,永久区,线程栈和直接内存 1.而内存溢出的原因是占用大量堆空间,导致直接溢出,例如:

import java.util.ArrayList;
 public class Test {
    public static void main(String args[]){
        ArrayList<byte[]> list=new ArrayList<byte[]>();
        while(true){
            list.add(new byte[1024*1024]);
        }
    }
}

抛出异常:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

解决方法:可以手动设置增大堆空间,及时释放内存

再看一个例子:


java性能监视


我们在编程中难免要对java程序进行分析改进,为此,可以利用jdk自带的工具和命令进行分析: 1.jps

  • 列出java进程,类似于ps命令
  • 参数-q可以指定jps只输出进程ID ,不输出类的短名称
  • 参数-m可以用于输出传递给Java进程(主函数)的参数
  • 参数-l可以用于输出主函数的完整路径
  • 参数-v可以显示传递给JVM的参数


深入JVM内核(六)


今天来介绍JVM中的类装载器

首先简单介绍一下class类的装载验证流程:首先加载,然后链接,链接又包含(验证 ,准备,解析),然后再进行初始化。 下面具体介绍


form中好用却不常见的 accept-charset 属性


起步

我们曾用过不同的编码来做过页面UTF-8GB2312GBk,而很多时候,又和服务端的编码不一致,如果不进行特殊处理,就会出现乱码。我们可能无法控制接收方的编码问题,这时accept-charset就能提供很好的解决方案。

解决

假如服务端使用的utf-8的编码方式.

<form method="post" action="..." accept-charset="utf-8"> 
    <!-- code... --> 
</form>

剩下的工作交给浏览器搞定了。