JVM-JVM内存结构(二)

堆(Heap)

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

堆内存溢出(OutOfMemoryError)

代码演示

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

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

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.classLast modified 2024年2月6日; size 780 bytesSHA-256 checksum 56c70e4c76c31646a9cb2cfece3728bc1a10f96185b4456e087039d1e60a0541Compiled from "Temp.java"
public class bean.Tempminor version: 0major version: 65flags: (0x0021) ACC_PUBLIC, ACC_SUPERthis_class: #17                         // bean/Tempsuper_class: #2                         // java/lang/Objectinterfaces: 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: ()Vflags: (0x0001) ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 3: 0public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=2, locals=5, args_size=10: ldc           #7                  // String a2: astore_13: ldc           #9                  // String b5: astore_26: ldc           #11                 // String ab8: astore_39: aload_110: aload_211: invokedynamic #13,  0             // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;16: astore        418: returnLineNumberTable:line 5: 0line 6: 3line 7: 6line 8: 9line 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.hqwc.cn/news/456497.html

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

相关文章

【学习笔记】树上差分总结(点差分/边差分)

一.树上差分的基本概念 1.树上差分的定义 树上差分&#xff0c;顾名思义&#xff0c;意思就是在树上做差分。 至于什么是差分呢&#xff1f;如果不会的同学&#xff0c;可以先看看我的这篇博客:一维,二维差分の详解&#xff08;简单易懂&#xff09;_一维差分-CSDN博客 2.树…

【Java EE】----Bean的作用域和生命周期

1.Bean的作用域 定义&#xff1a;Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式&#xff0c;⽐如 singleton 单例作⽤域&#xff0c;就 表示 Bean 在整个 Spring 中只有⼀份 &#xff08;产生的原因&#xff0c;Bean 默认情况下是单例状态&#xff08;singleton&…

c#cad 创建-多线段(三)

运行环境 vs2022 c# cad2016 调试成功 一、程序说明 AutoCAD中创建多段线的。具体解释如下&#xff1a; 获取当前文档和数据库&#xff0c;并创建一个编辑器&#xff08;用于与用户交互&#xff09;。使用事务处理的方式&#xff0c;开始对数据库的操作。打开模型空间&…

mysql事务锁

Lock - 事务锁 与 latch 的区别 lock对象是事务&#xff0c;用来锁定的是数据库中的对象&#xff0c;如表、行、页。并且一般lock的对象仅在事务commit或rollback后进行释放&#xff08;不同事务隔离级别释放的时间可能不同&#xff09;。此外&#xff0c;lock&#xff0c;正…

Damn Small Linux 停更16年后,2024 回归更新

Damn Small Linux(DSL) 发行版释出了最新的 2024 版本&#xff0c;并重新定义了什么叫“Damn Small”。 DSL 诞生于 2005 年&#xff0c;原本是尝试提供一个 50MB 大小的 LiveCD&#xff0c;2008 年开发停滞。 2024 年原作者 John Andrews 宣布 DSL 复活&#xff0c;在几乎所…

信号系统之线性系统详解

1 线性系统 信号描述了一个参数如何随另一个参数变化。例如&#xff0c;电子电路中的电压随时间变化&#xff0c;或图像中随距离变化的亮度。系统是响应输入信号而产生输出信号的任何过程。如图中的框图所示。 有几个规则用于命名信号&#xff1a; 连续信号使用圆括号&#x…

Android:Android Studio安装及环境配置

1开发环境搭建 Android开发需要使用java的jdk环境,所以需要下载JAVA JDK。 1.1安装配置JAVA JDK Java的JDK下载: https://www.oracle.com/technetwork/java/javase/downloads/index.html 配置java的环境变量: JAVA_HOME:java安装路径。 新增环境变量CLASSPATH 在Path环境…

执行时长 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 为了充分发挥GPU算力&#xff0c;需要尽可能多的将任务交给GPU执行&#xff0c;现在有一个任务数组&#xff0c;数组元素表示在这1秒内新增的任务个数且每秒都有新…

浅谈交换原理(3)——交换网络

一、基本概念 交换网络是由若干个交换单元按照一定的拓扑结构和控制方式构成的网络。交换网络的三个基本要素是&#xff1a;交换单元、不同交换单元间的拓扑连接和控制方式。 1.1 单机交换网络与多级交换网络 交换网络按拓扑连接方式可分为&#xff1a;单级交换网络和多级交换网…

2024年对于Windows电脑,有类似的清理软件推荐吗?

对于Windows电脑&#xff0c;有很多类似的清理软件可以选择。以下是一些推荐的清理软件&#xff1a; CCleaner&#xff1a;这是一款非常受欢迎的Windows清理软件&#xff0c;它可以清理系统垃圾文件、浏览器缓存、无效注册表项等&#xff0c;还可以优化系统性能。CCleaner具有简…

【Qt学习笔记】(三)常用控件(持续更新)

Qt 常用控件 1 控件概述2 QWidget 控件核心属性2.1 enabled2.2 geometry2.3 window frame 的影响2.4 windowTitle2.5 window Icon2.6 windowOpacity2.7 cursor2.8 font2.9 toolTip2.10 focusPolicy2.11 stylesheet 1 控件概述 Widget是Qt中的核心概念英文原义是"小部件&q…

并发容器【ConcurentHashMap、CopyOnWriteArrayList、阻塞队列、ArrayBlockingQueue】

并发容器 什么是并发容器?同步容器:并发容器: ConcurrentHashMap结构图JDK1.7结构图JDK1.8结构图 CopyOnWriteArrayList实现原理 并发队列阻塞队列ArrayBlockingQueue 转自极客时间 什么是并发容器? 在JUC包中&#xff0c;有一大部分是关于并发容器的&#xff0c;如Concurr…