
JVM_Java虚拟机
春风化作秋雨
学而思,思而学
展开
-
java 原子操作
1、原子操作原子操作(atomic operation)是指不可被中断的一个或一系列的操作。2、实现方式处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。Java 中可通过锁和自旋CAS 的方式来实现原子操作。 CAS 操作:Compare AndSet,或是 CompareAnd Swap,如今几乎所有的 CPU 指令都支持CAS 的原子操作。3、特点原子操作,是一个不受其他操作影响的操作任务单元。原子操作是在多线程环境下避免数据不一致必要手段。...原创 2022-01-09 20:03:15 · 3123 阅读 · 0 评论 -
Java Executor 和 Executors
1、Executor 是接口,基本定义线程池。package org.springframework.core.task;import java.util.concurrent.Executor;public interface TaskExecutor extends Executor { void execute(Runnable var1);}ExecutorService 接口继承了 Executor 接口并进行了扩展,提供了更多的方法我们能获得任务执行的状 态并且可以原创 2022-01-09 19:49:25 · 640 阅读 · 0 评论 -
为什么要使用线程池
1、每次执行任务创建线程并执行有一定的性能开销,因为启动一个新线程比较耗时、耗资源。2、调用 new Thread() 创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的相互竞争,会导致过多占用系统资源而导致系统瘫痪,还有过多的线程,线程之间的频繁的上下文切换消耗很多系统资源。3、直接使用 new Thread() 启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。...原创 2022-01-09 19:35:22 · 418 阅读 · 0 评论 -
java 中守护线程和本地线程区别
1、java 线程分两种1)守护线程(Daemon)2)用户线程(User)2、线程设置任何线程都可设置为守护线程和用户线程。方法: Thread.setDaemon(boolean);true 则把该线程 设置为守护线程,false 则为用户线程。说明:Thread.setDaemon(boolean) 须在 Thread.start()之前调用,否则运行时会抛出异常。3、两者的区别唯一区别:判断虚拟机(JVM)何时离开,Daemon Thread 是为其他线程提供服务..原创 2022-01-06 21:18:25 · 2205 阅读 · 0 评论 -
jvm思维导图
原创 2022-01-04 22:46:38 · 317 阅读 · 0 评论 -
什么是JVM
JVM ,是可运行 Java 代码的虚拟计算机 ,它包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆和一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件;字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。① Java 源文件->编译器->字节码文件。② 字节码文件->JVM->机器码。每一种平台的解释器是不同的,但是实现的虚拟机是相原创 2021-12-30 22:16:27 · 1045 阅读 · 0 评论 -
Java最大的优势
Java最大优势:跨平台。所谓跨平台,是指使用Java语言编写的程序,一次编译后,可在多个系统平台上运行;包括:windows、linux、unix等。实现原理:Java程序通过Jvm虚拟机在系统平台上运行。也就是说,只要系统安装相应的Jvm虚拟机,就可以运行Java程序。...原创 2021-12-29 21:23:27 · 298 阅读 · 0 评论 -
常见 JVM 调优参数
1、-Xms 512m:初始化堆内存大小为 512m。2、-Xmx 512m:堆最大内存为 512m。3、-XX:NewRatio=4:设置老年代与年轻内存比例为 4:1。4、-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:1。5、–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合。6、-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合原创 2021-12-29 21:01:23 · 1621 阅读 · 0 评论 -
JVM 调优工具
Jdk本身自带很多监控工具,位于 Jdk安装路径/bin 目录下面,其中常用监控工具是jconsole 和 jvisualvm。1、jconsole用于对 JVM 中的内存、线程以及类对象实例等进行监控。2、jvisualvmJdk 自带的全能分析工具,可对内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等进行分析。...原创 2021-12-29 20:55:59 · 100 阅读 · 0 评论 -
分代垃圾回收器工作原理
分区:分代垃圾回收器分为两个区:新生代、老生代。占比:新生代默认占总空间的 1/3,老生代默认占总空间的2/3。新生代,使用复制算法,新生代又分为3 个区:Eden、From Survivor、To Survivor,默认比例是 8:1:1,执行流程如下:1、把 Eden + From Survivor 存活的对象转移至To Survivor 区。【迁移】2、清空 Eden 、From Survivor 两个分区。【清空】 3、From Survivor 和...原创 2021-12-29 20:50:56 · 629 阅读 · 0 评论 -
新生代垃圾回收器和老生代垃圾回收器
新生代垃圾回收器,一般采用复制算法,复制算法的优点是效率高,缺点是内存利用率低。老年代垃圾回收器,一般采用标记-整理算法进行垃圾回收。1、新生代回收器Serial、ParNew、Parallel Scavenge2、老年代回收器Serial Old、Parallel Old、CMS3、整堆回收器G1...原创 2021-12-29 20:35:38 · 804 阅读 · 0 评论 -
CMS 垃圾回收器
CMS ,Concurrent Mark-Sweep ,它是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。适用于对服务器响应速度有要求的应用上。在启动 JVM 时,参数添加上“-XX:+UseConcMarkSweepGC”,从而指定使用 CMS 垃圾回收器。CMS 使用标记-清除算法实现的,在 GC 时会产生大量的内存碎片,当剩余内存不足时,系统将会出现 Concurrent Mode Failure,CMS 临时采用 Serial Old 回收器进行垃圾清除,此时系统性能会降低。...原创 2021-12-29 20:31:17 · 186 阅读 · 0 评论 -
JVM 垃圾回收器
1、Serial早期的单线程串行垃圾回收器。2、Serial Old老年版本的Serial 单线程垃圾回收器,可作为 CMS 垃圾回收器的备选预案。3、ParNew是 Serial 的多线程版本垃圾回收器。4、Parallel 类似 ParNew 垃圾回收器,也是多线程的;不同的是Parallel 是吞吐量优先的收集器,可牺牲等待时间换取系统的吞吐量。5、Parallel Old 老生代版本 Parallel 的垃圾回收器 ,Parallel 使用的是复制清除回收算法,.原创 2021-12-29 20:22:29 · 89 阅读 · 0 评论 -
JVM 垃圾回收算法
1、标记-清除算法标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。2、标记-整理算法标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。3、复制算法按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,使用量减半。4、分代算法根据对象存活周期的不同将内存划分为若干块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。...原创 2021-12-28 22:16:22 · 214 阅读 · 0 评论 -
JVM垃圾回收器如何判断对象是否可以被回收
1、引用计数器为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。缺点:无法解决循环引用问题。2、可达性分析从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。判断逻辑:当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。...原创 2021-12-28 22:13:00 · 437 阅读 · 0 评论 -
JVM中类装载的执行过程
类装载分为五个步骤:1、加载:按照路径查找class 文件并导入。2、检查:检查加载的 class 文件正确性。3、准备:给类中的静态变量分配内存空间。4、解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标识,而在直接引用直接指向内存中的地址。5、初始化:对静态变量和静态代码块执行初始化工作。...原创 2021-12-28 22:05:18 · 802 阅读 · 0 评论 -
JVM 虚拟机堆和栈区别
1、功能不同堆是用来存放对象实例;栈是用来执行程序(线程)的。2、空间不同堆的大小远大于栈。3、共享不同堆是线程共享的;栈是线程私有的。原创 2021-12-28 21:58:18 · 500 阅读 · 0 评论 -
JVM 运行时数据区
不同JVM,运行时数据区略微有不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为五部分:1、程序计数器(Program Counter Register)当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;2、Java 虚拟机栈(Java Virtual Machine Stacks)用于存储局部变量表、操作数栈、动态链接、方法出原创 2021-12-28 21:45:23 · 272 阅读 · 0 评论 -
JVM 主要组成部分及其作用
1、JVM主要组成部分1、类加载器(ClassLoader)2、运行时数据区(Runtime Data Area) 3、执行引擎(Execution Engine) 4、本地库接口(Native Interface)2、组件的作用首先,通过类加载器(ClassLoader)会把 Java 代码转换成字节码;其次,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作...原创 2021-12-28 21:40:42 · 6425 阅读 · 3 评论 -
何为应用上下文
通常意义,“上下文”,代表的其实是一个整体环境;比如说文章,可以说上文中,访问到上文所陈述的内容,也可以说下文中,访问到下文中的内容,而我们这篇文章中每一段文字所代表的意思,是要根据我们的上下文来决定的,因为你随便拿出来一句话不去结合整体的语境去理解出来的意思肯定不是准确的,所以,我们这篇文章的上下文就是我们整篇的中心思想。举例:Spring中的数据源,就是存储在上下文中的,此时,不论是哪里的代码,都是可以通过上下文获取到数据连接并进行相关的操作的。同样,也可在任何地方通过spring中的上下文获取到b原创 2021-10-09 10:08:18 · 1113 阅读 · 0 评论 -
jvm内存模型思维导图
参考:https://blog.csdn.net/shiniannian/article/details/104989711http://www.ujiuye.com/wenda/2021/69897.htmlhttps://blog.csdn.net/qzqanzc/article/details/81008598原创 2021-09-07 14:12:10 · 114 阅读 · 0 评论 -
Java虚拟机内存区域模型,读完便入门
最近抽空看了一点《深入理解Java虚拟机》,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用、服务对象以及其中可能产生的问题,作为大家的面试宝典。 首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域,这些区域都有各自的用途,各自的创建和销毁的时间。有的区域随着虚拟机进程的启动而存在,有些区域则...原创 2018-11-29 22:26:32 · 178 阅读 · 0 评论 -
一段Java程序的生命史
作为一名程序猿 ,我们每天都在写Code,但你真的了解它的生命周期么?今天就来简单聊下它的生命历程,说起一段Java Code,从出生到game over大体分这么几步:编译、类加载、运行、GC。编译Java语言的编译期其实是一段“不确定 ”的过程,因为可能是一个前端编译器把.java文件转变为.class文件的过程;也可能是指JVM的后端运行期编译器(JIT编译器)把字节码转变为机器码的...转载 2018-11-28 22:48:55 · 258 阅读 · 0 评论 -
JVM基本原理,简明扼要,通俗易懂
关键词:jvm内存模型,垃圾收集算法,垃圾收集器,调优方法,监控工具一:虚拟机内存图解JAVA程序运行于虚拟机之上,运行时需要内存空间。虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理。虚拟机管理内存数据区域划分如下图:数据区域分类:方法区 (Method Area)虚拟机栈 (VM Stack)本地方...转载 2018-08-16 16:44:28 · 3121 阅读 · 0 评论 -
JVM知识点总览:高级Java工程师面试必备
1、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。2、Java代码是怎么运行的...转载 2018-07-27 09:29:52 · 462 阅读 · 0 评论