Java内存结构和GC垃圾回收

Java系列笔记 - Java 内存区域和GC机制 关于JVM,需要说明一下的是,目前使用最多的Sun公司的JDK中,自从1999年的JDK1.2开始直至现在仍在广泛使用的JDK6,其中默认的虚拟机都是HotSpot。:直接内存并不是JVM管理的内存,可以这样理解,直接内存,就是JVM以外的机器内存,比如,你有4G的内存,JVM占用了1G,则其余的3G就是直接内存,JDK中有一种基于通道(Channel)和缓冲区(Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来引用。 阅读详情

Java 内存结构

Java内存模型和多线程JMM相关

Java内存结构和JVM虚拟机存储空间相关

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZyfpDHrj-1577000962927)(E:\研究生\面试知识\java内存结构.jpg)]

  • 方法区

    什么是方法区:也称永久区,static关键词修饰、常量信息;当class文件被加载的时候,就会被初始化;

    调优问题:

    1. 不能定义太多常量,不然垃圾回收机制是不会回收方法区的,占用内存,产生内存溢出问题
    2. 所有线程会共享静态变量,要注意线程安全问题
  • 堆(参数调优重点关注)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbmiPXjQ-1577000962928)(E:\研究生\面试知识\堆.jpg)]

    什么是堆:new创建的对象、数组等都会存放在堆中,所有线程会被共享;堆内存中分配了两个区:新生代和老年代(分代的目的是为了垃圾回收机制)

    • 新生代

      刚创建的对象,先存放在新生代中,分为eden、s0、s1区

      • 刚创建的对象会存储在eden区
      • s0区和s1区大小相等
      • 垃圾回收机制主要回收新生代
    • 老年代

      如果对象在频繁的使用,则放在老年代

    • 堆的参数配置

      -XX :+PrintGC 每次触发GC的时候打印相关日志

      -XX:+UserSerialGC 串行回收

      -XX:+PrintGCDetails 更详细的GC日志

      -Xms 堆初始值

      -Xmx 堆最大可用值尽量减少垃圾回收次数

      -Xmn 新生代堆最大可用值

      -XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例为n/1

      总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率

      -XX:NewRatio=2 总结:不同的分布情况,对系统执行会产生一定的影响,在实际工作中,应根据系统的特点做出合理的配置,基本策略:尽可能将对象留在新生代,减少老年代的GC次数。除了可以设置新生代的绝对大小(-Xmn),可以使用(-XX:NewRatio)设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代

  • 栈

    什么是栈:类的方法;局部变量,代码运行完毕自动释放,每个线程私有,互不共享,不会产生线程安全问题

  • 本地方法栈

    作用:主要调用c语言,android中会用到;

jvm参数调优
  1. 堆初始值与堆内存的最大值一定要保持一致
    • 减少垃圾回收机制次数
  2. 设置新生代与老年代的回收比例
    • 新生代:老年代=1/3 或者1/4
堆溢出
  • 错误原因

    java.lang.OutOfMemoryError : Java heap space 堆内存溢出

  • 解决办法

    设置堆内存大小 -Xms1m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError

  • Tomcat 内存溢出在catalina.sh修改JVM堆内存大小

    JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"
    
栈溢出
  • 错误原因

    java.lang.StackOverflowError 栈内存溢出,栈溢出产生于递归调用,循环遍历是不会的,但是循环方法里面产生的递归调用,也会发生栈溢出,

  • 解决办法

    设置线程最大调用深度

    -Xss5m 设置最大调用深度

JVM参数调优总结

在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到的一些目标:

  • GC的时间足够小
  • GC的次数足够少
  • 发生Full GC(新生代和老生代)的周期足够的长

前两个目前是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够小,必须保证一个更大的堆,我们只能取其平衡

垃圾回收机制

垃圾回收机制不定时,向堆内存清理不可达对象。其简要过程如下:

不可达对象并不会马上被直接回收,而是至少要经过两次标记的过程。第一次被标记的对象,会检查该对象是否重写了finalize()方法。如果重写了该方法,则将其放入一个F-query队列中,否则,直接将对象加入“即将回收”集合。在第二次标记之前,F-Query队列中的所有对象会逐个执行finalize()方法,但是不保证该队列中所有对象的finalize()方法都能被 执行,这是因为JVM创建一个低优先级的线程去运行此队列中的方法,很可能在没有遍历完之前,就已经被剥夺了运行的权利。那么运行finalize()方法的意义何在呢?这是对象避免自己被清理的最后手段;如果在执行finalize()方法过程中,使得此对象重新与GC Roots引用链相连,则会在第二次标记过程中将此对象从F-Query队列中清除,避免在这次回收中被清除,恢复成一个“正常”的对象。但显然这种好事不能无限的发生,对于曾经执行过一次finalize()的对象来说,之后如果再被标记,则不会再执行finalize()方法,只能等待被清除的命运。

之后,GC将对F-Queue中的对象进行第二次小规模的标记,将队列中重新与GC Roots引用链恢复连接的对象清除出“即将回收”集合。所有此集合中的内容将被回收。

内存溢出和内存泄露
  • 内存溢出

    需要4g,只有3g

  • 内存泄露

    对象已经没有被应用程序使用,但是垃圾回收器没办法移除他们,因为还在被引用着。

调优策略
  1. 尽量减少垃圾回收次数
  2. 尽量减少常量信息
  3. 新生代回收次数比老年代多
Java垃圾回收算法
  • 标记清除法–碎片化(一般不用)

    标记清除算法为每个对象做一个标记,0可达,1不可达,对象没有经常使用,将对象标记为1不可达,容易造成碎片化

  • 标记压缩–老生代

    先进行排序,再进行删除,不会产生碎片

  • 引用计数法–新生代

    每个对象都会有一个标记,默认是15,gc回收的时候,对象不可达则减一,可达则加一,直到机会为0进行回收,如果超过15,则进入s0区或者s1区;

    优点:引用计数收集器可以很快的执行,交织在程序运行中,对程序需要不被长时间打断的实时环境比较有利。

    缺点:无法检测出循环引用,如父对象有一个对子对象的应用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0,而且每次加非常浪费内存。

  • 复制算法–新生代(老年代没有)

    只有一个区域可以存活,只需要移动堆顶指针,按顺序分配内存即可

    优点:连续性,不会产生碎片化,运行高效

    缺点:课使用内存降为原来一半

  • 分代算法–新生代和老年代

垃圾回收的时候会出现停顿现象,垃圾回收的任务是识别和回收垃圾对象进行内存清理,为了让垃圾回收器可以进行更高效的执行,大部分情况下,会要求系统进入一个停顿的状态。停顿的目的是为了终止所有的应用线程,只有这样的系统才不会有新垃圾的产生。同时停顿保证了系统状态在某一瞬间的一致性,也有利于更好的标记垃圾对象。因此在垃圾回收时,都会产生应用程序的停顿

垃圾收集器
串行回收器

单线程执行回收操作,回收期间暂停所有应用线程的执行,client模式下的默认回收器,通过-XX:+UseSerialGC命令行可选项强制执行

并行回收器(多线程回收垃圾)

并行回收器在串行回收器的基础上做了改进,可以使用多个线程同时进行垃圾回收,对于计算能力强的计算机而言,可以有效缩短垃圾会后所需要的间际时间

CMS

CMS回收器(Concueernt Mark Sweep Collector)是回收停顿时间比较短、目前比较常用的垃圾回收器。它通过

  • 初始标记(Initial Mark)
  • 并发标记(Concurrent Mark)
  • 重新标记(Remark)
  • 并发清除(Concurrent Sweep)

四个步骤完成垃圾回收,第一和第三步还是会造成STW(Stop The World)即垃圾回收的某个阶段会暂停整个应用程序的执行,而第2、4步的并发标记和并发清除两个阶段可以和应用程序并发执行,也是比较耗时的操作,但并不影响整个程序的正常执行。

由于CMS采用的是标记清除算法,因此会产生大量的空间碎片,为了解决这个这个问题,CMS可以通过配置**-XX:+UserCMSCompactAtFullCollection参数,强制JVM在FGC完成后对老年代进行压缩,执行一次碎片化整理,但是空间碎片整理阶段也会引发STW。为了减少STW次数,CMS还可以通过配置-XX:CMSFullGCsBeforeCompaction=n**参数,在执行n次FGC后,JVM再在老年代执行空间碎片整理。

G1(Garbage-First Garbage Colletor)

Hotspot在JDK7中推出了新一代G1垃圾回收,通过-XX:+UseG1GC参数启用。和CMS相比,G1具有压缩功能,能避免碎片化问题,G1的暂停时间更加可控

G1将Java堆空间分割为若干相同大小的区域,即region,包括Eden(年轻代)、Survivor(年轻代)、Old(老年嗲)、Humongous(巨型对象区域)四种类型。其中,Humongous是特殊的Old类型,专门放置大型对象。这样的划分方式意味着不需要一个连续的存储空间管理对象。G1将空间分为多个区域,优先回收垃圾最多的区域。G1采用的是“Mark-Copy(标记整理)”,有非常好的空间整合能力,不会产生大量的空间碎片。G1的一大优势在于可预测的停顿时间,能够尽可能快的在指定的时间内完成垃圾回收任务。在JDK11中,已经将G1设为默认垃圾回收器,通过jstat命令可以查看垃圾回收情况。

G1的整理标记和CMS一样,分为5个步骤

  • 初始标记(Initial Mark)) 该阶段会引起STW,会标记GC Roots直接可达的存活对象
  • 根区域扫描(Root Region Scan) 该阶段不会引起STW,它会并发地从上一阶段标记的存活区域中扫描被引用的老年代对象
  • 并发标记(Concurrent Mark) 从堆中标记存活的对象,与CMS类似
  • 重新标记(Remark) 该阶段会引起STW,与CMS类似,会完成最终标记处理
  • 清除(Cleanup) 改阶段会统计所有区域中的存活对象,并将待回收区域按照回收价值排序,优先回收垃圾最多的区域
【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、JVM内存泄露和溢出 一、前言最近要准备找工作,JVM肯定是跑不掉的面试内容,所以把JVM相关的内容拿来认真学习一遍,整理成自己能够快速消化的提纲,方便随时可以调用。主要分JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略 四个方面展开。二、JVM结构JVM的内部结构直接贴图: 各部分的主要功能: 类加载器 JVM启动,程序开始执行时,负责将class字节码加载到JVM内存区域中 执行引擎 负责 阅读详情

相关推荐

面试讲解JAVA GC(垃圾回收机制)

1.什么是GC? 大白话说就是垃圾回收机制,内存空间是有限的,你创建的每个对象和变量都会占据内存,gc做的就是对象清除将内存释放出来,这就是GC要做的事。 2.需要GC的区域 说起垃圾回收的场所,了解过JVM(Java Virtual Machine Model)内存模型的朋友应该会很清楚,堆是Java虚拟机进行垃圾回收的主要场所,其次要场所是方法区。 3.堆内存的结构(1.7) 在JDK1.8之后,堆的永久区取消了 由元空间取代 Java将堆内存分为3大部分:新生代、老年代和永久代,其中新生代

代码界的扛把子 3609

Java中的“别名现象”

今天看Java编程思想这本书,书中提到“别名现象”,看完后自己就写写自己的对“别名现象”的理解 假设有一个类(class),它有两个实例(t1 和 t2),原本t1和t2分别指向两个不同的对象。如果执行t1=t2, 则t1这个引用就会被覆盖,也就是丢失了;而那个不再被引用的对象会由“垃圾回收器”自动清理。这种特殊的现象通常称作“别名现象”。

小嗨嗨的博客 784

基础语法周考试题

1.关于Java语言的特征,描述正确的是 A.支持跨平台(Windows,Linux,Unix等) B. GC(自动垃圾回收),提高了代码安全性 C.支持类似C的指针运算操作 D.java语言是面向对象的语言

Java基础题27:(多选题)下列描述中,哪些符合 Java 语言的特征( )

27、(多选题)下列描述中,哪些符合 Java 语言的特征( ) A.支持跨平台(Windows,Linux,Unix等) B.GC(自动垃圾回收),提高了代码安全性 C.支持类 C 的指针运算操作 D.不支持与其它语言书写的程序进行通讯 【正确答案】A,B 【答案解析】java语言支持跨平台,没有指针的概念,拥有GC垃圾自动回收机制。 ...

qq_45453185的博客 3726

瑞芯微rv1126 rtsp+mpp+rga取流

瑞芯微rv1109 rtsp+mpp+rga取流

ZuoSeDiao的博客 6338

Truncated SVD for faster dection

Truncated SVD方法最先被提出在《Fast R-CNN》论文中,用于降低全连接层的运算量,提升模型的速度。在卷积神经网络的分类任务中,FC层的运算速度远远大于CONV层,而在Fast R-CNN的目标检测任务中,大多数的运算时间发生在FC 的运算中,是因为针对每张输入图片,只进行一次卷积操作,而要对生成的Region Proposal,大致两千个,进行全连接操作进行分类与Bounding...

weixin_35747666的博客 1535

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

墨鸦的博客 4万+

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 512

jvm

Ø java JVM技术 .1.     java监控工具使用 .1.1.   jconsole          jconsole是一种集成了上面所有命令功能的可视化工具,可以分析jvm的内存使用情况和线程等信息。 启动jconsole 通过JDK/bin目录下的“jconsole.exe”启动Jconsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户使用jps来查询了,双

qq_32465815的博客 356

滤波器设计实战:Filter Solutions软件从入门到精通

本文是Filter Solutions滤波器设计软件的实战指南,从入门到精通。通过设计一个低通数字滤波器的完整流程,详细讲解了参数设置、FIR/IIR选择、窗函数及逼近函数应用。文章重点介绍了如何利用这款经典工具高效完成滤波器设计、性能权衡,并将设计成果导出至MATLAB等平台进行实际验证与应用,是信号处理工程师提升效率的实用参考。

weixin_29095049的博客 531

浅聊开关电源6:大学生电赛(电源类)之LCL并网滤波器设计(PCB设计,STM32F4xx程序与Simulink仿真)

关于LCL并网滤波器设计的一些小分享

xjtuymh的博客 3651

Java内存结构、虚拟机垃圾回收和gc算法

一、Java虚拟机1. 什么是Java虚拟机main函数被执行时,java虚拟机就启动了。 你运行几个application就有几个java.exe/javaw.exe。或者更加具体的说,你运行了几个main函数就启动了几个java应用,同时也启动了几个java的虚拟机。 总结: 什么是java虚拟机,什么是java的虚拟机实例? java的虚拟机相当于我们的一个java类,而java虚拟机

guigui_oy的博客 351

【tio-websocket】15、学习tio的第1步—tio-study

tio-study 是用于学习 t-io 的示范工程,tio-study 是入门 t-io 最好的方式!tio-study 工程演示的是一个典型的 TCP 长连接应用工程,分为 server(服务端) 和 client(客户端) 工程,server 和 client 共用 common(公共模块) 工程

JACKAL 1万+

JVM调优 GC如何发现垃圾及回收垃圾 Java对象内存布局 新生代和老年代的关系和区别 可达性分析 JDK1.8堆内存结构 jvm内存结构 GC垃圾回收算法 什么是直接内存 Java引用类型 观察者

JVM调优 GC如何发现垃圾及回收垃圾Java对象内存布局新生代和老年代的关系和区别可达性分析JDK1.8堆内存结构jvm内存结构GC垃圾回收算法什么是直接内存Java引用类型观察者模式

qq_52963857的博客 433

MicroCap声学仿真介绍(一)

5-频率上下限选择,需要注意的是,第一个数字是上限,第二个数字是下限,如果填反了,会有报错提示;下三角可以选择“Auto”、“linear”、“log”和“list”,设置的是频率点之间的距离和频率点的数量。Component是用来选择部件的模块,如上图所示,声学仿真常用到的是“Electroacoustic Macros AC”、“Electroacoustic Macros TR”、“NXP Transducers”以及“NXP HD components”。3是声学部件,是声学仿真中常用的部件。

山无忧的博客 5090

反卷积通俗详细解析与nn.ConvTranspose2d重要参数解释

反卷积的作用 卷积中padding的几个概念 No Padding Half(Same) Padding Full Padding 反卷积 反卷积中的Padding参数 反卷积的stride参数 反卷积总结 参考资料

iioSnail的博客 2万+

Java虚拟机(JVM)内存结构和垃圾回收机制(GC)详解以及内存溢出(out of memory)的分析

一、JVM介绍 jvm是java virtual machine 的简称,它是java虚构出来的计算机,有自己的指令集,寄存器和堆栈内存。它屏蔽了java应用程序与具体的操作平台相关的信息,java程序只需生成jvm的目标代码既字节码,jvm通过对字节码的解释最终转化为具体平台的指令,实现了java的跨平台。 二、内存简介 jvm结构可以看成是堆内存和非堆内存组成,堆是运行时内存对象的实例化...

MonkeyKing_1990的博客 873

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jvm的垃圾回收

Java 虚拟机(JVM)的垃圾回收(GC)是自动管理内存的一种机制,它的目的是自动回收那些不再被使用的对象所占用的内存空间,以避免内存泄漏和提高系统的性能。JVM 的垃圾回收是由垃圾回收器(GC)实现的,它会定期回收堆内存中不再被引用的对象。

gggfJJ的博客 864

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java虚拟机(JVM)内存结构和垃圾回收机制(GC)详解以及内存溢出(out of memory)的分析...

一、JVM介绍 jvm是java virtual machine 的简称,它是java虚构出来的计算机,有自己的指令集,寄存器和堆栈内存。它屏蔽了java应用程序与具体的操作平台相关的信息,java程序只需生成jvm的目标代码既字节码,jvm通过对字节码的解释最终转化为具体平台的指令,实现了java的跨平台。 二、内存简介 jvm结构可以看成是堆内存和非堆内存组成,堆是运行时内存对象的实...

publicdownload的专栏 234

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

一文了解JVM的垃圾回收

当进行垃圾回收的时候,会暂停所有线程去完成垃圾回收。Minor GC :发生在新生代的垃圾回收,当eden区满了会触发,暂停时间较短。Full GC:对新生代和老年代进行完整的垃圾回收,当老年代内存不足时会触发,暂停时间长,要尽量避免。

keygwh的博客 2988

GC垃圾回收机制

在java程序运行的过程中,会产生大量的对象,因每个对象所能承担的职责不同所具有的功能不同所以也有着不一样的生命周期,有的对象生命周期较长,比如Http请求中的Session对象,线程,Socket连接等;所以这几个区域的内存分配与回收是确定的,我们不需要管的。当JVM触发GC时,首先会让所有的用户线程到达安全点SafePoint时阻塞,也就是STW,然后枚举根节点,即找到所有的GC Roots,然后就可以从这些GC Roots向下搜寻,可达的对象就保留,不可达的对象就回收。所以,垃圾回收是必须的。

CA优快云的博客 6118

JVM 内存管理与垃圾回收机制

在 Java 程序的运行过程中,JVM(Java 虚拟机)扮演着至关重要的角色,而内存管理与垃圾回收机制更是 JVM 的核心功能。它们直接影响着 Java 程序的性能和稳定性,深入理解这些机制,能帮助开发者写出更高效、更健壮的代码。

Java是世界上最好的语言 1044

Java虚拟机——垃圾回收

Java虚拟机——垃圾回收简介

AIAIAIXIAO_的博客 2252

JAVA垃圾回收

JAVA垃圾回收机制 什么是垃圾回收 垃圾回收是将没有的对象占据的空间进行回收的行为。

士雲的博客 314

JVM 及内存管理:掌握 Java 8 的内存模型与垃圾回收机制

本文从 JVM 内存模型到垃圾回收机制进行了全面解析,并介绍了 Java 8 中的重要改进。掌握这些知识不仅有助于提升代码性能,还能帮助你更好地定位和解决内存问题。在实际项目中,建议结合具体场景选择合适的垃圾回收器并进行调优,以最大化系统性能。

qq_36534560的博客 2179

java内存分配与回收策率以及Minor GC和Major GC

Java 的内存分配与垃圾回收策略是其高效内存管理的关键。通过将内存划分为新生代和老年代,并对不同代使用不同的回收策略,Java 实现了对短命对象和长期存活对象的高效管理。Minor GC 和 Major GC 分别负责不同代的垃圾回收,前者快速高效,后者负责全面清理但代价较大。随着 Java 虚拟机的发展,不同垃圾回收器不断优化,以适应不同的应用场景需求。理解和合理配置这些垃圾回收策略,是提高 Java 应用性能的关键。

Flying_Fish_roe的博客 762
上一篇: Java int和Integer的区别
下一篇: 编程题—连续子数组最大和
code_AC
博客等级 码龄12年 255粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值