JVM实战
文章平均质量分 74
奋斗的小杨
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM运行时数据区 - 虚拟机栈
虚拟机栈是线程执行Java程序时,处理Java方法中内容的内存区域。虚拟机栈也是线程私有的区域,每个Java方法被调用的时候,都会在虚拟机栈中创建出一个栈帧。如图,栈帧又由局部变量表、操作数栈、动态链接和方法返回四部分组成,有些虚拟机的栈帧还包括了一些附加信息。原创 2024-06-05 04:30:00 · 1041 阅读 · 0 评论 -
JVM运行时数据区 - 本地方法栈
在JVM规范中,本地方法也有和Java方法一样的方法调用栈,称为本地方法栈。如果本地方法栈在动态扩展的过程中无法申请到足够的内存,或者在创建线程时,无法申请到创建方法栈所需的内存,将会抛出OutMemoryError异常(系统分配给进程内存大小上限固定,当创建线程越多,单个线程所分配的内存就越少)。在JDK自带的方法库中常常看到被native修饰的方法,这些方法没有方法体实现,它们方法体通常是由C/C++语言实现,这种方法称为本地方法。本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区。原创 2024-06-05 04:00:00 · 397 阅读 · 0 评论 -
JVM运行时数据区-方法区
JDK8以前,很多人把方法区称为永久代(Permanent Generation),实际上两者并不等价,这一说法是因为HotSpot虚拟机将垃圾收集分代设计将区域扩展到方法区,或者说永久代是方法区的实现。由于永久代更容易OOM,所以该设计在JDK7以后逐渐被淘汰,JDK1.7以后将字符串常量池和静态变量移入堆区,在JDK8以后,就不再有永久代说法,而是元空间(Meta Space)实现方法区。方法也是线程共享的区域,在JVM启动的时候被创建,并且,和堆区一样可以是逻辑上连续,物理上不连续的区域。原创 2024-06-04 23:12:39 · 538 阅读 · 0 评论 -
JVM运行数据区-Java堆
伊甸区和S0、S1区默认为8:1:1,可通过-XX:SurvivorRatio参数修改,如-XX:SurvivorRatio=6,通过监测发现设置,以后并不是6:1:1,这是因为Java堆的内存分配策略,关闭内存分配策略,-XX:-UseAdaptiveSizePolicy。堆区(Heap区)是JVM运行时数据区占用内存最大的一块区域,每一个JVM进程只存在一个堆区,它在JVM启动时被创建,JVM规范中规定堆区可以是物理上不连续的内存,但必须是逻辑上连续的内存。-Xms:设置初始堆内存,如-Xms64m。原创 2024-06-04 23:02:12 · 1427 阅读 · 3 评论 -
JVM运行时数据区 - 程序计数器
如图,Java方法编译之后会生成JVM字节码指令,字节码指令并不能被CPU直接执行,需要通过字节码执行引擎解释成机器码执行,字节码执行引擎通过程序计数器中存储指令地址,找到对应的字节码指令,如果执行引擎中正在执行0对应的指令,程序计数器中则记录的下一条指令的地址就是3,紧接着就是4,5,6,如此推进。1、保证CPU的处理器切换线程执行时,等待的线程恢复执行之后能回到正确的位置继续执行(CPU的处理器在任一时间只能执行一个线程的指令,并且会不断切换线程执行)。原创 2024-06-02 22:49:47 · 529 阅读 · 0 评论 -
JVM类加载过程
在Java虚拟机规范中,把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java.lang.Class对象,这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段,从加载到初始化就是类加载过程。原创 2024-06-02 22:18:46 · 961 阅读 · 1 评论 -
JVM类加载器
隔离类,如类路径冲突。防反编译加密Class文件。扩展类的加载源。自定义实现类加载器可以通过继承java.lang.ClassLoader并重写loadClas()方法或者实现findClass()(推荐)方法,如下代码就是加载指定目录class的简单实现。// 指定目录@Override// class文件路径is.read(b);原创 2024-06-02 22:24:04 · 1299 阅读 · 1 评论 -
JVM双亲委派模型
在之前的JVM类加载器篇中说过,各个类加载器都有自己加载的范围,比如引导类加载器只加载Java核心库中的class如String,那如果用户自己建一个包名和类名与String相同的类,会不会被引导类加载器加载。可以通过如下代码测试,通过执行结果中的报错信息可以发现,JVM实际上加载了rt.jar中的String类,并未加载自定义的String,这个就是JVM的双亲委派模型解决的问题之一。运行结果。原创 2024-06-02 22:30:29 · 981 阅读 · 0 评论
分享