JVM分区详解

一、内存分配与回收

JVM是Java虚拟机的缩写,是Java语言最重要的一部分,是一个虚拟的计算机。当Java程序运行时,JVM会为程序分配一块内存,这块内存被称为JVM的堆内存。当Java程序创建对象时,编译器会把变量名解析为对对象的引用。JVM会通过循环遍历可达对象的链表,在你不需要使用这些对象时回收它们占用的内存。

二、JVM分区与GC算法

JVM把堆分成了新生代和老年代两个区域。新生代主要用于存放新创建的对象,老年代用于存放已经存活了一段时间的对象。JVM使用不同的垃圾回收算法来回收不同的分区空间。

三、JVM分区详解

在JVM里,堆分为两块区域:新生代和老年代。新生代又被分为两块区域:Eden空间和两块Survivor空间。新创建的对象首先会被分配到Eden空间中,当Eden空间满时,JVM的垃圾回收器会扫描这些存活的对象,将它们复制到一个Survivor空间中。Survivor空间也被JVM分为了两个区域。垃圾回收器会不断地扫描这些对象,直到它们被放到老年代。

老年代主要用于存储一些生命周期比较长的对象,比如静态变量和常量池。老年代中存储的对象比新生代中存储的对象生命周期要长,JVM使用了不同的回收算法来处理老生代的垃圾回收。

四、新生代分区详解

新生代内存分为Eden区、Survivor区0和Survivor区1三个部分。其中Eden区主要用于存放新创建的对象,Survivor区用于存放从Eden区中复制过来并经过了一次GC仍然存活的对象。这些对象将会在Survivor的两个空间中来回移动,最终被选出即将要晋升到老生代的对象放置在Survivor区1中。

public class ObjectDemo{
   public static void main(String[] args){
      ObjectDemo obj1, obj2, obj3;
      obj1 = new ObjectDemo();
      obj2 = new ObjectDemo();
      obj3 = new ObjectDemo();
      System.out.println("ObjectDemo 创建了3个实例");
   }
}

五、老生代分区详解

老生代存储的对象生命周期比新生代中的对象要长得多,这里主要存放一些生命周期比较长的对象,比如静态变量和常量池。老年代的垃圾回收一般是使用标记-清除算法,并且在清除后会产生大量的内存碎片。为了减少内存碎片的产生,JVM将老生代分为了不同的区域,每个区域内都是满足连续内存的。当某个区域内的内存使用完时,会把其中的存活对象移到其他区域中,并且在这个过程中会进行压缩,消除内存碎片问题。

public class ObjectDemo{
   public static void main(String[] args){
       ObjectDemo obj1 = new ObjectDemo();
       ObjectDemo obj2 = new ObjectDemo();
       System.gc();
       System.out.println("第一次gc完成");
       ObjectDemo obj3 = new ObjectDemo();  
       ObjectDemo obj4 = new ObjectDemo();
       obj3 = null;  
       obj4 = null;
       System.gc();
       System.out.println("第二次gc完成");
   }
}

六、永久代与元空间

在JDK8之前,Java虚拟机的永久代是用于存储虚拟机自身的类元数据的区域,并且这个区域是非常少被使用到的。而在JDK8之后,永久代被彻底移除了,取而代之的是元空间,它是使用本地内存来存储类元数据,因为它不再是虚拟机内部的一块区域了。元空间内存使用的变化和永久代有些不同,只需要设置一个大小上限就可以了。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/191130.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-30 09:08
下一篇 2024-11-30 09:08

相关推荐

  • Deepin系统分区设置教程

    本教程将会详细介绍Deepin系统如何进行分区设置,分享多种方式让您了解如何规划您的硬盘。 一、分区的基本知识 在进行Deepin系统分区设置之前,我们需要了解一些基本分区概念。 …

    编程 2025-04-29
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25

发表回复

登录后才能评论