
JVM
文章平均质量分 63
shumeigang
这个作者很懒,什么都没留下…
展开
-
JVM GC
原创 2024-05-11 16:43:02 · 141 阅读 · 0 评论 -
java内存泄露和如何避免内存泄漏
在这种情况下,垃圾回收器是不会回收B对象的,这就可能造成了内存不足问题,因为A可能不止引用着B对象,还可能引用其它生命周期比A短的对象,这就造成了大量无用对象不能被回收,且占据了昂贵的内存资源。同样的,B对象也可能引用着一大堆对象,这些被B对象引用着的对象也不能被垃圾回收器回收,所有的这些无用对象消耗了大量内存资源。什么是内存泄露内存泄露的定义:对于应用程序来说,当对象已经不再被使用,但是Java的垃圾回收器不能回收它们的时候,就产生了内存泄露。如下图所示,展示了哪些对象是无用对象,哪些是未被引用的对象;原创 2024-05-11 13:39:56 · 174 阅读 · 0 评论 -
java双亲委派
双亲委派(Parent Delegation)是Java类加载机制中的一种设计模式,用于确保类的加载安全性和一致性。在双亲委派模式下,一个类加载器在加载类时首先委托给其父类加载器,只有在父类加载器无法加载该类时,才由子类加载器尝试加载。但在某些特殊情况下,比如实现热部署、类隔离等功能时,可能需要自定义类加载器来实现特定的加载策略。这种机制有助于保证类的加载过程中不会出现重复加载同一个类的情况,从而避免了类的冲突和混乱。原创 2024-05-11 11:14:53 · 325 阅读 · 0 评论 -
JVM 类加载机制
初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都由 JVM 主导。5. 通过 Class.forName 加载指定类时,如果指定参数 initialize 为 false 时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。3. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触发定义常量所在的类。1. 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。原创 2024-05-11 10:34:42 · 438 阅读 · 2 评论 -
JVM学习资源
【官方文档】oracle JVM 规范说明书https://docs.oracle.com/javase/specs/jvms/se8/html/包含:JVM 的介绍;结构;编译;class 文件的结构;加载、链接、初始化;JVM 指令集;JVM 指令操作码对照表。链接是 JDK 1.8 的版本,如需看其他版本修改 url 中的 se 后的数字即可。【书籍】《Java虚拟机规范(Java SE 8版)》豆瓣上面 JVM 规范说明书的中文解读,如果不习惯看官方英文文档,可以看下本书。阐释了 JVM原创 2021-01-07 17:34:11 · 94 阅读 · 0 评论 -
GC-STW-SafePoint
Safepoint 可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,线程可以暂停。在 SafePoint 保存了其他位置没有的一些当前线程的运行信息,供其他线程读取。这些信息包括:线程上下文的任何信息,例如对象或者非对象的内部指针等等。我们一般这么理解 SafePoint,就是线程只有运行到了 SafePoint 的位置,他的一切状态信息,才是确定的,也只有这个时候,才知道这个线程用了哪些内存,没有用哪些;并且,只有线程处于 SafePoint 位置,这时候对 JVM 的堆栈原创 2021-01-07 09:46:00 · 136 阅读 · 1 评论 -
GC-STW
STWjava中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这些现象多半是由于gc引起。设置jvm参数-Xmx512m -Xms512m -Xmn1024k -XX:+UseSerialGC -Xloggc:gc.log -XX:+PrintGCDetails1、-XX:newSize...原创 2021-01-07 09:25:44 · 2000 阅读 · 0 评论 -
JVM-永久代与元空间
永久代PermGen是Permanent Generation的缩写,它是HotSpot对于JVM方法区的一种实现,也常被称为永久代。永久代是一片连续的堆空间,在JVM启动之前通过在命令行设置参数-XX:MaxPermSize来设定永久代最大可分配的内存空间,32位JVM的默认最大内存大小为64 MB,64位版本为82 MB。永久代的垃圾收集是和老年代(old generation)在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。移除永久代的工作从JDK1.7就开始了。JDK1.7.原创 2020-08-22 16:20:40 · 750 阅读 · 0 评论 -
JVM垃级回收-判断对象已死
引用计数器法当一个地方引用它时,就+1;当引用失效时,就-1;GC会回收那些计数为0的对象。优点:简单,快捷缺点:对于相互引用的对象会失效可达性分析算法通过一系列成为“GCRoots”的对象,向下搜索,搜索所走过的路线成为引用链。若是一个对象无法通过任何引用链和GCRoots相连接,则说明该对象不可达。当对象位于引用链上时,就不回收,当对象间虽然相连,但是却不在引用链上时就是回收这一部分。可以作为GC Roots的对象为:(1). 方法区常量、类静态静态属性所引用的类(.原创 2020-08-22 10:57:18 · 278 阅读 · 0 评论 -
JVM 内存益出
内存溢出是什么?当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出。内存溢出和内存泄漏有什么区别?内存泄漏是由于使用不当,把一部分内存“丢掉了”,导致这部分内存不可用。当在堆中创建了对象,后来没有使用这个对象了,又没有把整个对象的相关引用设为null。此时垃圾收集器会认为这个对象是需要的,就不会清理这部分内存。这就会导致这部分内存不可用。所以内存泄漏会导致可用的内存减少,进而会导致内存溢出。用到的jvm参数下面为了说明溢出的情景原创 2020-08-21 18:05:31 · 190 阅读 · 0 评论 -
堆与栈
堆与栈区别栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。1 区别和联系:1.申请方式堆是由程序员自己申请并指明大小栈由系统自动分配,如声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间2.申请后系统的响应栈:只要栈的剩余空间原创 2020-08-21 16:35:39 · 147 阅读 · 0 评论 -
JVM内存区域
内存区域一方法区二堆新生代 eden survivor from survivor to老年代三程序计数器四虚拟机栈( JVM执行java方法)五本地方法栈(JVM执行本地方法)HotSpot直接内存(Direct Memory )...原创 2020-08-21 13:57:19 · 116 阅读 · 0 评论 -
java 虚拟机JVM
1、概述 1991 年Sun 公司的James Gosling 等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒、PDA 等的微处理器;1994 年将Oak 语言更名为Java; java广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合,摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想2、java技术体系结构 按照功能来划分 包括以下几个组成部分:Java程序设计语言 各种硬件平台的java虚拟机 Java API类库...原创 2020-08-20 19:27:38 · 748 阅读 · 0 评论 -
happens-before
happens-before是JMM最核心的概念happens-before字面翻译过来就是先行发生,A happens-before B 就是A先行发生于B?不准确!在Java内存模型中,happens-before 应该翻译成:前一个操作的结果可以被后续的操作获取。讲白点就是前面一个操作把变量a赋值为1,那后面一个操作肯定能知道a已经变成了1。...原创 2020-08-06 11:08:14 · 155 阅读 · 0 评论 -
JVM内存模型
JVM内存布局程序计数器:是一块较小的内存空间,可看作当前线程正在执行的字节码的行号指示器程序计数器作用1 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理2 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。...原创 2020-07-28 11:17:04 · 84 阅读 · 0 评论