ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JVM整理(一)

2022-05-02 21:34:45  阅读:176  来源: 互联网

标签:常量 虚拟机 串池 内存 JVM 整理 线程 方法


内存结构

1、程序计数器

2、虚拟机栈

3、本地方法栈

4、堆

5、方法区

1、程序计数器

  • 作用:记录下一条jvm指令的执行地址
  • 特点:
  1. 是线程私有的
  2. 不会存在内存溢出

2、虚拟机栈

  • 每个线程运行时所需要的内存,成为虚拟机栈
  • 每个栈由多个栈帧(Frame)组成,对应调用每个方法时所占用的内存
  • 每个线程只能有一个活动栈帧,对应正在执行的方法

注意:

        如果方法内局部变量没有逃离方法的作用访问,它是线程安全的         如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

栈内存溢出:

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

3、本地方法栈

jvm在调用一些本地方法时,需要给这些本地方法提供内存

4、堆

heap堆

定义:通过new关键字创建的对象都会使用堆内存

特点:

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

       有垃圾回收机制

5、方法区

定义:

 Java 虚拟机有一个在所有 Java 虚拟机线程之间共享的方法区。方法区类似于传统语言的编译代码的存储区,或者类似于操作系统进程中的“文本”段。它存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用 的特殊方法。方法区是在虚拟机启动时创建的。尽管方法区在逻辑上是堆的一部分,但简单的实现可能会选择不进行垃圾收集或压缩它。本规范不要求方法区域的位置或用于管理已编译代码的策略。方法区域可以是固定大小,也可以根据计算需要扩大,如果不需要更大的方法区域,可以缩小。方法区的内存不需要是连续的。Java 虚拟机实现可以为程序员或用户提供对方法区域初始大小的控制,以及在方法区域大小可变的情况下,对最大和最小方法区域大小的控制。

组成:

 

注:方法区内存溢出

      1、  1.8以前会导致永久代内存溢出

      2、  1.8之后导致元空间内存溢出

运行时常量池

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

StringTable 

特性:

  • 常量池中的字符串仅是符号,第一次用到时才变为对象
  • 利用串池的机制,来避免重复创建字符串对象
  • 字符串变量拼接的原理是 StringBuilder (1.8)
  • 字符串常量拼接的原理是编译期优化
  • 可以使用 intern 方法,主动将串池中还没有的字符串对象放入串池
                 1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串池中的对象返回                  1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份,放入串池, 会把串池中的对象返回 

6、 直接内存

定义:

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

分配和回收原理

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

标签:常量,虚拟机,串池,内存,JVM,整理,线程,方法
来源: https://www.cnblogs.com/msboke/p/16216892.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有