JVM
文章平均质量分 89
程序员资料站
目前在一线互联网大厂,乐于给大家传播分享各种资料,交个朋友。
展开
-
java对象分配过程及堆溢出测试
JVM设计者不仅需要考虑到内存如何分配,在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关, 因此还需要考虑GC执行完内存回收后是否存在空间中间产生内存碎片。原创 2022-01-15 19:40:11 · 256 阅读 · 0 评论 -
java中“堆”的相关参数demo设置
堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。 1)年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁。年轻代分成1个Eden Space和2个Survivor Space(from 和to)。 2)年老代(Tenured Gen):年老代主要存放JVM认为生命周期比较长的对象(经过几次的Young Gen的垃圾回收后仍然存在),内存大小相对会比较大,垃圾回收也相对没有那么频繁。原创 2022-01-15 19:34:39 · 277 阅读 · 0 评论 -
GC日志分析实战,你了解吗?
前言 本节我们来通过代码实战来看下GC日志的一些信息。 代码示例 我们看以下代码: package com.test; public class TestGCLog01 { private static final int _1MB = 1024*1024; /** * VM参数: * -Xms20M -Xmx20M -Xmn10M -XX:+UseParallelGC -XX:+PrintGCDetails -XX:SurvivorRatio=8 */原创 2022-01-15 13:51:33 · 97 阅读 · 0 评论 -
JVM如何判断一个对象是否存活?
前言 在 深入浅出Java虚拟机(三)——初识JVM的垃圾回收机制 中我们介绍了如何判断对象已死的两种算法,分别是引用计数法和可达性分析法。 本文我们再来详细说明一下JVM中判断对象是否、存活的相关细节。 finalize()方法的执行条件 即使在可达性分析算法中判定为不可达的对象, 也不是“非死不可”的, 这时候它们暂时还处于“缓刑”阶段, 要真正宣告一个对象死亡, 至少要经历两次标记过程: 第一次标记: 如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链, 那它将会被第一次标记, 随后进原创 2022-01-15 10:30:00 · 602 阅读 · 0 评论 -
手把手教你如何自定义一个类加载器
前言 前面 认识类加载器及双亲委派模型/ 中我们认识了类加载器,本文我们来自定义一个类加载器。 为什么需要自定义类加载器? 既然JDK已经有类加载器了,为什么还需要自定义类加载器呢?大概有以下几个原因: 隔离加载类 模块隔离,将类加载到不同的应用程序中。比如Tomcat这类web应用服务器,内部定义了好几种类加载器,用于隔离web应用服务器上不同的应用程序。 扩展加载源 还可以从数据库、网络或其他终端上加载类 防止源码泄露 Java代码容易被编译和篡改,可以进原创 2022-01-14 14:12:27 · 3351 阅读 · 1 评论 -
认识类加载器及双亲委派模型
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在创建 一个java.lang.Class对象,用来封装类在方法区内的数据结构。 >注意:JVM主要在程序第一次主动使用类的时候,才会去加载该类,也就是说,JVM并不是在一开始就把一个 >程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。原创 2022-01-14 14:09:41 · 297 阅读 · 0 评论 -
JVM常用指令实战(值得收藏即用即查)
前言 本文我们来学习下JVM中的一些常用的指令。 jps 介绍 jps 是(java process Status Tool), Java版的ps命令,查看java进程及其相关的信息,如果你想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了,简单而方便。 命令格式: jps [options] [hostid] options参数解释: -l : 显示进程id,显示主类全名或jar路径 -q : 显示进程id -m : 显示进程id, 显示JVM启动时传递给main()原创 2022-01-14 13:56:49 · 680 阅读 · 0 评论 -
JVM中类加载的过程详解
类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸载(Unloading)这7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)原创 2022-01-13 19:10:32 · 587 阅读 · 0 评论 -
Java虚拟机栈的出栈入栈流程及栈内存大小设置
Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,即生命周期和线程相同。 Java虚拟机栈和线程同时创建,用于存储栈帧。每个方法在执行时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直到执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。原创 2022-01-13 19:07:52 · 2576 阅读 · 2 评论 -
Java虚拟机(三)——初识JVM的垃圾回收机制
前言 对于程序计数器、虚拟机栈、本地方法栈这三个部分而言,其生命周期与相关线程有关,随线程而生,随线程而灭。并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回收了。因此本篇文章所讲的有关内存分配和回收关注的是Java堆与方法区这两个区域。 如何判断对象已死? 1. 引用计数法 简介 给对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1;任何时刻计数器为0的对象就是不能再被使用的,即对象已“死”。 引用计数法实现简单,判定效率也比原创 2022-01-12 19:39:21 · 304 阅读 · 0 评论 -
深入浅出Java虚拟机(二)——Java内存模型
前言 我们从一个问题入手来进行对JVM的深入理解。 JVM的内存区域是怎么高效划分的? 为什么要问到 JVM 的内存区域划分呢?因为 Java 引以为豪的就是它的自动内存管理机制。相比于 C++的手动内存管理、复杂难以理解的指针等,Java 程序写起来就方便的多。 然而这种呼之即来挥之即去的内存申请和释放方式,自然也有它的代价。为了管理这些快速的内存申请释放操作,就必须引入一个池子来延迟这些内存区域的回收操作。 我们常说的内存回收,就是针对这个池子的操作。我们把上面说的这个池子,叫作堆,可以暂时把它看成一个原创 2022-01-12 19:37:55 · 289 阅读 · 0 评论 -
深入浅出Java虚拟机(一)——初识JVM
什么是JVM JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。 一般情况下,使用 C++ 开发的程序,编译成二进制文件后,就可以直接执行了,操作系统能够识别它;但是 Java 程序不一样,使用 javac 编译成 .class 文件之后,还需要使用 Java 命令去主动执行它,操作系统并不认识这些 .class 文件。 Java 程序和我们通常使用的 C++原创 2022-01-12 19:34:21 · 309 阅读 · 0 评论