`

性能优化之JVM基础

阅读更多

性能优化 | JVM基础

前言

随着我们业务越来越复杂,高并发,高性能,都是一些系统在设计之初必须考虑的问题,这就需要对我们的程序进行性能的优化,而这涉及到的方面很多,这里主要从以下两个方面进行讲解:

  • JVM的优化;
  • TOMCAT的优化;

1、JVM基本组成部分

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。

JVM的基本组成结构包括

  • 类加载子系统
  • 方法区
  • Java堆
  • 直接内存
  • Java 栈
  • 本地方法栈
  • 垃圾回收系统
  • PC寄存器
  • 执行引擎

下面分别对这个组成部分,做简单的描述:

1)类加载子系统

负责从文件系统或者网络中加载Class信息,加载的信心存放在一块称之为方法区的内存空间。

2)方法区

方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

3)Java堆

对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

4)直接内存

在JDK1.4中新加入了NIO(有的称为New I/O,有的称为Non-blocking I/O)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方法,它可以使用Native函数库直接分配队外内存,然后通过一个存储在Java对中的DirectByteBuffer对象作为这块内存的引用进行操作。

5)Java栈

每个虚拟机线程都有一个私有的栈,一个线程的JAVA栈在线程创建的时候被创建,JAVA栈中保存着局部变量、方法参数,同时还包括Java的方法调用,返回值等。

6)本地方法栈

本地方法栈和Java栈非常类似,最大不同为本地方法栈用于本地方法调用。Java虚拟机允许Java直接调用本地方法(通常使用C编写)。

7)垃圾收集系统是Java的核心,也是必不可少的,Java有一套自己进行垃圾清理的机制,开发人员无需手工清理。

8)PC寄存器

PC寄存器也是每个线程私有的空间,Java虚拟机会为每个线程创建PC寄存器,在任意时刻,一个Java线程总是在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC寄存器就会执行当前正在被执行的指令,如果是本地方法,则PC寄存器的值为undefined,寄存器存放如当前执行环节指针、程序计数器、操作栈指针、计算的变量指针等信息。

9)执行引擎

虚拟机最核心的组件就是执行引擎了,它负责执行虚拟机的字节码。一般会先编译成机器码后执行。

 

2、JVM各组成部分的联系

JVM各组成部分之间不是相互独立的,它们之间是有着紧密的联系的。

2.1、JAVA堆、JAVA栈以及方法区之间的联系

  • 堆解决的是数据存储的问题,即数据怎么放,放在哪儿。
  • 栈解决的是程序的运行问题,即程序如何执行,或者说如何处理数据。
  • 方法区则是辅助堆栈的块永久区(Perm),解决堆栈信息的产生,是先决条件。

为了说清楚它们之间的关系,这里我们举一个例子说明,见如下代码:

 

public class User {

    private String id;

    private String name;

    private String address;

    public User() {

    }

    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public static void main(String[] args) {
        User user = new User();
        user.setId("1");
        user.setName("zhangsan");
        System.out.println(user.getId());
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

这里定义了一个User类,那么这个类是如何存储和运行的呢?我们从以下几个阶段来描述:

 

1)User类及其方法实现是存储在方法区中的,包括User类信息、常量、静态变量等数据。

2)当我们执行User user = new User();的时候,User类的实例user是存储在堆中的,如果这个时候我们定义另外一个实例User user2 = new User();,那么user2这个实例也是存储在Java堆中的。

3)对于实例user以及user2,它们的局部变量都是存储在Java栈中的。

为了更直观的表达它们之间的关系,见如下图所示:

 

 

 这些都是运行在JVM中的,那么如果来看JVM中这些内存的变化的呢?有没有一个工具可以看到呢?答案是肯定的,这里提供两款工具供大家参考:

  • JDK根目录下的bin目录下有个jconsole.exe;
  • Java Visual VM;

这里主要介绍jconsole.exe,如下:

1)打开jconsole.exe之后,会弹出建立新连接的提示框,如图:

2)连接之后,会出现如图所示内容:


 

可以发现这里可以观察到的参数指标有以下几类:内存、线程、类、VM概要、MBean,这里主要讲解内存这块的内容,其他的指标大家可以自行查看。

3)这里内存监控指标包括:

堆内存使用量;

非堆内存使用量;

内存池(PS Old Gen);

内存池(PS Eden Space);

内存池(PS survivor Space);

等等。

如图所示:

这里我们手工进行GC。

另外还有一部分需要注意。也就是Java堆内存中的划分,

根据垃圾回收机制不同,JAVA堆又有不同的结构。最常见的就是将整个JAVA堆分为新生代老年代

何为新生代和老年代?

新生代和老年代的划分并不是根据该对象在内存中存在的时间来定义的,而是通过GC的过程中对该对象的回收次数决定的。每GC一次,那么该对象的回收次数增加1,当该值达到定义的阈值时,则该对象进入老年代。

  • 大小: 24.1 KB
  • 大小: 24.1 KB
  • 大小: 29.6 KB
  • 大小: 47.1 KB
  • 大小: 43.6 KB
分享到:
评论

相关推荐

    Tomcat性能优化及JVM内存工作原理

    【标题】:深入理解Tomcat性能优化与JVM内存工作原理 【正文】: Tomcat作为一款广泛应用的Java Servlet容器,其性能优化对于提升Web应用的响应速度和稳定性至关重要。而JVM(Java Virtual Machine)内存管理是...

    jvm详细介绍以及性能优化方法

    本篇文章将详细探讨JVM的工作原理,并提供一些有效的性能优化策略。 首先,JVM的内存结构分为堆、栈、方法区、程序计数器、本地方法栈等几个关键区域。堆是所有对象实例的存储区域,而栈则用于存储方法调用时的局部...

    JVM系列之性能调优参考手册(实践篇).pdf

    首先,性能调优并非起点,而是建立在理论基础之上。手册前言部分强调了对JVM体系结构的深入理解是性能调优的前提。在这个基础上,通过实例(example)的实践来巩固和验证理论知识。生产环境的复杂性要求开发者必须...

    JVM性能优化(PPT)

    **JVM性能优化** 在Java开发中,JVM(Java Virtual Machine)是至关重要的组成部分,它负责运行所有的Java应用程序。JVM性能优化是一项细致而关键的任务,能够显著提升程序的运行效率,减少资源消耗,提高系统稳定...

    JVM基础.doc

    ### JVM基础知识精讲 #### 一、JVM概述与HotSpot简介 Java虚拟机(JVM)是Java技术的核心组成部分之一,它为Java程序提供了运行时环境。本节将详细介绍JVM的基本概念及其核心技术——HotSpot。 **HotSpot VM** 是...

    实战JAVA虚拟机 JVM故障诊断与性能优化带源码

    《实战JAVA虚拟机 JVM故障诊断与性能优化》是一本深度探讨Java虚拟机(JVM)的书籍,旨在帮助开发者解决在实际工作中遇到的JVM相关问题,提升系统的性能。这本书提供了丰富的源码实例,让读者能够深入理解JVM的工作...

    JVM性能优化相关问题.pdf

    深入理解以上知识点对于Java开发者来说,是进行性能优化的基础。通过合理地控制类的加载时机、优化内存分配策略、选择合适的垃圾收集器和调优GC参数,能够显著提升Java应用程序的性能和稳定性。在实际开发中,开发者...

    实战JAVA虚拟机 JVM故障诊断与性能优化.pdf

    《实战JAVA虚拟机 JVM故障诊断与性能优化》是一本深度剖析Java虚拟机(JVM)的实战型书籍,旨在帮助读者理解JVM的工作原理,掌握JVM的故障诊断技巧,以及进行有效的性能优化。在Java开发中,JVM扮演着至关重要的角色...

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    通过阅读《实战Java虚拟机——JVM故障诊断与性能优化》,读者不仅可以学习到JVM的基础知识,还能掌握如何在实际工作中诊断问题和优化性能,从而提升Java应用程序的运行效率和稳定性。这本书是Java开发者深入理解JVM...

    实战JAVA虚拟机 JVM故障诊断与性能优化

    《实战JAVA虚拟机 JVM故障诊断与性能优化》这本书主要涵盖了Java开发者在实际工作中可能遇到的JVM相关问题,包括但不限于故障排查、性能调优、内存管理、垃圾收集机制等内容。以下将详细介绍这些知识点: 1. **Java...

    java jvm及性能优化_javajvm优化_Java性能分析_

    JVM性能优化是提升Java应用效率的关键环节,涉及到内存管理、垃圾回收、线程调度等多个方面。以下是对"Java JVM及性能优化"和"Java性能分析"的详细阐述: 一、JVM结构与工作原理 1. 类装载器:负责加载类文件,确保...

    实战Java虚拟机——JVM故障诊断与性能优化

    6. **JVM参数设置**:熟练掌握JVM启动参数的配置是性能优化的基础。书中会介绍如-Xms、-Xmx、-XX:MaxPermSize等关键参数的作用及最佳实践。 7. **JIT编译器**:JVM的Just-In-Time(JIT)编译器将热点代码编译为机器...

    JVM和性能优化学习思维笔记_swim5we_jvm_性能优化_

    在Java开发领域,JVM(Java Virtual Machine)和性能优化是至关重要的主题。这份"JVM和性能优化学习思维笔记"旨在帮助开发者深入理解和实践Java应用程序的性能提升。以下是基于标题、描述和标签所涉及的知识点的详细...

    JVM和性能优化1

    Java虚拟机(JVM)是Java程序运行的基础,它的性能优化对于提高应用程序的效率至关重要。本文将探讨JVM的内存区域、垃圾回收和内存分配策略、执行子系统、编写高效优雅Java程序的方法以及深入理解性能优化。 1、...

    深入JVM内核—原理、诊断与优化

    了解并熟练使用这些工具是优化JVM的基础。 5. **JVM参数调整**:理解JVM启动参数的意义和作用,如-Xms、-Xmx、-XX:+UseConcMarkSweepGC等,是提升系统性能的关键。教程会指导如何根据系统资源和应用需求设置合适的...

    JVM和性能优化学习思维笔记.rar

    总的来说,这份"JVM和性能优化学习思维笔记"包含了从JVM基础到高级优化的全面内容,通过学习,开发者不仅可以掌握JVM的运作机制,还能提升在实际工作中进行性能调优的能力。无论是初学者还是经验丰富的开发者,都...

    JVM基础知识及性能调优

    ### JVM基础知识及性能调优 #### 一、JVM架构概览 Java虚拟机(JVM)作为Java程序运行的基础环境,其内部结构复杂且高效。理解JVM的基础知识对于优化Java应用程序至关重要。JVM主要由以下几个关键部分组成: 1. **...

    JVM基础-超清文字版.pdf

    本资料《JVM基础-超清文字版.pdf》将深入探讨JVM的基础知识,包括其架构、内存模型、类加载机制以及性能优化等方面。 1. **JVM架构** - 类装载器:负责加载类文件到JVM中,分为引导类加载器、扩展类加载器和应用类...

    面试必问之jvm与性能优化.pdf

    ### 面试必问之JVM与性能优化——关键知识点解析 #### 一、JVM加载Class文件的原理机制 在Java开发过程中,深入理解JVM如何加载Class文件至关重要,尤其是在面试时,这一知识点往往是考察的重点之一。下面将详细...

Global site tag (gtag.js) - Google Analytics