JVM基础第一篇

内存结构

程序计数器

1.定义

 在Java虚拟机(JVM)中,每个线程都有一个独立的程序计数器,它是线程私有的,不会被线程切换所影响。

2.作用

记住下一条jvm指令的执行地址

3.特点

  • 是线程私有的
  • 不会存在内存溢出

虚拟机栈

1.定义

虚拟机栈(Virtual Machine Stack)是Java虚拟机(JVM)内存结构中的一部分,用于存储方法执行的信息,每个线程都有自己独立的虚拟机栈。每个方法在执行时都会在虚拟机栈上创建一个栈帧

2.特点

  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

3.栈内存溢出

  • 栈帧过多导致栈内存溢出
  • 栈帧过大导致栈内存溢出

举例:无限递归调用。

本地方法栈

1.定义

本地方法栈是java虚拟机内存结构中的一部分,与虚拟机栈类似,但是是专门用于执行本地方法(native method)的过程。每个线程都有自己独立的本地方法栈。 

2.作用

本地方法栈的作用是为java程序调用本地方法提供支持。本地方法使用c或者c++语言编写的。

3.与虚拟机栈的不同

虚拟机栈用于执行java方法的,本地方法栈用于执行本地方法。

1.定义

用于存储java程序运行时创建的对象实例和数组。所有对象的实例都存储在堆中。

2.特点

动态分配:堆内存是动态分配的,它的大小可以在程序运行时动态的调整

对象存储:堆内存主要用于存储Java程序运行时创建的对象实例和数组,包括通过new关键字创建的对象和数组

垃圾回收:堆内存中的对象不再被引用的时候,会由java虚拟机的垃圾回收器自动进行垃圾回收。

线程共享:它是线程共享的,堆中对象都需要考虑线程安全的问题

3.堆内存溢出(java.long.OutOfMemoryError:java heap space)

当程序中创建了大量的对象实例,而这些对象实例无法被垃圾回收器及时回收时,堆内存的空间会被耗尽,导致堆内存溢出。

4.堆内存诊断

jps工具 :查看当前系统中有哪些java进程

jmap工具:查看堆内存占用情况 jmap - heap进程id

jconsole工具:图形界面的,多功能的检测工具,可以连续检测

方法区

1.定义

Java 虚拟机有一个在所有 Java 虚拟机线程之间共享的方法区。方法区类似于传统语言的编译代码的存储区或者类似于操作系统进程中的“文本”段。它存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用的 特殊方法

2.特点

  • 方法区是在虚拟机启动时创建的
  • 方法区在逻辑上是堆的一部分,但简单的实现可以选择不进行垃圾收集或压缩它

3.组成

在JDK 8之前,方法区被称为永久代,它具有固定大小,并且使用的是堆内存。但是,由于永久代的大小是有限的,且垃圾回收器不会主动回收永久代中的内存,所以在大量类的加载和卸载时,容易出现永久代溢出的情况。

在JDK 8之后,永久代被元空间(Metaspace)所取代。元空间仍然用于存储类的结构信息、常量、静态变量等,但是它不再位于堆内存中,而是位于本地内存中。元空间的大小受限于本地内存的大小,因此不再存在永久代溢出的问题。

通过编译反编译可以获得二进制字节码;二进制字节码通常由(类基本信息,常量池,类方法定义,包含了虚拟机指令)

常量池

常量池就是一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息。常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量 池,并把里面的符号地址变为真实地址

运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分,它是在类加载过程中生成的,用于存储编译时期生成的各种字面量和符号引用。与Class文件中的常量池(Class Constant Pool)不同,运行时常量池是在类加载后动态生成的,用于满足某些需要在运行期间才能确定的常量。

StringTable

StringTable是 Java 虚拟机(JVM)中用于存储字符串的一种数据结构,它也叫字符串池(String Pool)

字符串池是运行时数据区域的一部分,用于存储Java中的字符串对象实例。字符串池中存储的是字符串对象的引用,而不是字符串对象本身。当创建字符串对象时,如果字符串池中已经存在相同内容的字符串,则返回字符串池中的引用,否则创建一个新的字符串对象,并将其放入字符串池中。

字符串池和常量池的区别

  • 字符串池中的字符串对象通常是常量池中字符串常量的引用。当创建字符串对象时,如果该字符串在常量池中已经存在,则返回常量池中的引用,否则将新的字符串常量添加到常量池中,并返回该引用。

  • 由于字符串是不可变的,因此字符串池中的字符串对象可以被共享。这意味着如果多个字符串对象的内容相同,则它们都会指向字符串池中的同一个字符串对象实例,从而节省了内存空间。

StringTable特性

常量池中的字符串仅仅是符号,第一次用到时才变为对象

利用串池的机制,来避免重复创建字符串对象

字符串变量拼接的原理是StringBuilder

字符串常量拼接的原理是编译器优化

可以使用intern方法,主动将串池中还没有的字符串对象放入池中,也就是字符串变量拼接而成的字符串。如果有的话,并不会放入,如果没有放入串池,会把串池中的对象返回

示例

public class Test5 {
    public static void main(String[] args) {
        String s = "cd";
        String s1 = new String("a")+new String("b");
        String s2 = s1.intern();
        String s3 = new String("c")+new String("d");
        String s4 = s3.intern();
        System.out.println(s1==s2);//true
        System.out.println(s3==s4);//false
    }
}

StringTable垃圾回收

在java中,StringTable不会被垃圾回收,因为StringTable是存储字符串对象引用的数据结构,它是JVM内部的一部分,并且是线程私有的,不会被垃圾回收器所管理。

需要注意的是,虽然StringTable本身不会被垃圾回收,但其中的字符串对象可能会被垃圾回收器回收,具体取决于是否存在对这些字符串对象的引用。如果没有任何引用指向字符串对象,那么这些对象将会被垃圾回收器回收,释放内存空间。        

StringTable调优

StringTable底层采用哈希表结构,也就是数组+链表,数组的个数也称为桶个数。

方法一:

-XX:StringTableSize=<size>:指定StringTable桶的大小,即哈希表的初始容量。默认值通常是与堆空间大小相关联的一个数值。

方法二:

考虑将字符串对象是否入池。

直接内存

定义

直接内存是JVM中一种特殊的内存分配方式,它与Java堆内存和栈内存不同,直接内存不是由java虚拟机管理的,而是由操作系统管理的一块内存区域。它通常用于提高I/O操作的性能和效率。

特点

  • 非堆内存分配:直接内存不属于Java堆内存的一部分,也不受Java虚拟机的垃圾回收机制管理。
  • 零拷贝:直接内存通常与NIO(New I/O)相关,可以通过直接内存实现零拷贝技术,提高I/O操作的性能和效率。
  • 使用ByteBuffer类:在Java中,可以使用ByteBuffer类来操作直接内存,通过allocateDirect()方法来分配直接内存的缓冲区。

分配回收原理

        1.使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法              2.ByteBuffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦 ByteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调 用 freeMemory 来释放直接内存

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx配置证书和私钥进行SSL通信验证

文章目录 一、背景1.1 秘钥和证书是两个东西吗&#xff1f;1.2 介绍下nginx配置文件中参数ssl_certificate和ssl_certificate_key1.3介绍下nginx支持的证书类型1.4 目前nginx支持哪种证书格式&#xff1f;1.5 nginx修改配置文件目前方式也会有所不同1.6 介绍下不通格式的证书哪…

【DM8】序列

创建序列 图形化界面创建 DDL CREATE SEQUENCE "TEST"."S1" INCREMENT BY 1 START WITH 1 MAXVALUE 100 MINVALUE 1;参数&#xff1a; INCREMENT BY < 增量值 >| START WITH < 初值 >| MAXVALUE < 最大值 >| MINVALUE < 最小值…

Proxmox VE qm 方式一键创建Windows虚拟机

前言 实现qm 方式一键创建Windows虚拟机&#xff0c;提高效率。 qm 一键创建Windows虚拟机 以下实现在线下载镜像&#xff0c;创建虚拟机&#xff0c;安装系统需要自己手动安装哦&#xff0c;如果想实现全自动安装系统&#xff0c;建议部署自己的内网pxe server 系统参考各参…

Utilize webcam to capture photo with camera

1. Official Guide& my github Official course my github 2. Overcome Webcam js Error in Chrome: Could not access webcam link 直接把代码拷贝到本机的下述目录下 To ignore Chrome’s secure origin policy, follow these steps. Navigate to chrome://flags/#un…

【前端捉鬼记】使用nvm切换node版本后再用node -v查看仍然是原来的版本

今天遇到一个诡异的问题&#xff0c;使用nvm切换node版本&#xff0c;明明提示已经切换成功&#xff0c;可是再次查看node版本还是之前的&#xff01; 尝试了很多办法&#xff0c;比如重新打开一个cmd窗口、切换前执行nvm install version都没成功&#xff0c;直到找到这篇文章…

【计算机毕业设计】企业仓储管理系统——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

【算法】双指针算法

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 283. 移动零1.1 分析1.2 代码 2. 1089. 复写零2.1 分析2.2 代码 3. 202. 快乐数3.1 分析3.2 代码 4. 11. 盛最多水的容器4.1 分析4.2 代码 5. LCR 179. 查找总价格为目标值的两个商品5.1 分析5.2 代码 6. 15. 三数之和…

【攻防世界】web2(逆向解密)

进入题目环境&#xff0c;查看页面信息&#xff1a; <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){$_ostrrev($str);// echo $_o;for($_00;$_0<strlen($_o);$_0){$_csubstr($_o,$_0,1);$__ord($_c)1;…

2014最新AI智能系统ChatGPT网站源码GPTs应用支持+Ai绘画网站源码+搭建部署教程文档

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

深度解析SPARK的基本概念

关联阅读博客文章&#xff1a; 深入理解MapReduce&#xff1a;从Map到Reduce的工作原理解析 引言&#xff1a; 在当今大数据时代&#xff0c;数据处理和分析成为了企业发展的重要驱动力。Apache Spark作为一个快速、通用的大数据处理引擎&#xff0c;受到了广泛的关注和应用。…

打造个性化聊天机器人:用Ollama和Open WebUI搭建你的私有ChatGPT!

一 简介 Ollama 官网&#xff1a;https://github.com/ollama/ollama Ollama是一个开源的人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;工具平台&#xff0c;特别设计用于简化大型语言模型&#xff08;LLM&#xff09;的部署和使用流程。用户可以通…

nginx工作原理解析

目录 1、master-workers 的工作机制介绍 2、master-workers 的机制的好处 3、设置多少个 worker 4、最大连接数和支持的最大并发数的计算 1、master-workers 的工作机制介绍 nginx在启动后&#xff0c;会有一个master进程和一个或者多个相互独立的worker进程 过来的请求由…

4个关键提示:打造符合规范的网页设计

网页设计也属于UI设计的范畴&#xff0c;是近年来的热门话题。随着互联网时代的到来&#xff0c;越来越多的企业开始关注网页UI设计。正因为如此&#xff0c;UI设计可以说是目前设计行业薪酬最高的存在。 那么&#xff0c;对于目前学习网页设计的小伙伴来说&#xff0c;如何才…

电脑远程控制esp32上的LED

1、思路整理 首先esp32需要连接上wifi 然后创建udp socket 接受udp数据 最后解析数据&#xff0c;控制LED 2、micropython代码实现 import network from socket import * from machine import Pin p2Pin(2,Pin.OUT)def do_connect(): #连接wifi wlan network.WLAN(network.…

SpringBoot项目如何国际化操作,让你可以随意切换语言

1.前言 最近接触的项目需要中文/英文或者其他国家语言的切换&#xff0c;在后台的时候有一个选择&#xff0c;你可以选择中文还是英文&#xff0c;或者其他语言&#xff0c;选择完毕界面语言就都变了&#xff0c;咱不知道前端怎么操作的&#xff0c;但是后台在处理提示语的时候…

Qt/C++推流组件使用说明

2.1 网络推流 公众号&#xff1a;Qt实战&#xff0c;各种开源作品、经验整理、项目实战技巧&#xff0c;专注Qt/C软件开发&#xff0c;视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。 公众号&#xff1a;Qt入门和进阶&#xff0c;专门介绍Qt/C相关知识点学…

ppt从零基础到高手【办公】

第一章&#xff1a;文字排版篇01演示文稿内容基密02文字操作规范03文字排版处理04复习&作业解析第二章&#xff1a;图形图片图表篇05图形化表达06图片艺术化07轻松玩转图表08高效工具&母版统一管理09复习&作业解析10轻松一刻-文字图形小技巧速学第三章&#xff1a;…

[dvwa] xss dom

xss dom 0x01 low <script>alert(document.cookie)</script>弹个窗 script被写入html 0x02 medium 过滤<script 考虑使用img标签&#xff0c;其onerror属性在该元素加载src错误时触发 注入元素被写入value&#xff0c;就在value闭合option 和 select标签…

DP:子数组模型

一、最大子数组和 . - 力扣&#xff08;LeetCode&#xff09; 二、环形子数组的最大和 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxSubarraySumCircular(vector<int>& nums) {//动态规划思想解决 //环形数组问题&#xff0c;尝试转…

SpringBoot之SpringBoot整合MyBatis

本章详情 使用SpringBoot和MyBatis通过注解的方式操作数据库使用SpringBoot和MyBatis通过XML配置文件的方式操作数据库 项目搭建 1. 打开idea,选择Create New Project 2.选择Spring Initializer,然后点击Next 3.填写组织&#xff0c;坐标等信息&#xff0c;然后点击Next 4.选…