精华内容
下载资源
问答
  • 深入理解jvm虚拟机

    2021-03-12 19:55:54
    深入理解jvm虚拟机 https://www.yuque.com/docs/share/87aa3eda-06f6-4ee4-8cdf-d5bd0f4073b5?# 《java核心知识点整理》

    深入理解jvm虚拟机

    https://www.yuque.com/docs/share/87aa3eda-06f6-4ee4-8cdf-d5bd0f4073b5?# 《java核心知识点整理》

    展开全文
  • 深入理解JVM虚拟机

    2020-05-28 16:29:47
    本课程将介绍JVM的核心原理,包括类加载机制的设计原理,JVM常用的参数类型,对堆内存中的Eden,S0,S1和Old区的理解,如何确定一个对象为垃圾?常用的垃圾回收算法和垃圾收集器,以及它们适用的区域和特点等等,...
  • 深入理解jvm虚拟机.txt

    2019-10-16 09:08:18
    深入理解jvm虚拟机
  • 深入理解JVM虚拟机(JVM内存模型、性能监控、虚拟机原理)一期 可惜
  • 深入理解jvm虚拟机+Android进阶之光-附件资源
  • 本文转自互联网,侵删 本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 ...本文是微信公众号【Java技术江湖】的《深入理解JVM虚拟机》其中一篇,本文部分内容来源于网...

    本文转自互联网,侵删

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    https://github.com/h2pl/Java-Tutorial

    喜欢的话麻烦点下Star哈

    文章将同步到我的个人博客:

    www.how2playlife.com

    本文是微信公众号【Java技术江湖】的《深入理解JVM虚拟机》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。

    该系列博文会告诉你如何从入门到进阶,一步步地学习JVM基础知识,并上手进行JVM调优实战,JVM是每一个Java工程师必须要学习和理解的知识点,你必须要掌握其实现原理,才能更完整地了解整个Java技术体系,形成自己的知识框架。

    为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。

    如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。

    一.目标:

    1.什么是类的加载?

    2.类的生命周期?

    3.类加载器是什么?

    4.双亲委派机制是什么?

    二.原理 (类的加载过程及其最终产品):

    JVM将class文件字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构,在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.Class 对象,作为方法区类数据的访问入口。

    三.过程(类的生命周期):

    JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。其中加载、检验、准备、初始化和卸载这个五个阶段的顺序是固定的,而解析则未必。为了支持动态绑定,解析这个过程可以发生在初始化阶段之后。

    加载:

    加载过程主要完成三件事情:

    1. 通过类的全限定名来获取定义此类的二进制字节流
    2. 将这个类字节流代表的静态存储结构转为方法区的运行时数据结构
    3. 在堆中生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口。

    这个过程主要就是类加载器完成。

    校验:

    此阶段主要确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机的自身安全。

    1. 文件格式验证:基于字节流验证。
    2. 元数据验证:基于方法区的存储结构验证。
    3. 字节码验证:基于方法区的存储结构验证。
    4. 符号引用验证:基于方法区的存储结构验证。

    准备:

    为类变量分配内存,并将其初始化为默认值。(此时为默认值,在初始化的时候才会给变量赋值)即在方法区中分配这些变量所使用的内存空间。例如:

    public static int value = 123;
    

    此时在准备阶段过后的初始值为0而不是123;将value赋值为123的putstatic指令是程序被编译后,存放于类构造器方法之中.特例:

    public static final int value = 123;
    

    此时value的值在准备阶段过后就是123。

    解析:

    把类型中的符号引用转换为直接引用。

    • 符号引用与虚拟机实现的布局无关,引用的目标并不一定要已经加载到内存中。各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。
    • 直接引用可以是指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄。如果有了直接引用,那引用的目标必定已经在内存中存在

    主要有以下四种:

    1. 类或接口的解析
    2. 字段解析
    3. 类方法解析
    4. 接口方法解析

    初始化:

    初始化阶段是执行类构造器方法的过程。方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成的。虚拟机会保证方法执行之前,父类的方法已经执行完毕。如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器可以不为这个类生成()方法。

    java中,对于初始化阶段,有且只有以下五种情况才会对要求类立刻“初始化”(加载,验证,准备,自然需要在此之前开始):

    1. 使用new关键字实例化对象、访问或者设置一个类的静态字段(被final修饰、编译器优化时已经放入常量池的例外)、调用类方法,都会初始化该静态字段或者静态方法所在的类。
    2. 初始化类的时候,如果其父类没有被初始化过,则要先触发其父类初始化。
    3. 使用java.lang.reflect包的方法进行反射调用的时候,如果类没有被初始化,则要先初始化。
    4. 虚拟机启动时,用户会先初始化要执行的主类(含有main)
    5. jdk 1.7后,如果java.lang.invoke.MethodHandle的实例最后对应的解析结果是 REFgetStatic、REFputStatic、REF_invokeStatic方法句柄,并且这个方法所在类没有初始化,则先初始化。

    四.类加载器:

    把类加载阶段的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作交给虚拟机之外的类加载器来完成。这样的好处在于,我们可以自行实现类加载器来加载其他格式的类,只要是二进制字节流就行,这就大大增强了加载器灵活性。系统自带的类加载器分为三种:

    1. 启动类加载器。
    2. 扩展类加载器。
    3. 应用程序类加载器。

    五.双亲委派机制:

    双亲委派机制工作过程:

    如果一个类加载器收到了类加载器的请求.它首先不会自己去尝试加载这个类.而是把这个请求委派给父加载器去完成.每个层次的类加载器都是如此.因此所有的加载请求最终都会传送到Bootstrap类加载器(启动类加载器)中.只有父类加载反馈自己无法加载这个请求(它的搜索范围中没有找到所需的类)时.子加载器才会尝试自己去加载。

    双亲委派模型的优点:java类随着它的加载器一起具备了一种带有优先级的层次关系.

    例如类java.lang.Object,它存放在rt.jart之中.无论哪一个类加载器都要加载这个类.最终都是双亲委派模型最顶端的Bootstrap类加载器去加载.因此Object类在程序的各种类加载器环境中都是同一个类.相反.如果没有使用双亲委派模型.由各个类加载器自行去加载的话.如果用户编写了一个称为“java.lang.Object”的类.并存放在程序的ClassPath中.那系统中将会出现多个不同的Object类.java类型体系中最基础的行为也就无法保证.应用程序也将会一片混乱.

    参考文章

    https://blog.csdn.net/android_hl/article/details/53228348

    展开全文
  • 他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box、Vmare就属于系统虚拟机,他们完全是对物理计算的仿真,提供了一个可以运行完整操作系统的软件平台...

    自动内存管理机制

    Java虚拟机原理

    所谓虚拟机,就是一台虚拟的机器。他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为

    系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box、Vmare就属于系统虚拟机,他们完全是对物理计算的仿真,

    提供了一个可以运行完整操作系统的软件平台。

    程序虚拟机典型代码就是Java虚拟机,它专门为执行单个计算程序而计算,在Java虚拟机中执行的指令我们成为Java

    自己码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

    Java发展至今,出现过很多虚拟机,做初Sun使用的一款叫ClassIc的Java虚拟机,到现在引用最广泛的是HotSpot虚拟

    机,除了Sum意外,还有BEA的Jrockit,目前Jrockit和HostSopt都被oralce收入旗下,大有整合的趋势。

    Java内存结构

    d8c36f62beeea98db006f31c77a04267.png
    7efdefc48f2e9c642745d940b0367c1a.png

    1、类加载子系统:负责从文件系统或者网络加载Class信息,加载的信息存放在一块称之方法区的内存空间。

    2、方法区:就是存放类的信息、常量信息、常量池信息、包括字符串字面量和数字常量等。

    3、Java堆:在Java虚拟机启动的时候建立Java堆,它是Java程序最主要的内存工作区域,几乎所有的对象实例都存放到

    Java堆中,堆空间是所有线程共享。

    4、直接内存:JavaNio库允许Java程序直接内存,从而提高性能,通常直接内存速度会优于Java堆。读写频繁的场合可能会考虑使用。

    5、每个虚拟机线程都有一个私有栈,一个线程的Java栈在线程创建的时候被创建,Java栈保存着局部变量、方法参数、同事Java的方法调用、

    返回值等。

    6、本地方法栈,最大不同为本地方法栈用于本地方法调用。Java虚拟机允许Java直接调用本地方法(通过使用C语言写)

    7、垃圾收集系统是Java的核心,也是不可少的,Java有一套自己进行垃圾清理的机制,开发人员无需手工清理,下一节课详细讲。

    8、PC(Program Couneter)寄存器也是每个线程私有的空间, Java虚拟机会为每个线程创建PC寄存器,在任意时刻,

    一个Java线程总是在执行一个方法,这个方法称为当前方法,如果当前方法不是本地方法,PC寄存器总会执行当前正在被执行的指令,

    如果是本地方法,则PC寄存器值为Underfined,寄存器存放如果当前执行环境指针、程序技术器、操作栈指针、计算的变量指针等信息。

    9、虚拟机核心的组件就是执行引擎,它负责执行虚拟机的字节码,一般户先进行编译成机器码后执行。

    堆、栈、方法区概念区别

    Java堆

    堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

    根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为

    新生代和老年代。其中新声带存放新生的对象或者年龄不大的对象,老年代则存放老年对象。

    新生代分为den区、s0区、s1区,s0和s1也被称为from和to区域,他们是两块大小相等并且可以互相角色的空间。

    绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次

    新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。

    05d08a6a0861731939639d6df6eff879.png

    Java栈

    Java栈是一块线程私有的空间,一个栈,一般由三部分组成:局部变量表、操作数据栈和帧数据区

    局部变量表:用于报错函数的参数及局部变量

    操作数栈:主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间。

    帧数据区:除了局部变量表和操作数据栈以外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着

    访问常量池的指针,方便计程序访问常量池,另外当函数返回或出现异常时卖虚拟机子必须有一个异常处理表,方便发送异常

    的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。

    b2bb96133981cb804c22d67e3af2b34d.png

    Java方法区

    Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。

    比如类的字段、方法、常量池等。方法区的大小决定系统可以保存多少个类。如果系统

    定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出的错误。方法区可以理解

    为永久区。

    虚拟机参数配置

    什么是虚拟机参数配置

    在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障

    排查会有一定的帮助,为此,在虚拟机提供了一些跟踪系统状态的参数,使用

    给定的参数执行Java虚拟机,就可以在系统运行时打印相关日志,用于分析实际

    问题。我们进行虚拟机参数配置,其实就是围绕着堆、栈、方法区、进行配置。

    你说下 你熟悉那些jvm参数调优

    堆的参数配置

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

    -XX:+UseSerialGC 串行回收

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

    -Xms 堆初始值

    -Xmx 堆最大可用值

    -Xmn 新生代堆最大可用值

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

    含以-XX:SurvivorRatio=eden/from=den/to

    总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,

    这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。

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

    设置最大堆内存

    参数: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

    /**

    * jvm参数设置

    *

    * @author Administrator

    *

    */

    public class JvmDemo01 {

    public static void main(String[] args) throws InterruptedException {

    byte[] b1 = new byte[1 * 1024 * 1024];

    System.out.println("分配了1m");

    jvmInfo();

    Thread.sleep(3000);

    byte[] b2 = new byte[4 * 1024 * 1024];

    System.out.println("分配了4m");

    Thread.sleep(3000);

    jvmInfo();

    }

    /**

    * 转换为m

    *

    * @param maxMemory

    * @return

    */

    static private String toM(long maxMemory) {

    float num = (float) maxMemory / (1024 * 1024);

    DecimalFormat df = new DecimalFormat("0.00");// 格式化小数

    String s = df.format(num);// 返回的是String类型

    return s;

    }

    static private void jvmInfo() {

    // 最大内存

    long maxMemory = Runtime.getRuntime().maxMemory();

    System.out.println("maxMemory:" + maxMemory +

    展开全文
  • 他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box、Vmare就属于系统虚拟机,他们完全是对物理计算的仿真,提供了一个可以运行完整操作系统的软件平台...

    自动内存管理机制

    Java虚拟机原理

    所谓虚拟机,就是一台虚拟的机器。他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为

    系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box、Vmare就属于系统虚拟机,他们完全是对物理计算的仿真,

    提供了一个可以运行完整操作系统的软件平台。

    程序虚拟机典型代码就是Java虚拟机,它专门为执行单个计算程序而计算,在Java虚拟机中执行的指令我们成为Java

    自己码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

    Java发展至今,出现过很多虚拟机,做初Sun使用的一款叫ClassIc的Java虚拟机,到现在引用最广泛的是HotSpot虚拟

    机,除了Sum意外,还有BEA的Jrockit,目前Jrockit和HostSopt都被oralce收入旗下,大有整合的趋势。

    Java内存结构

    1bac738585aba8bc493e9a9af61fc254.png
    80f6d087ad00dda646fb339fdbb59863.png

    1、类加载子系统:负责从文件系统或者网络加载Class信息,加载的信息存放在一块称之方法区的内存空间。

    2、方法区:就是存放类的信息、常量信息、常量池信息、包括字符串字面量和数字常量等。

    3、Java堆:在Java虚拟机启动的时候建立Java堆,它是Java程序最主要的内存工作区域,几乎所有的对象实例都存放到

    Java堆中,堆空间是所有线程共享。

    4、直接内存:JavaNio库允许Java程序直接内存,从而提高性能,通常直接内存速度会优于Java堆。读写频繁的场合可能会考虑使用。

    5、每个虚拟机线程都有一个私有栈,一个线程的Java栈在线程创建的时候被创建,Java栈保存着局部变量、方法参数、同事Java的方法调用、

    返回值等。

    6、本地方法栈,最大不同为本地方法栈用于本地方法调用。Java虚拟机允许Java直接调用本地方法(通过使用C语言写)

    7、垃圾收集系统是Java的核心,也是不可少的,Java有一套自己进行垃圾清理的机制,开发人员无需手工清理,下一节课详细讲。

    8、PC(Program Couneter)寄存器也是每个线程私有的空间, Java虚拟机会为每个线程创建PC寄存器,在任意时刻,

    一个Java线程总是在执行一个方法,这个方法称为当前方法,如果当前方法不是本地方法,PC寄存器总会执行当前正在被执行的指令,

    如果是本地方法,则PC寄存器值为Underfined,寄存器存放如果当前执行环境指针、程序技术器、操作栈指针、计算的变量指针等信息。

    9、虚拟机核心的组件就是执行引擎,它负责执行虚拟机的字节码,一般户先进行编译成机器码后执行。

    堆、栈、方法区概念区别

    Java堆

    堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

    根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为

    新生代和老年代。其中新声带存放新生的对象或者年龄不大的对象,老年代则存放老年对象。

    新生代分为den区、s0区、s1区,s0和s1也被称为from和to区域,他们是两块大小相等并且可以互相角色的空间。

    绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次

    新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。

    3f21355f5d65889f4b0ec1ca65fc0e49.png

    Java栈

    Java栈是一块线程私有的空间,一个栈,一般由三部分组成:局部变量表、操作数据栈和帧数据区

    局部变量表:用于报错函数的参数及局部变量

    操作数栈:主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间。

    帧数据区:除了局部变量表和操作数据栈以外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着

    访问常量池的指针,方便计程序访问常量池,另外当函数返回或出现异常时卖虚拟机子必须有一个异常处理表,方便发送异常

    的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。

    9fcb51041097a8a0f96e0852eb73649d.png

    Java方法区

    Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。

    比如类的字段、方法、常量池等。方法区的大小决定系统可以保存多少个类。如果系统

    定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出的错误。方法区可以理解

    为永久区。

    虚拟机参数配置

    什么是虚拟机参数配置

    在虚拟机运行的过程中,如果可以跟踪系统的运行状态,那么对于问题的故障

    排查会有一定的帮助,为此,在虚拟机提供了一些跟踪系统状态的参数,使用

    给定的参数执行Java虚拟机,就可以在系统运行时打印相关日志,用于分析实际

    问题。我们进行虚拟机参数配置,其实就是围绕着堆、栈、方法区、进行配置。

    你说下 你熟悉那些jvm参数调优

    堆的参数配置

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

    -XX:+UseSerialGC 串行回收

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

    -Xms 堆初始值

    -Xmx 堆最大可用值

    -Xmn 新生代堆最大可用值

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

    含以-XX:SurvivorRatio=eden/from=den/to

    总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,

    这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。

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

    设置最大堆内存

    参数: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

    /**

    * jvm参数设置

    *

    * @author Administrator

    *

    */

    public class JvmDemo01 {

    public static void main(String[] args) throws InterruptedException {

    byte[] b1 = new byte[1 * 1024 * 1024];

    System.out.println("分配了1m");

    jvmInfo();

    Thread.sleep(3000);

    byte[] b2 = new byte[4 * 1024 * 1024];

    System.out.println("分配了4m");

    Thread.sleep(3000);

    jvmInfo();

    }

    /**

    * 转换为m

    *

    * @param maxMemory

    * @return

    */

    static private String toM(long maxMemory) {

    float num = (float) maxMemory / (1024 * 1024);

    DecimalFormat df = new DecimalFormat("0.00");// 格式化小数

    String s = df.format(num);// 返回的是String类型

    return s;

    }

    static private void jvmInfo() {

    // 最大内存

    long maxMemory = Runtime.getRuntime().maxMemory();

    System.out.println("maxMemory:" + maxMemory +

    展开全文
  • 深入理解JVM虚拟机:(一)Java运行时数据区域 深入理解JVM虚拟机:(二)垃圾收集器概述 深入理解JVM虚拟机:(三)类文件结构(上) 深入理解JVM虚拟机:(四)类文件结构(下) 我们了解了Java虚拟机的内存...
  • 深入理解jvm虚拟机

    2019-05-05 14:09:58
    深入理解jvm虚拟机JVMJvm基本概念运行过程运行内存区域程序计数器虚拟机栈本地方法栈堆方法区/永久代1.8元数据区新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段...
  • 运行时数据区域image.png程序计数器当前线程执行字节码的行号指示器,通过改变程序计数器的值来选取...虚拟机虚拟机栈也是线程独有的,每个方法在执行的同时都会建立一个栈帧,用于储存局部变量表,操作数栈,动态链接...
  • 1. 深入理解JVM虚拟机(一):JDK、JRE、JVM的区别 在讲解 JVM 虚拟机知识之前,我们有必要先弄清它的概念。 很多程序员已经干了一段时间 Java 开发了依然不明白 JDK、JRE、JVM 的区别,现在我们就捋一捋: 概念...
  • 深入理解jvm虚拟机

    2019-05-05 14:31:20
    深入理解jvm虚拟机二垃圾收集器Serial(单线程、复制算法)ParNew(Serial+多线程)Parallel Scavenge (多线程复制算法、高效)Serial Old (单线程标记整理算法 )Parallel Old (多线程标记整理算法)CMS(多线程...
  • 深入理解JVM虚拟机 3.6

    2018-11-05 10:46:29
    深入理解JVM虚拟机 3.6内存分配与回收策略一、Java中的自动内存管理二、Minor GC & Major GC三、新生代、老年代、永久代四、内存分配规则 内存分配与回收策略 一、Java中的自动内存管理 Java中的自动内存...
  • 深入理解JVM虚拟机虚拟机内存模型内存分区内存异常内存调优GC判断对象已死垃圾回收算法垃圾收集器垃圾回收相关指令及调优 虚拟机内存模型 内存分区 虚拟机主要分为共享的堆内存 和 每个线程独有的栈内存 细分为 堆...
  • 从底层详细讲解了jvm虚拟机的工作机制,包括内存控制、class文件标准、class文件加载,以及运行时数据的处理

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,477
精华内容 2,990
关键字:

深入理解jvm虚拟机