JVM 性能调优 - Java 虚拟机内存体系(1)

news2024/11/19 9:37:50

Java 虚拟机我们简称为 JVM(Java Virtual Machine)。

Java 虚拟机在执行 Java 程序的过程中,会管理几个不同的数据区域。如下图所示:

下面我会介绍这几个数据区的特点。

堆区的几个特点:

  • 线程共享。
  • 启动时创建堆这个区。
  • 基本上所有的对象实例都在这个区分配。
  • 物理上不连接(大对象除外)。逻辑上不连接。
  • 内存分为新生代和老年代。新生代分为 eden 区和两个大小一样的 survivor 区。

内存细分:

Java 7 及之前内存逻辑上分为三部分:新生区 + 老年代 + 永久代。

  • 新生区,又被划分为 Eden 区和 Survivor 区。
  • 老年代。
  • 永久代实现了方法区。

Java 8 及之后内存逻辑上分为三部分:新生区 + 老年代 + 元空间。

  • 新生区,又被划分为 Eden 区和 Survivor 区。
  • 老年代。
  • 废弃了永久代,使用元空间,它属于本地内存。
方法区
  • 线程共享。
  • 主要存储这几类信息。
    • 类型信息。
    • 常量。
    • 静态变量。
    • 即时编译器编译后的代码缓存。
虚拟机栈
  • 线程私有。
  • 生命周期与线程相同。
  • 一个线程中,每一个方法被执行的时候,创建一个栈帧。
  • 栈帧 Stack Frame 的结构。
    • 存储局部变量表。
      • 基本数据类型。
      • 对象引用。
      • 返回地址(returnAddress)。
    • 操作数栈。
    • 动态连接。
    • 方法出口。
本地方法栈
  • 线程私有。

  • 虚拟机使用到的本地(Native)方法服务。

程序计数器
  • 线程私有。

  • 当前线程所执行的字节码的行号指示器。

几个数据区的特点思维导图

垃圾回收

垃圾回收主要关注方法区和堆中的垃圾收集。如下图所示,方法区和堆被高亮显示,用来说明垃圾收集器关心的收集区域。

收集堆区域是垃圾收集器的工作重点。上面我们也讲到了堆空间的划分,包含新生代和老年代,而垃圾收集器会频繁收集新生代,较少收集老年代。

什么是垃圾

我们可以先想下现实生活中的垃圾,比如吃香蕉后的香蕉皮,我们不需要就扔到垃圾桶了,那么香蕉皮就属于垃圾,需要被环卫工人回收。 那 Java 虚拟机中,什么是垃圾呢?

垃圾是指在运行程序中没有任何指针指向的对象,这些对象被当作垃圾被垃圾收集器回收。

如何确定垃圾

有两种算法来确定哪些对象是垃圾:引用计数法和根节点可达性分析。

  • 引用计数法

原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,可当作垃圾回收。

缺点:需要维护引用计数器,有一定的消耗。且较难处理循环引用的问题。(现在基本没有地方使用这种算法了,了解即可)。

  • 可达性分析算法

原理:通过一系称为 GC Roots 的对象作为起始点,从 GC Roots 的对象出发,向下搜索,如果找到的对象和 GC Roots 有直接引用或间接引用关系,则说明这个对象不是垃圾,否则,这个对象就是垃圾。

哪些对象可以当作 GC Roots
  • 虚拟机栈中的引用对象。
  • 方法区中的类静态属性引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中的 JNI(Native 方法)引用的对象。

总结:除了堆空间外的一些结构,比如虚拟机栈、本地方法栈、方法区、字符串常量池等地方对堆空间进行引用的,都可以作为 GC Roots 进行可达性分析。

GC Roots 对象回收

编写程序

package com.test;

public class TestGCRoots {
    private static final int _1MB = 1024 * 1024;
    private byte[] bigSize = new byte[2 * _1MB];
    private static TestGCRoots testGCRoots;

    public static void main(String[] args) throws InterruptedException {
        testGCRoots = new TestGCRoots();
        //gcRootsDemo = null;
        System.gc();
    }
}

运行程序

$ java -XX:+PrintGCDetails com.test.TestGCRoots
[GC (System.gc()) [PSYoungGen: 5980K->2904K(114176K)] 5980K->2912K(375296K), 0.0024028 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System.gc()) [PSYoungGen: 2904K->0K(114176K)] [ParOldGen: 8K->2689K(261120K)] 2912K->2689K(375296K), [Metaspace: 2672K->2672K(1056768K)], 0.0049802 secs] [Times: user=0.13 sys=0.00, real=0.00 secs]
Heap
 PSYoungGen      total 114176K, used 983K [0x0000000740b80000, 0x0000000748a80000, 0x00000007c0000000)
  eden space 98304K, 1% used [0x0000000740b80000,0x0000000740c75da0,0x0000000746b80000)
  from space 15872K, 0% used [0x0000000746b80000,0x0000000746b80000,0x0000000747b00000)
  to   space 15872K, 0% used [0x0000000747b00000,0x0000000747b00000,0x0000000748a80000)
 ParOldGen       total 261120K, used 2689K [0x0000000642200000, 0x0000000652100000, 0x0000000740b80000)
  object space 261120K, 1% used [0x0000000642200000,0x00000006424a07d8,0x0000000652100000)
 Metaspace       used 2679K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 289K, capacity 386K, committed 512K, reserved 1048576K

断开实例引用

package com.test;

public class TestGCRoots {
    private static final int _1MB = 1024 * 1024;
    private byte[] bigSize = new byte[2 * _1MB];
    private static TestGCRoots testGCRoots;

    public static void main(String[] args) throws InterruptedException {
        testGCRoots = new TestGCRoots();
        gcRootsDemo = null;
        System.gc();
    }
}

运行程序

$ java -XX:+PrintGCDetails com.test.TestGCRoots
[GC (System.gc()) [PSYoungGen: 5980K->872K(114176K)] 5980K->880K(375296K), 0.0012472 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System.gc()) [PSYoungGen: 872K->0K(114176K)] [ParOldGen: 8K->641K(261120K)] 880K->641K(375296K), [Metaspace: 2674K->2674K(1056768K)], 0.0063510 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
Heap
 PSYoungGen      total 114176K, used 983K [0x0000000740b80000, 0x0000000748a80000, 0x00000007c0000000)
  eden space 98304K, 1% used [0x0000000740b80000,0x0000000740c75da0,0x0000000746b80000)
  from space 15872K, 0% used [0x0000000746b80000,0x0000000746b80000,0x0000000747b00000)
  to   space 15872K, 0% used [0x0000000747b00000,0x0000000747b00000,0x0000000748a80000)
 ParOldGen       total 261120K, used 641K [0x0000000642200000, 0x0000000652100000, 0x0000000740b80000)
  object space 261120K, 0% used [0x0000000642200000,0x00000006422a07b8,0x0000000652100000)
 Metaspace       used 2681K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 289K, capacity 386K, committed 512K, reserved 1048576K

对象和 GC Roots 没有引用关系时(这里引用关系可以是间接或直接引用),即对象不可达,将会被垃圾收集器标记为垃圾,后期被回收掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识网络基础

一、网络的发展 1.独立模式: 计算机之间相互独立; 在早期计算机是孤立的单机系统,无法互相通信或共享资源。 由于缺乏互联性,早期的计算机系统无法实现有效的资源共享。只能依靠光驱和网盘经行将数据拷贝,线下将数据经行传输,每台…

LeetCode:1696. 跳跃游戏 VI(DP, Java)

目录 1696. 跳跃游戏 VI 题目描述: 实现代码与解析: 一眼dp(超时,后面给出优化思路和代码) 原理思路: 优化后代码: 1696. 跳跃游戏 VI 题目描述: 给你一个下标从 0 开始的整数…

VPP学习-VPP初始化流程

概念 VPP作为一个开源的、高性能的用户态网络协议栈,以进程的形式运行于Linux或(类unix)系统下,即VPP实际是一个用户进程,VPP启动后可通过"ps -ef | grep vpp"命令查看。 VPP启动 用户态进程启动都有一个ma…

第7节、双电机直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:前面章节主要介绍单个电机控制,本节内容介绍两个电机完成Bresenham直线运动 一、Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发,最初用于计…

Akamai 如何揪出微软 RPC 服务中的漏洞

近日,Akamai研究人员在微软Windows RPC服务中发现了两个重要漏洞:严重程度分值为4.3的CVE-2022-38034,以及分值为8.8的CVE-2022-38045。这些漏洞可以利用设计上的瑕疵,通过缓存机制绕过MS-RPC安全回调。我们已经确认,所…

Transformer实战-系列教程7:SwinTransformer 算法原理 1

🚩🚩🚩Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 1、SwinTransformer SwinTransformer 可以看作为一个backbone用来做分类、检测、分割都是非常好…

紫光展锐M6780丨一语即达,“声”临其境

在前面四期,紫光展锐针对M6780的显示技术进行了系列揭秘。虽名为“智能显示芯片”,但M6780的魅力远不止于超高清智能显示,更有智能语音交互功能,助力打造数字世界的交互新体验。 智能语音技术是一种基于人工智能和语音识别技术的创…

【CSS】margin塌陷和margin合并及其解决方案

【CSS】margin塌陷和margin合并及其解决方案 一、解决margin塌陷的问题二、避免外边距margin重叠(margin合并) 一、解决margin塌陷的问题 问题:当父元素包裹着一个子元素的时候,当给子元素设置margin-top:100px,此时不…

(已解决)vueQQ邮箱注册发送验证码前端设计,如何发送验证码设计倒计时

我们之前已经通过前端测试成功完成qq邮箱动态验证码发送&#xff08;未使用redis&#xff0c;我准备自己了解完后&#xff0c;后期有时间补上&#xff09; 衔接文章&#xff1a; 1&#xff1a; spingboot 后端发送QQ邮箱验证码 2&#xff1a; 这段代码建设图形化界面 <di…

分享springboot框架的一个开源的本地开发部署教程(若依开源项目开发部署过程分享持续更新二开宝藏项目MySQL数据库版)

1首先介绍下若依项目&#xff1a; 若依是一个基于Spring Boot和Spring Cloud技术栈开发的多租户权限管理系统。该开源项目提供了一套完整的权限管理解决方案&#xff0c;包括用户管理、角色管理、菜单管理、部门管理、岗位管理等功能。 若依项目采用前后端分离的架构&#xf…

Nacos1.X源码解读(待完善)

下载源码 1. 克隆git地址到本地 # 下载nacos源码 git clone https://github.com/alibaba/nacos.git 2. 切换分支到1.4.7, maven编译(3.5.1) 3. 找到启动类com.alibaba.nacos.Nacos 4. 启动VM参数设置单机模式, RUN 启动类 -Dnacos.standalonetrue 5. 启动本地服务注册到本…

Spark SQL调优实战

1、新添参数说明 // Driver和Executor内存和CPU资源相关配置 --是否开启executor动态分配&#xff0c;开启时spark.executor.instances不生效 spark.dynamicAllocation.enabledfalse --配置Driver内存 spark.dirver.memory5g --driver最大结果大小&#xff0c;设置为0代…

踩坑了,MySQL数据库生成大量奇怪的大文件

作者&#xff1a;田逸&#xff08;formyz&#xff09; 一大早就收到某个数据库服务器磁盘满的报警信息&#xff0c;其中数据盘使用率超过90%&#xff0c;如下图所示。 这是一台刚上线不久的MySQL从库服务器&#xff0c;数据盘的总容量是300G。先登录系统&#xff0c;查看主从同…

全链游戏的未来趋势与Bridge Champ的创新之路

为了充分探索全链游戏的特点和趋势&#xff0c;以及Bridge Champ如何作为一个创新案例融入这一发展脉络&#xff0c;我们需要深入了解这两者之间的互动和相互影响。全链游戏&#xff0c;或完全基于区块链的游戏&#xff0c;代表了游戏行业的一个重要转型&#xff0c;它们利用区…

【C++】I/O多路转接详解(二)

在上一篇文章【C】I/O多路转接详解&#xff08;一&#xff09; 在出现EPOLL之后&#xff0c;随之而来的是两种事件处理模式的应运而生&#xff1a;Reator 和 Proactor,同步IO模型常用于Reactor模式&#xff0c;异步IO常用于Proactor. 目录 1. 服务器编程框架简介2. IO处理1. R…

【爬虫作业】python爬虫作业——爬取汽车之家

爬取汽车之家期末作业&#xff1a; 代码如下所示&#xff1a; import random import timeimport requests #发送网络请求 import parsel import csv # 1.发送网络请求 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like G…

ELFK日志采 - QuickStart

文章目录 架构选型ELKEFLK ElasticsearchES集群搭建常用命令 Filebeat功能介绍安装步骤Filebeat配置详解filebeat常用命令 Logstash功能介绍安装步骤Input插件Filter插件Grok Filter 插件Mutate Filter 插件常见的插件配置选项&#xff1a;Mutate Filter配置案例&#xff1a; O…

ffmpeg命令生成器

FFmpeg 快速入门&#xff1a;命令行详解、工具、教程、电子书 – 码中人的博客FFmpeg 是一个强大的命令行工具&#xff0c;可以用来处理音频、视频、字幕等多媒体文件。本文介绍了 FFmpeg 的基本用法、一些常用的命令行参数&#xff0c;以及常用的可视化工具。https://blog.mzh…

什么是S参数

S参数是网络参数&#xff0c;定义了反射波和入射波之间的关系&#xff0c;给定频率的S参数矩阵指定端口反射波b的矢量相对于端口入射波a的矢量&#xff0c;如下所示&#xff1a; bS∙a 在此基础上&#xff0c;如下图所示&#xff0c;为一个常见的双端口网络拓扑图&#xff1a;…

GPT-1, GPT-2, GPT-3, GPT-3.5, GPT-4论文内容解读

目录 1 ChatGPT概述1.1 what is chatGPT1.2 How does ChatGPT work1.3 The applications of ChatGPT1.3 The limitations of ChatGPT 2 算法原理2.1 GPT-12.1.1 Unsupervised pre-training2.1.2 Supervised fine-tuning2.1.3 语料2.1.4 分析 2.2 GPT-22.3 GPT-32.4 InstructGPT…