JVM
文章平均质量分 63
天将今夜月
Part of the journey is the end
展开
-
JVM —— GC流程
新创建的对象一般都会被分配在新生代的 Eden 中,当某一时刻,创建的对象将 Eden 区全部挤满了,就会触发一次 Minor GC 在 Minor GC 之前,虚拟机会先检测老年代是否有足够的空间存放新生代中的对象,确保 Survivor 中放不下对象时这些对象可以进入老年代 老年代剩余空间大于新生代中对象的大小:直接 Minor GC,如果 Minor GC 后 survivor 放不下,老年代也绝对放得下 老年代剩余空间小于新生代中的对象大小:查看是否启用了「老年代空间分配担保规则」,具体来说就是看原创 2021-10-28 12:44:30 · 1578 阅读 · 0 评论 -
深拷贝与浅拷贝
深拷贝和浅拷贝 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝 ...原创 2021-09-14 19:33:31 · 69 阅读 · 0 评论 -
Java 四大引用类型
无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关 在 JDK 1.2 之前,引用的定义:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用 JDK 1.2 后,Java 对引用的概念进行了扩充,将引用分为四种: 1、强引用 【必不可少】 最普遍的引用。如果一个对象具有强引用,垃圾回收器就不会回收它。使用 new 一个新对象的方式来创建强引用 虚拟机宁愿抛出 OOM 错误,使程序异常终止,也原创 2021-09-13 13:16:28 · 122 阅读 · 0 评论 -
JVM之类的加载
类加载 类是在运行期间第一次使用时动态加载的,而不是一次性加载所有类。因为如果一次性加载,那么会占用很多的内存 类的生命周期 类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,系统加载 Class 类型的文件主要三步: 加载、连接、初始化 连接过程又可分为三步:验证、准备、解析 当类加载完毕后,堆内存的方法区中就产生了一个 Class 对象,这个对象包含了完整的类元数据 加载 加载是类加载过程的第一步,主要完成下面 3 件事情: 通过全类名,将字节码文件的内容加载到内存,获取定义此类的二原创 2021-09-13 13:15:25 · 106 阅读 · 0 评论 -
对象的创建过程
对象的创建 类加载检查、分配内存、初始化零值、设置对象头、执行 init 方法 类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程 分配内存 类加载检查 通过后,虚拟机会为新生对象 分配内存 对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来 内存分配方式有 指针碰撞 和 空闲列表 两种,选原创 2021-09-13 13:13:31 · 96 阅读 · 0 评论 -
JVM常用调优参数
JVM常用参数 调优工具 JDK 自带的调优工具:jconsole、jvisualvm(视图监控工具) jconsole:对 JVM 的内存、线程和类进行监控 jvisualvm:全能分析工具,可以分析 内存快照、线程快照、程序死锁、监控内存的变化、GC 变化等 堆参数 -Xms:初始化堆大小,默认为物理内存的 1/64 -Xmx:堆最大分配内存,默认为物理内存的 1/4 -XX:NewSize:初始化新生区内存 -XX:MaxNewSize:设置新生代最大内存大小 -XX:NewRatio=2:设置原创 2021-09-13 13:12:45 · 185 阅读 · 0 评论 -
2021-09-13
垃圾回收机制 Java 中不需要我们显式的释放对象的内存,该过程是由虚拟机自行执行的。在虚拟机中有一个垃圾回收线程,它是低优先级的,在正常情况下不会执行 只有在虚拟机空闲或者当前堆内存不足的时候,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收 垃圾回收算法:复制、标记-清除、标记-整理、分代收集算法 七个垃圾收集器:Serial (sɪriəl)、SerialOld、ParNew、Parallel Scavenge(pærəlel skævɪndʒ)、Parallel原创 2021-09-13 13:11:37 · 146 阅读 · 0 评论 -
JVM 内存结构
JVM 内存结构 JDK 1.7 之前的运行模型: JDK 1.8 之后的运行模型: 线程私有:程序计数器、虚拟机栈、本地方法栈 线程共享:堆、方法区 栈管运行,堆管存储 程序计数器 程序计数器是当前线程执行的字节码的行号指示器 两个作用: 字节码解释器通过该计数器的值来选取下一条执行的指令,从而达到代码的流程控制 在并发下,程序计数器用于记录当前线程的执行位置,从而让线程被切换回来时能够知道该线程上一次的运行位置 特点: 线程私有。每条线程都需要一个独立的程序计数器 不会发生内存溢出。程序计数器原创 2021-09-13 13:08:24 · 124 阅读 · 0 评论