JVM-JVM内存结构(二)

news/2024/7/24 3:49:16 标签: java, jvm

堆(Heap)

  • 通过new关键字,创建的对象都会使用堆内存
  • 特点:
    1. 他是线程共享的,堆中的对象需要考虑线程安全的问题
    2. 有垃圾回收机制

堆内存溢出(OutOfMemoryError)

代码演示

java">List<String> list = new ArrayList<>();
try{
    String a = "hello";
    while(true){
        list.add(a);
        a = a + a;
    }
}catch(Throwable e){
    e.printStackTrace()
}

堆内存诊断

  • jps工具:查看当前系统中有哪些java进程
  • jmap工具:查看堆内存占用情况(jmap -heap 进程id)
  • jconsole工具:图形界面的,多功能的检测工具,可以连续检测

方法区

在这里插入图片描述

在这里插入图片描述

内存溢出

  • 1.8以前会导致永久代内存溢出
  • 1.8以后会导致原空间内存溢出

运行时常量池

二进制字节码包含:类基本信息,常量池,类方法定义包含了虚拟机指令

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

StringTable

底层是基于哈希表实现,不能扩容

java">package bean;

public class Temp {
    public static void main(String[] args) {
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        String s4 = s1 + s2;
        System.out.println(s3==s4);//false
        /*
        解释:
        1. s3是在常量池中
        2. s4是new出来的字符串,在堆中
        3. 二者内存空间地址不一样,所以是false
        
        
        */
    }
}

执行javap -v Temp.class

Classfile /E:/code/java/temp/Thread/reflect/src/main/java/bean/Temp.class
  Last modified 2024年2月6日; size 780 bytes
  SHA-256 checksum 56c70e4c76c31646a9cb2cfece3728bc1a10f96185b4456e087039d1e60a0541
  Compiled from "Temp.java"
public class bean.Temp
  minor version: 0
  major version: 65
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #17                         // bean/Temp
  super_class: #2                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 2, attributes: 3
Constant pool://这里是常量池
   #1 = Methodref          #2.#3          // java/lang/Object."<init>":()V
   #2 = Class              #4             // java/lang/Object
   #3 = NameAndType        #5:#6          // "<init>":()V
   #4 = Utf8               java/lang/Object
   #5 = Utf8               <init>
   #6 = Utf8               ()V
   #7 = String             #8             // a
   #8 = Utf8               a
   #9 = String             #10            // b
  #10 = Utf8               b
  #11 = String             #12            // ab
  #12 = Utf8               ab
  #13 = InvokeDynamic      #0:#14         // #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
  #14 = NameAndType        #15:#16        // makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
  #15 = Utf8               makeConcatWithConstants
  #16 = Utf8               (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
  #17 = Class              #18            // bean/Temp
  #18 = Utf8               bean/Temp
  #19 = Utf8               Code
  #20 = Utf8               LineNumberTable
  #21 = Utf8               main
  #22 = Utf8               ([Ljava/lang/String;)V
  #23 = Utf8               SourceFile
  #24 = Utf8               Temp.java
  #25 = Utf8               BootstrapMethods
  #26 = String             #27            // \u0001\u0001
  #27 = Utf8               \u0001\u0001
  #28 = MethodHandle       6:#29          // REF_invokeStatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #29 = Methodref          #30.#31        // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #30 = Class              #32            // java/lang/invoke/StringConcatFactory
  #31 = NameAndType        #15:#33        // makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #32 = Utf8               java/lang/invoke/StringConcatFactory
  #33 = Utf8               (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #34 = Utf8               InnerClasses
  #35 = Class              #36            // java/lang/invoke/MethodHandles$Lookup
  #36 = Utf8               java/lang/invoke/MethodHandles$Lookup
  #37 = Class              #38            // java/lang/invoke/MethodHandles
  #38 = Utf8               java/lang/invoke/MethodHandles
  #39 = Utf8               Lookup
{
  public bean.Temp();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=5, args_size=1
         0: ldc           #7                  // String a
         2: astore_1
         3: ldc           #9                  // String b
         5: astore_2
         6: ldc           #11                 // String ab
         8: astore_3
         9: aload_1
        10: aload_2
        11: invokedynamic #13,  0             // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
        16: astore        4
        18: return
      LineNumberTable:
        line 5: 0
        line 6: 3
        line 7: 6
        line 8: 9
        line 9: 18
}
SourceFile: "Temp.java"
BootstrapMethods:
  0: #28 REF_invokeStatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
    Method arguments:
      #26 \u0001\u0001
InnerClasses:
  public static final #39= #35 of #37;    // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
  • StringTable特性
    1. 常量池中的字符串仅是符号,第一次用到时才变为对象
    2. 利用串池的机制,来避免重复创建字符串对象
    3. 字符串拼接原理是StringBuilder(1.8)
    4. 字符串常量拼接的原理是编译期优化
    5. 可以使用intern方法,可以主动将串池中还没有的字符串对象放入串池(1.8尝试将字符串对象放入串池,如果有则并不会放入,如果没有,则会把串池中的对象返回)
  • StringTable位置
    1. 1.6之前,StringTable在永久代内存空间中
    2. 1.8以后,StringTable在堆内存空间中
  • StringTable垃圾回收
    1. 超过阈值,会触发GC垃圾回收
  • StringTable性能调优
    1. StringTable底层是基于哈希表实现的,所以StringTable调优,就是优化底层哈希表的大小,以此减少哈希碰撞
    2. 参数-XX:StringTableSize = 桶个数
    3. 考虑将字符串对象是否入池(包含很多重复的字符串)

直接内存

定义:(操作系统内存)

1. 常见与NIO操作,用于数据缓冲区
2. 分配回收成本较高,但读写性能高
3. 不受JVM内存回收管理

在这里插入图片描述

内存分配和释放原理

是通过一个对象unsafe来分配和释放内存的,并且回收需要主动调用freeMemory方法

ByteBuffer的实现类内部,使用了Cleaner(虚引用)来检测ByteBuffer对象,一旦该对象被GC垃圾回收机制回收,那么就会由ReferenceHandler线程通过Cleanerclean方法调用freeMemory方法来释放直接内存


http://www.niftyadmin.cn/n/5367575.html

相关文章

基于微信小程序的校园故障维修管理系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

将因子转换为数字

在 R 中使用 as.numeric 函数将因子转换为数字 as 函数通常用于将数据类型显式转换为另一种类型。转换过程在 R 术语中称为强制转换&#xff0c;它表示其他编程语言中存在的强制转换概念。当我们调用函数 as.logical 时&#xff0c;它会尝试将传递的参数强制转换为逻辑类型。类…

QGIS编译(跨平台编译)之四十六:minizip编译(Windows、Linux、MacOS环境下编译)

文章目录 一、minizip介绍二、minizip下载三、Linux下编译四、MacOS下编译五、Windows下编译一、minizip介绍 Minizip 是一个用于处理 ZIP 文件的开源库,它基于 zlib 库构建。zlib 是一个广泛使用的、免费的、开源的压缩库,提供数据压缩和解压缩功能。Minizip 扩展了 zlib 的…

vim最简单命令学习

安装vim sudo apt install vim在终端随便打开一个文本文件&#xff0c;或者源文件&#xff0c; vim filepath输入该命令后&#xff0c;从终端进入vim编辑器&#xff0c;此时为普通模式(Normal)。 按i键进入编辑模式(Insert)&#xff0c;按Esc键返回普通模式(Normal)。 在编辑…

leetcode 1539.第k个缺失的正整数

这个题作者就当作是练习C的STL容器来做的&#xff0c;也就是暴力硬解吧。 思路&#xff1a;按照数据范围&#xff0c;我们再创造一个全集&#xff0c;利用差集的概念来求出来arr所没有的元素&#xff0c;放到结果数组里面&#xff0c;然后再对位置进行筛选。 注意&#xff1a…

docker-compose部署gitlab和jenkins

通过docker-compose部署gitlab和jenkins&#xff0c;方便后续工作 注意&#xff1a; gitlab占用资源较多&#xff0c;最好系统内存在8G以上&#xff0c;CPU4核心以上&#xff0c;否则gitlab有可能报错无法启动。docker版本用最新版本&#xff0c;低版本的docker可能会导致doc…

华为Eth-Trunk级联堆叠接入IPTV网络部署案例

Eth-Trunk级联堆叠接入IPTV网络部署案例 组网图形 图2 Eth-Trunk级联堆叠IPTV基本组网图 方案简介配置注意事项组网需求数据规划配置思路操作步骤配置文件 方案简介 随着IPTV业务的迅速发展&#xff0c;IPTV平台承载的用户也越来越多&#xff0c;用户对IPTV直播业务的可靠性…

用python编写爬虫,爬取二手车信息+实验报告

题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88805518使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件&#xff0c;再run all就行 注意事项 可能遇到的bug 暂无&#xff0c;有的话私信我