JVM从概述到调优图文详解,含思维脑图深度剖析!

Stella981
• 阅读 775

JVM概述

JVM 是一种用于计算机设备的规范,它是一个虚构的计算机的软件实现,简单的说,JVM 是运行 byte code 字节码程序的一个容器。

它有一个解释器组件,可以实现 JAVA 字节码和计算机操作系统之间的通信,java程序只需要在JVM 上一次编译,多出运行,因此JAVA具有跨平台性。

内存结构

  • 方法区(常量池、静态变量、构造函数、类数据)

  • 堆(对象、类实例、GC的主要区域)

    • 新生区(Minor GC 、Full GC清理无用数据)

      * 伊甸园(对象创建) * 幸存 0 区 * 幸存 1 区

    • 老年代(对象的声明周期到老年代结束)(Full GC)

    • 永久区(jdk 1.8 以后被元空间代替)(Major GC)

  • 程序计数器(记录每个运行线程的内存地址)

  • 虚拟机栈(每个方法创建都会创建一个栈,栈内的数据都是临时的)

  • 本地方法栈

  • 直接内存

    JVM从概述到调优图文详解,含思维脑图深度剖析!

堆中的 GC 回收过程

对象会在 Eden(伊甸园)分配创建,当 Eden(伊甸园)没有足够空间时将发起一次 Minor GC(垃圾清理),当 Eden 执行 Minor GC 后还不足以为对象分配空间,则大的对象直接进入老年代,可以用参数设置大对象直接进入老年代,避免频繁 Minor GC 。如果对象在 Eden 创建,发生 Minor GC 后仍然存活,且能被 Survivor 幸存去容纳,年龄加 1, 达到一定年龄进入老年代,默认为 15。发生 Mrinor GC之前先检查老年代最大可用连续空间是否大于新生代所有对象总空间,如果大于,说明 Minor GC 安全;否则会判断是否被担保失败,如果担保失败了,判断老年代最大连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则尝试 Minor GC ,否则就执行 Full GC 进行对象回收,如果 Full GC 执行完毕后,对象仍然无法被创建,则直接抛出内存溢出的异常(java.lang.OutOfMemoryError)。

如何改变对象对象进入老年代的最大值?

通过修改-XX:PretenureSizeThreshold参数来设置进入老年代的对象年龄。这样也避免在 Eden(伊甸园)区和两个 Survivor 之间发生大量的内存复制。(默认值为 15)

GC如何判断对象是否改被回收

JVM从概述到调优图文详解,含思维脑图深度剖析!

垃圾收集的算法

JVM从概述到调优图文详解,含思维脑图深度剖析!

都有那些垃圾回收器

JVM从概述到调优图文详解,含思维脑图深度剖析!

内存泄漏(不再使用的对象的内存不能被GC回收)

内存泄漏的例子:

单例模式:

不正确使用单例模式是引起内存泄漏的一个常见问题,单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量的方式)。如果单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,导致内存泄漏。所以需要注意,尽量不要在单例中持有大对象。

各种连接:

比如数据库连接、socket连接、文件流等,除非其显式的调用其close()方法将连接关闭,否则是不会自动被垃圾 回收的。

静态集合类:

我们循环申请Object对象,并将所申请的对象放入一个Vector中。如果我们仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。

如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。

Static Vector v = new Vector(10); for (int i = 0; i < 100; i++) { Object o = new Object(); v.add(o); o = null; }

事件监听器:

AWT的事件处理机制是一种委派式事件处理方式:普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。

比如常用的监听器有ActionListener、KeyListener、MouseListener、MouseMotionListener(专门处理鼠标运动事件的,比如鼠标的移动和拖动)

如果在释放对象的时候没有记得删除这些监听器,会增加内存泄露的机会。

import java.awt.*; import java.awt.event.*; public class TestButton { public static void main(String args[]) {     Frame f = new Frame("Test");     Button b = new Button("Press Me!");     b.addActionListener(new ButtonHandler()); /*注册事件监听器*/     f.setLayout(new FlowLayout()); //设置布局管理器     f.add(b);     f.setSize(200,100);     f.setVisible(true); } } //实现接口ActionListener才能做事件ActionEvent的处理者 class ButtonHandler implements ActionListener {    public void actionPerformed(ActionEvent e)   {      System.out.println("Action occurred");   } }

调优

JVM从概述到调优图文详解,含思维脑图深度剖析!

JVM 思维导图

JVM从概述到调优图文详解,含思维脑图深度剖析!

最后

这些JVM篇章已经全部整理成一套完整且体系的pdf文档,无论是思维脑图、学习笔记还是面试考点全整理好了,实际内容还有很多,就不一一展示,若你也需要这一套学习资料。

关注我的公众号:Java斗帝,回复666领取

推荐阅读

为什么阿里巴巴的程序员成长速度这么快,看完他们的内部资料我懂了

字节跳动总结的设计模式 PDF 火了,完整版开放下载

刷Github时发现了一本阿里大神的算法笔记!标星70.5K

程序员50W年薪的知识体系与成长路线。

月薪在30K以下的Java程序员,可能听不懂这个项目;

字节跳动总结的设计模式 PDF 火了,完整版开放分享

关于【暴力递归算法】你所不知道的思路

开辟鸿蒙,谁做系统,聊聊华为微内核

看完三件事❤️

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

关注公众号 『 Java斗帝 』,不定期分享原创知识。

同时可以期待后续文章ing🚀

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
灯灯灯灯 灯灯灯灯
3年前
大厂必备面试题———JVM内存结构
JVM一,基本介绍解释:java虚拟机,准确的来说是java二进制字节码的运行环境。(jvm是一套规范),用来执行class文件,保证java语言跨平台。Java虚拟机可以看作是一台虚拟的计算机,和真是的计算机一样,有着自己的指令集以及各种运行时内存。jvm就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的的机器码,确保字节码文件能在各个系统上正确的
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
小梁同学 小梁同学
3年前
从未有人把JVM原理讲的这么详细
JVM原理1.简述JVM是JavaVirtualMachine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运
Wesley13 Wesley13
3年前
Java是如何实现跨平台的
一.Java是如何实现跨平台的1.我们编写的Java源码,编译后会生成一种.class文件,称为字节码文件2.Java虚拟机JVM就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。!(https:/
Stella981 Stella981
3年前
JVM必备指南
简介Java虚拟机(JVM)是Java应用的运行环境,从一般意义上来讲,JVM是通过规范来定义的一个虚拟的计算机,被设计用来解释执行从Java源码编译而来的字节码。更通俗地说,JVM是指对这个规范的具体实现。这种实现基于严格的指令集和全面的内存模型。另外,JVM也通常被形容为对软件运行时环境的实现。通常JVM实现主要指的是HotSpot。JVM
Stella981 Stella981
3年前
JVM入门到放弃之基本概念
1\.基本概念jvm是可运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。jvm是运行在操作系统之上的,屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在jvm上运行的字节码,就可以在多种平台上不加修改地运行。Java语言的一个非常重要的特点就是与平台的无关性(
Wesley13 Wesley13
3年前
Java虚拟机(JVM)
Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译
Wesley13 Wesley13
3年前
JVM内存逻辑结构
JVM(JavaVirtualMachine),即Java虚拟机。JVM是一种用于计算机设备的规范,它是虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能实现的。因此,能在JVM中执行的并不一定是Java语言的编译后字节码,也可以是其它语言,比如Jyphon、JRuby以及Groovy等。下图为Java程序员最为关注JVM的内存模