JVM
文章平均质量分 86
弯_弯
这个作者很懒,什么都没留下…
展开
-
【权威说明】从JVM源码的角度带你看明白Thread.sleep() 是否占用CPU?
在示例中把进程的ID打印出来了,打印出来的原因是可以使用jstack (pid 表示java进程id,可用jps命令查看) 查看所有线程的状态,jstack可以生成或导出jvm 虚拟机运行实例当前时刻的线程快照。Thread.sleep的在jvm层面上是调用thread中SleepEvent对象的**park()**方法实现阻塞线程,在此过程中会通过判断时间戳来决定线程的睡眠时间是否达到了指定的毫秒。如果睡眠的时间为0,那么会调用系统级别的睡眠方法os::sleep(),睡眠时间为最小时间间隔。原创 2023-03-13 09:58:25 · 1742 阅读 · 0 评论 -
从JVM源代码的角度一步一步给你讲清楚线程状态的本质以及线程状态的由来
从源码可知,根据操作java字段把java状态的偏移量拿出来,java状态的偏移量就是thread中的成员threadstatus(线程状态)的相对于它对象的头部偏移量,然后把状态state放进去,简单说就是C++中操作java的成员变量,把threadstatus的地址拿出来,把线程的state值放进去,把线程状态修改为sleeping。接来敲黑板,考试重点来了, 线程状态是如何修改的,以javaThread::sleep(jlong millis)为例进行解释,这个过程是在C++中进行的。原创 2023-03-06 09:21:50 · 436 阅读 · 0 评论 -
源码深度解析Spring Bean的加载
如果从缓存职工得到了bean的原始状态,则需要对bean进行实例化,调用getObjectForBeanInstance()方法检测当前bean是否是FactoryBean类型的bean,如果是,那么需要调用该bean对应的FactoryBean实例中的getObject()作为返回值,具体代码实现实现如下,在Sring 的加载过程中,在初始化某一个bean的时候首先会初始化这个bean所对应的依赖。那么当依赖注入的时候,就会产生当A 还未创建完的时候因为对于B 的创建再次返回创建A,原创 2023-02-13 09:05:42 · 471 阅读 · 0 评论 -
JVM笔记:垃圾回收器总结
垃圾收集器分类作用位置使用算法特点使用场景erial串行运行作用于新生代复制算法响应速度优先适用于单CPU环境下的client模式ParNew并行运行作用于新生代复制算法响应速度优先多CPU环境Server模式下与CMS 配合使用Parallel并行运行作用于新生代复制算法吞吐量优先适用于后台运算而不需要太多交互的场景Serial Old串行运行作用于老年代标记-压缩算法响应速度优先适用于单CPU环境下的client模式并行运行作用于老年代。原创 2022-11-07 14:16:18 · 412 阅读 · 1 评论 -
JVM笔记:垃圾回收及垃圾回收算法
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便 JVM 将整理出的内存分配给新的对象。原创 2022-10-31 09:14:31 · 267 阅读 · 1 评论 -
从多个维度剖析a++/++a为什么不是线程安全的
从多个维度剖析a++/++a为什么不是线程安全的原创 2022-10-24 06:00:00 · 506 阅读 · 1 评论 -
JVM笔记:对象实例化
已使用的内存和未使用的内存相互交错,那么虚拟机将采用的是空闲列表来为对象分配内存。也可能导致OutofMemoryError异常由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。直接指针是局部变量表中的引用,直接指向堆中的实例,在对象实例中有类型指针,指向的是方法区中的对象类型数据。原创 2022-10-17 09:09:50 · 149 阅读 · 0 评论 -
JVM笔记: 垃圾回收相关概念
它用以实现对象的finalize()方法,也可以称为终结器引用。无需手动编码,其内部配合引用队列使用。在GC时,终结器引用入队。由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize()方法,第二次GC时才能回收被引用对象。原创 2022-10-13 09:27:28 · 206 阅读 · 1 评论 -
JVM笔记: 执行引擎
执行引擎是Java虚拟机核心的组成部分之一。虚拟机的执行引擎是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。原创 2022-10-08 09:34:44 · 317 阅读 · 1 评论 -
JVM笔记:GC 日志分析
通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。原创 2022-08-30 09:01:15 · 397 阅读 · 0 评论 -
jvm笔记:运行时数据区之方法区
方法区(Method Area) 是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。...原创 2022-08-09 13:32:50 · 443 阅读 · 0 评论 -
JVM笔记:java堆
在java应用程序中,java堆 是虚拟机所管理的内存职工最大的一块,java堆是被所有线程共享的一块内存区域,在虚拟机启动时就会创建堆。 java堆的唯一目的就是存放对象实例和数组,几乎所有对象实例和数组都在这里分配内存。java堆是垃圾收集器管理的内存区域。Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。...原创 2022-07-18 09:42:02 · 233 阅读 · 0 评论 -
JVM笔记:java虚拟机栈
java虚拟机是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是java方法执行的线程内存模型,每个方法被执行的时候,java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。...原创 2022-07-15 09:33:49 · 1924 阅读 · 0 评论 -
JVM笔记: JVM内存模型
JVM内存布局规定了java在运行过程中内存申请、分配、管理的策略,保证了jvm的高速运行。不同的JVM对于不同的花费方式和管理机制存在着部分差异。Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。根据JVM 规范, JVM内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五部分。......原创 2022-06-22 14:29:06 · 310 阅读 · 0 评论 -
JVM笔记:类加载子系统
类加载子系统负责从文件系统或者网络中加载.class文件,class文件在文件开头有特定的文件表示.ClassLoader只负责class文件的加载,至于它是否可以运行,则由Exceution Engiine决定.加载的类信息存放于一块成为方法区的内存空间,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量....原创 2022-06-16 14:17:05 · 135 阅读 · 0 评论 -
JVM 笔记:类加载子系统
在开始了解类加载子系统之前,先来看一下简版的内存结构:把上图详细后得到下图:类加载器与类的加载过程类加载器自用负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。ClassLoader 只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块成为方法区的内存空间,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部门的内存.原创 2022-05-24 16:21:52 · 113 阅读 · 0 评论 -
JVM笔记:JVM的整体架构
jvm的整体架构原创 2022-05-16 15:05:14 · 359 阅读 · 1 评论 -
JVM 笔记:java虚拟机简介
java虚拟机的简介原创 2022-05-13 09:30:46 · 135 阅读 · 0 评论
分享