深度理解JVM

China☆狼群 提交于 2019-11-28 03:02:04

深入理解java虚拟机

要讲的内容

  1. 了解历史
  2. 垃圾回收机制
  3. 性能监控工具
  4. 性能调优案例实战
  5. 认识类的文件结构
  6. 类加载机制
  7. 字节码执行引擎
  8. 虚拟机编译及运行时优化
  9. Java线程高级

1. 环境搭建

   安装jdk

 

 

2. 内存溢出场景模拟

public class Test01 {

public static void main(String[] args) {

//测试内存溢出

List<Demo> list = new ArrayList<Demo>();

while(true) {

list.add(new Demo());

}

//不停的创建对象会一直消耗堆内存知道内存消耗完(其实不会真的将8G的内存都消耗完)

//当达到一个上线时就会报出这个错误了,这时就会报出一个内存溢出

//OutOfMemoryError

}

}
class Demo{
}

 

可以在你的项目下找到这个快照的错误文件

 

但是我们是看不懂的所以需要到http://www.eclipse.org/mat/downloads.php去下载一个eclipseMemoryAnalyzer分析工具

如果你直接下载会非常慢所以选择一个其他的镜像这样下载就会快点

 

下载解压后打开

 

点击file->Open Heap Dump 选中产生的那个文件

 

然后生成一个

 

 

选中这个图标可以查看我们的堆内存运行情况 加载堆内存的信息

 

 

这个就代表很可能在main里面出现问题了 占得百分比高达95.6%

 

Shallow Heap 对象本分所占用的内存大小不包含它的引用对象

Retained Heap 代表当前对象的大小包括当前可直接或者间接引用对象的大小的总和。

点开那个占用堆内存最多线程

 

继续点开会发现 他创建了很多个这样的对象造成的堆内存溢出

 

Jvm 的可视化监控工具

这个工具在哪呢在我们安装的jdk

 

因为我们的jdk已经配置在我们的path路径下因此在任何路径下都可以访问的到所以在

命令行中可以输入这个值 会将这个可视化界面弹出来

 

我们可以看到这个图像化界面只有18k那么真正的代码放在了lib目录下的一个jar包里面

 

这个jps这个命令会列出来所有的java进程,我们看到有JConsole 这个进程 但是为什么没有jps这个进程呢是因为

这个命令执行完之后就结束了。

 

当我们点进去就能对这个进程进行监控

 

 

我们大概就能看到这样的窗口了

 

 

 

Java 之父

詹姆斯  高林斯

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!