jvm值得学习,目前周志明先生-大佬的《深入理解jvm》第三版 jdk1.8版本的 已出,这本书强烈推荐。
1.jdk, jre和jvm的关系
oracle官方jdk1.8的描述文档截图
可见
jdk(开发及运行环境)= jre+其他
jre(运行环境)= java SE Api + jvm +其他
所以jvm是jdk中jre的一部分
目前要学习的部分就是 java virtual machine (jvm).
2.环境准备:
1)下载安装或使用解压版本jdk1.8,配置环境变量。
2)下载安装eclipse.
3)下载插件memory Analyzer 内存分析工具简称MAT
当然也可以使用idea及Jprofiler
3.代码
1)在eclipse中添加两个类:
public class Demo1 {
private String name;
private int age;
private String grade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
}
以及主类(人为制造堆内存溢出的类)
package com.kdeng.practise.jvm.day01;
import java.util.ArrayList;
import java.util.List;
/**
* Hello world!
*
*/
public class TestJvm01
{
public static void main( String[] args )
{
List<Demo1> a = new ArrayList<>();
while(true) {//无限添加
a.add(new Demo1());
}
}
}
直接运行上面的代码会直接报内存溢出错误。
4.设置与分析
为了进一步分析,需要如下设置:
1)点击对应项目右键run as run configurations ,
2)点击参数 agruments ,设置如下参数
这些参数的含义:可以参照官方文档
此处是: 当发生堆内存错误时生成快照文件,初始化堆的大小为20m,最大不超过20m.
运行:果然报错,
多了红色方框的信息,是上面设置了生成快照的参数,
找到项目对应文件的快照,(直接右键项目properties->Resource->看见右侧地址,直接点小箭头)
找到memory analyzer的启动目录,启动,然后点击file->找到快照文件 后缀名为hprof的文件,导入。
深蓝色表示出问题的部分。
点击小红框部分切换
发现占用20M内存中高达97%的原因是:某个线程创建了大量的Demo1类,找到问题所在。
红框从左到右:
Shallow size就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。 Retained size是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。
最后一个是所占百分比。
详细可见:
https://my.oschina.net/freelili/blog/1558406
初步体验到此结束,接着开始正式学习。