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);//trueSystem.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 来释放直接内存

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

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

相关文章

数据结构——单链表(C语言版)

文章目录 一、链表的概念及结构二、单链表的实现SList.h链表的打印申请新的结点链表的尾插链表的头插链表的尾删链表的头删链表的查找在指定位置之前插入数据在指定位置之后插入数据删除pos结点删除pos之后的结点销毁链表 三、完整源代码SList.hSList.ctest.c 一、链表的概念及…

设计模式示例

单例模式示例 单例模式是一种常用的软件设计模式&#xff0c;其目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。以下是一个简单的单例模式示例&#xff1a; java public class Singleton {// 私有静态实例&#xff0c;防止被引用&#xff0c;此处赋值为nul…

【算法分析与设计】全排列

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 示例 1&#xff1…

Transformer 结构浅析

Transformer 结构浅析 文章目录 Transformer 结构浅析Transformer 网络结构编码器位置编码多头注意力层Add&NormFeed Forward 解码器带掩码的多头注意力层多头注意力层 预测 Transformer 网络结构 Transformer模型的网络结构如图&#xff0c;且transformer结构主要分为两部…

二叉搜索树--搜索二维矩阵 II

题目描述 编写一个高效的算法来搜索 m * n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,…

unordered_map 值类型为函数指针概述

在C中&#xff0c;unordered_map是一种关联容器&#xff0c;可以存储键值对。如果你想在unordered_map中定义的值是有参函数&#xff0c;你可以使用std::function和std::bind来实现。 以下是一个简单的例子&#xff0c;展示了如何在unordered_map中存储有参函数&#xff0c;并…

HarmonyOS4 页面路由

Index.ets: import router from ohos.routerclass RouterInfo {// 页面路径url: string// 页面标题title: stringconstructor(url: string, title: string) {this.url urlthis.title title} }Entry // 入口組件 Component struct Index {State message: string 页面列表// …

react17+antd4 动态渲染导航菜单中的icon

在路由信息对照表中的icon可以有两种形式&#xff1a;一种是组件形式&#xff0c;一种是字符串形式的。 在antd4的Menu.Item和SubMenu中的icon属性的格式为&#xff1a; 1.组件形式 这种方法在渲染时很方便&#xff0c;与antd中的Menu.Item中的icon属性的形式是一致的&#…

C++力扣Leetcode算法5--搜索

1.深度优先遍历&#xff08;depth-first-search&#xff09;&#xff0c;遇到新节点就遍历下去。因此遍历需要用先入后出的栈来实现&#xff0c;也可以通过与栈等价的递归来实现。 深度优先搜索也可以用来检测环路&#xff1a;记录每个遍历过的节点的父节点&#xff0c;若一个节…

计算机组成原理【CO】Ch2 数据的表示和应用

文章目录 大纲2.1 数制与编码2.2 运算方法和运算电路2.3 浮点数的表示和运算 【※】带标志加法器OFSFZFCF计算机怎么区分有符号数无符号数? 【※】存储排列和数据类型转换数据类型大小数据类型转换 进位计数制进制转换2的次幂 各种码的基本特性无符号整数的表示和运算带符号整…

微信小程序Skyline模式下瀑布长列表优化成虚拟列表,解决内存问题

微信小程序长列表&#xff0c;渲染的越多就会导致内存吃的越多。特别是长列表的图片组件和广告组件。 为了解决内存问题&#xff0c;所以看了很多人的资料&#xff0c;都不太符合通用的解决方式&#xff0c;很多需要固定子组件高度&#xff0c;但是瀑布流是无法固定的&#xf…

推荐一款轻量级的hosts文件编辑器(免安装版)

在管理和编辑hosts文件时&#xff0c;一款简单而有效的工具是非常重要的。下面推荐一款免安装版的轻量级hosts文件编辑器&#xff0c;让你轻松管理你的hosts文件。 windows系统默认hosts文件位置 下载地址&#xff1a;https://www.alipan.com/s/8kSns9eAi9f

CSS aspect-ratio属性设置元素宽高比

aspect-ratio 是CSS的一个属性&#xff0c;用于设置元素的期望宽高比。它设置确保元素保持特定的比例&#xff0c;不受其内容或容器大小的影响。 语法&#xff1a; aspect-ratio: <ratio>;其中 <ratio> 是一个由斜杠&#xff08;/&#xff09;分隔的两个数字&…

代码随想录第39天 | 62.不同路径 、 63. 不同路径 II

一、前言 参考文献&#xff1a;代码随想录 今天主要的题目是动态规划的路径问题&#xff0c;动态规划五要点&#xff1b; 1、确定dp数组&#xff0c;dp[i]代表什么i代表什么&#xff1b; 2、递推公式&#xff1b; 3、初始化dp数组&#xff1b; 4、遍历顺序&#xff1b; …

Linux常用命令介绍

Linux ### 常用命令&#xff1a; 1、ls命令&#xff1a; 显示当前目录下文件和文件夹。 举例&#xff1a;在用户目录&#xff08;root&#xff09;使用ls可以查看用户里的文件及文件夹。 -l可以详细看列出文件及文件夹, ll命令等价与ls - l 2、cd命令 作用是切换目录。 …

uniapp APP真机调试接口请求不到服务器解决方法

项目场景&#xff1a; 在使用Hbuilder开发uniapp的过程中&#xff0c;出现了两个在 Chrome 调试中正常&#xff0c;但打包后异常的问题&#xff0c;特此记录。 问题描述 在 H5 端请求接口正常请求。 App 端 请求接口&#xff0c;提示 "{"errMsg":"reque…

百万成神-转自九边pro 的分享

1&#xff0c;如果一个人写代码写到10万行左右&#xff0c;也会出现下笔如有神的效果&#xff0c;很多时候自己都不知道自己怎么会想出这么复杂的套路和算法来。 2&#xff0c;我问过那个作者&#xff0c;他是怎么想到的&#xff0c;他说他也不知道&#xff0c;反正每天都写&am…

R语言数据可视化:基本绘图系统

目录 plot函数 par函数 hist函数 boxplot函数 plot函数应用实战 全局参数 R语言中有三大绘图系统包括基本绘图系统&#xff0c;Lattice绘图系统&#xff0c;ggplot2绘图系统 基本绘图系统 在R语言中&#xff0c;以下函数通常用于创建和定制图形&#xff1a; plot 函数…

网络通信三要素:IP、端口和协议

IP&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 IP&#xff1a;全程”互联网协议地址“&#xff0c;是分配给上网设备的唯一标志 IP地址有两种形式&#xff1a; IPv4&#xff1a;32位 IPv6&#xff1a;共128位。分成8段表示&#xff0c;每取四位编码成一个16进制…

分布式技术---------------消息队列中间件之 Kafka

目录 一、Kafka 概述 1.1为什么需要消息队列&#xff08;MQ&#xff09; 1.2使用消息队列的好处 1.2.1解耦 1.2.2可恢复性 1.2.3缓冲 1.2.4灵活性 & 峰值处理能力 1.2.5异步通信 1.3消息队列的两种模式 1.3.1点对点模式&#xff08;一对一&#xff0c;消费者主动…