![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
02JVM
文章平均质量分 71
02JVM
专注_每天进步一点点
成为健康快乐长寿有价值的人,拥有明亮灵动的眼睛,平静谦和的微笑。
展开
-
谈谈Java内存模型,你是不是开始说“Java 运行时内存区域”了?
我们常说的JVM内存模式指的是JVM的内存分区;而Java内存模式是一种虚拟机规范。Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。原始的Java内存模型存在一些不足,因此Java内存模型在Jav...转载 2022-04-16 18:00:03 · 121 阅读 · 0 评论 -
015 cpu占用太高追查;top; ps -mp PID -o THREAD,tid,time | more; printf “%x” TID; jstack PID |grep TID -A 30
1、输入top命令,实时显示 process 的动态截图如下发现是PID为23958和13772的进程占用CPU太高,但是,怎么定位到具体线程或者代码呢?2、输入 ps -mp PID -o THREAD,tid,time | more 显示线程列表将PID换成23958发现TID(线程ID)是24079的线程占用cpu太高,占用CPU时间快7个多小时了!其中24079是十进制的,将TID为24079转换为16进制格式命令:printf “%x” TID将TID替换成2.原创 2022-03-10 16:40:17 · 983 阅读 · 0 评论 -
021 处理JVM问题一般流程
问题发生后,第一时间是快速保留问题现场供后面排查定位,然后尽快恢复服务。问题发生后,第一时间是快速保留问题现场供后面排查定位,然后尽快恢复服务。问题发生后,第一时间是快速保留问题现场供后面排查定位,然后尽快恢复服务。1、问题处理总体概括问题处理分为三大类:(1)问题发生后的紧急处理原则(2)问题归类和分析(3)分析排查工具和命令通常来说,最后的解决方式有两种:第一种是最普遍的,绝大部分的最终问题原因可以定位到代码层面,修改代码后问题解决。第二种,调整某些JVM参数,缓解问题原创 2022-03-02 16:50:46 · 270 阅读 · 0 评论 -
020 JVM性能监控与故障处理工具(命令行工具)
学软件技术,读第一手资料,去官方网站:Java SE Specifications给一个系统定位的问题,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等。合理运用虚拟机监控和分析工具可以加快我们分析数据,定位解决问题。1、jps(功能单一,使用频率最高)jps(JVM Process Status Tool),查正在运行的虚拟原创 2022-03-02 11:09:09 · 1860 阅读 · 0 评论 -
019 Java对象的栈上分配问题
学软件技术,读第一手资料,去官方网站:Java SE Specifications《深入理解Java虚拟机》中原文:由于即时编译技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配、标量替换优化手段已经导致一些微妙的变化悄然发生,所以说Java对象实例都分配在堆上也渐渐变得不是那么绝对了。简单的说,逃逸分析指的是分析变量能不能逃出它的作用域。标量替换和栈上分配都是基于逃逸分析去做的。首先什么是标量,所谓的标量指的是不能进一步分解的量。像 Java 的基础数据类型(int、long等数值类型以及 r原创 2022-03-01 15:49:19 · 957 阅读 · 0 评论 -
018 Java堆中对象的创建(HotSpot虚拟机的)
JVM内存模型如下:在Java语言层面,创建对象(例如克隆、反序列化)通常仅仅是一个new关键字而已。那么,在虚拟机中,对象(这里说的是普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?虚拟机遇到一条new指令时,首先检查这个指令的参数是否在常量池中定位到一个类的引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那就需要执行相应的类加载过程。在类加载检查过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象原创 2022-03-01 14:02:48 · 588 阅读 · 0 评论 -
017 JVM中垃圾收集时的STW(Stop The World)
学软件技术,读第一手资料,去官方网站:Java SE SpecificationsGC进行时必须停顿所有Java执行线程,Sun将这件事称为 “Stop-The-World”。即使是在号称(几乎)不会发生停顿的CMS收集器中,枚举根节点也是必须要停顿的。...原创 2022-02-25 14:44:31 · 631 阅读 · 0 评论 -
016 JVM垃圾收集器,单独讲G1
学软件技术,读第一手资料,去官方网站:Java SE Specifications七:G1收集器一款面向服务端应用的垃圾收集器。特点如下:并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World停顿时间。部分收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让Java程序继续运行。分代收集:G1能够独自管理整个Java堆,并且采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的原创 2022-02-25 14:03:02 · 446 阅读 · 0 评论 -
015 JVM垃圾收集器,单独讲CMS
学软件技术,读第一手资料,去官方网站:Java SE Specifications正式进入前先看下图解HotSpot虚拟机所包含的收集器:图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。新生代收集器:Serial、ParNew、Parallel Scavenge老年代收集器:CMS、Serial Old、Parallel Old整堆收集器: G1六:CMS收集器一种以获取最短.原创 2022-02-25 13:48:20 · 424 阅读 · 0 评论 -
014 JVM垃圾收集器
学软件技术,读第一手资料,去官方网站:Java SE Specifications正式进入前先看下图解HotSpot虚拟机所包含的收集器:图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。新生代收集器:Serial、ParNew、Parallel Scavenge老年代收集器:CMS、Serial Old、Parallel Old整堆收集器: G1几个相关概念:并行收集:指多条.原创 2022-02-25 11:11:22 · 89 阅读 · 0 评论 -
013 新生代为什么设置2个Survivor区?
学软件技术,读第一手资料,去官方网站:Java SE Specifications1、新生代没有Survivor区行不行?新生代每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)。老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多。没有Survivor的情况下,有没有什么解决办法,可以避免上述情况:结论:Survivor..原创 2022-02-24 18:04:13 · 181 阅读 · 0 评论 -
012 JVM中一次完整的GC流程
学软件技术,读第一手资料,去官方网站:Java SE SpecificationsJVM堆分为新生代和老年代,比例为1:2,其中新生代又分为1个eden区和2个survivor区,比例是8:1:1GC过程:1.大对象直接进入到老年代2.小对象先在eden区分配内存,当eden满了后,触发一次Minor GC,清理eden区域3.存活下来的对象进入到survivor区域,年龄+14.当年龄>15(默认)时进入到老年代,当老年代满了后触发一次Full GC,比Minor GC慢 10倍以原创 2022-02-24 16:42:26 · 824 阅读 · 0 评论 -
011 JVM中垃圾收集算法
1.标记-清除这是垃圾收集算法中最基础的,后续的算法都是基于这种思路并对其不足进行改进的。根据名字就可以知道,它的思想就是 “标记” 那些要被回收的对象,然后统一 “清除” 回收。这种方法很简单,但是会有两个不足:1.效率不高,标记和清除的效率都很低;2.会产生大量不连续的内存碎片,导致以后程序在分配较大的对象时,由于没有充足的连续内存而提前触发一次GC动作。2.复制算法为了 “解决标记-清除” 算法的效率问题,复制算法将内存划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就.原创 2022-02-24 13:47:34 · 177 阅读 · 0 评论 -
010 垃圾回收中MinorGC,MajorGC和FullGC的区别
内存空间,堆=新生代+老年代,不包括永久代/方法区(JDK1.8把永久代剔除,换成元空间了)。新生代占堆内存的1/3,老年代占堆内存的2/3。1.GC的分类 JVM在进行GC时,可能针对三个区域进行垃圾回收分别是新生代、老年代、方法区,大部分时候回收的都是新生代。GC类型主要有以下四种类型。新生代收集(Minor GC/Young GC):只针对新生代的垃圾收集。具体点的是Eden区满时触发GC。 Survivor满不会触发Minor GC 。 老年代收集(Major GC.原创 2022-02-24 10:28:27 · 645 阅读 · 0 评论 -
009 JVM垃圾收集器回收方法区
很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,其实是有的,只不过方法区的垃圾收集效率远低于新生代的70%~95%的回收率。方法区的垃圾收集主要回收两部分内容:废弃常量和无用的类。回收废弃常量与回收Java堆中的对象非常相似。判断一个类是“无用的类”需要满足3个条件:(1)该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例(2)加载该类的ClassLoader已经被回收(3)该类对应的java.lang.Class 对象没有在任何地方被使用 ,无法原创 2022-02-23 17:15:26 · 488 阅读 · 0 评论 -
008 JVM中如何判断一个对象是否存活?(或者GC对象的判定方法)
判断一个对象是否存活有两种方法:1. 引用计数法所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收.引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象A引用对象B,对象B又引用者对象A,那么此时A,B对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法。2.可达性算法(引用链法)该算法的思想是:从一个原创 2022-02-23 16:50:24 · 311 阅读 · 0 评论 -
007 JVM堆内存划分
1、 堆在JVM内存模型中的位置Java堆(Java Heap)是java虚拟机所管理的内存中最大的一块;java堆被所有线程共享的一块内存区域;虚拟机启动时创建java堆;java堆的唯一目的就是存放对象实例;java堆是垃圾收集器管理的主要区域;从内存回收的角度来看, 由于现在收集器基本都采用分代收集算法, 所以Java堆可以细分为:新生代(Young)和老年代(Old)。 新生代又被划分为三个区域Eden、From Survivor, To Survivor等。无论怎么划分,最终原创 2022-02-23 15:01:18 · 147 阅读 · 0 评论 -
006 垃圾回收作用在JVM的哪些内存区域
JVM运行时内存区域分为:(1)线程私有:程序计数器,虚拟机栈,本地方法栈(2)线程共有:Java堆和方法区线程私有的内存区域随线程而生随线程而灭,方法结束或者线程结束时,内存自然就随着回收了。每一个栈帧中分配多少内存基本上是在类结构稳定下来时就已知的,这几个区域的内存分配和回收都具备确定性, 因此线程私有的内存区域不需要过多考虑内存回收的问题。而线程共有的内存区域则跟线程私有的不一样,一个接口中的多个实现类需要的内存可能不一样 , 一个方法中的多个分支需要的内存可能也不一样 , 我们只有在原创 2022-02-23 09:39:54 · 668 阅读 · 0 评论 -
005 JVM内存模型 / JVM内存区域 / JVM运行时数据区
JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 HotspotVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。线程共享区域随虚拟机的启动/关闭而创建/销毁。直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用: 在 JDK 1.4 引入的 NIO 提...原创 2022-02-22 15:48:27 · 139 阅读 · 0 评论 -
004 JVM的 类加载器 和 类加载器的双亲委派模型
1.什么是类加载器虚拟机设计团队把类加载中的 “通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。2.类加载器的双亲委派模型类加载器之间的这种层次关系,称为类加载器的双亲委派模型。不是继承关系而是组合关系。双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派父类加载器去完成。每一个层次的类加载器都是如此,.原创 2022-02-21 17:59:13 · 238 阅读 · 0 评论 -
003 参照操作系统来理解JVM的体系结构(包括JVM内存模型)
在了解JVM的结构之前,我们有必要先来了解一下操作系统的内存基本结构:操作系统中的JVM为什么JVM的内存是分布在操作系统的堆中呢??因为操作系统的栈是操作系统管理的,它随时会被回收,所以如果JVM放在栈中,那Java的一个null对象就很难确定会被谁回收了,那gc的存在就一点意义都没有了,而要对栈做到自动释放也是JVM需要考虑的,所以放在堆中就最合适不过了。 操作系统+JVM的内存简单布局从上图中,你可以看到,JVM的内存结构居然和操作系统的结构惊人的一致,再来看一个...转载 2022-02-18 22:34:07 · 95 阅读 · 0 评论 -
002 Java 的平台无关性是因为JVM屏蔽了与具体操作系统平台相关的信息
1.java是一种技术说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示:运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),JVM才能识别并运行它,JVM针对每个操作系统开发其对应的解释器,所以只要其操作系统有对应版本的JVM,那么这份Java编译后的代码就能够运行起来,原创 2022-02-18 22:00:33 · 342 阅读 · 0 评论 -
001 JVM运行在操作系统之上 及 JVM架构图(包括JVM内存模型)
我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件,而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。 也就是如下: ① Java 源文件—->编译器—->字节码文件 ② 字节码文件—->JVM—->机器码 每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会 存在多个虚拟机实例。程序退.原创 2022-02-18 11:14:31 · 358 阅读 · 0 评论 -
cpu过高、项目运行慢_生产环境一次JVM 调优的记录总结_top_jstack_jstat_jmap
原文地址:https://blog.csdn.net/nandao158/article/details/108611909cpu过高、项目运行慢:进入Linux重端命令行 top 命令:找到java 进程号 74982.执行 top -p 7498单独监控该进程,页面:3、在第 2 步的监控界面输入 H,获取当前进程下的所有线程信息:发现7501、7500两个线程占用内存最大。4、执行 jstack 7498 对当前的进程做 dump ,输出所有的线程信息...转载 2021-05-21 10:48:50 · 141 阅读 · 0 评论 -
Java的解释执行与编译执行
HotSpot VM是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。但是如今的HotSpot VM中不仅内置有解释器,还内置有先进的JIT(Just In Time Compiler)编译器,在Java虚拟机运行时,解释器和即时编译器能够相互协作,各自取长补短。有一点需要注意,无论是采用解释器进行解释执行,还是采用即时编译器进行编译执行,最终字节码都需要被转换为对应平台的本地机器指令。部分参考 : https://www.cnblogs...转载 2020-10-14 18:06:02 · 272 阅读 · 0 评论 -
Java三种类加载器--jre/lib/ext扩展jar加载过程
首先来了解一下字节码和class文件的区别:我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程的bin目录下)指定的目录下的.class文件,类加载需要将.class文件导入到硬盘中,经过一些处理之后变成字节码在加载到内存中。下面来看一下简单的例子:[java]view pl...转载 2020-03-27 15:22:50 · 2827 阅读 · 0 评论 -
JVM 完整深入解析
工作之余,想总结一下JVM相关知识。Java运行时数据区:Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图:1、程序计数器:指向当前线程正在执行的字节码指令。线...转载 2019-06-12 16:33:07 · 330 阅读 · 0 评论 -
Java 详解 JVM 工作原理和流程
作为一名Java使用者,掌握JVM的体系结构也是必须的。说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示:运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再...转载 2019-06-12 16:27:34 · 106 阅读 · 0 评论 -
学习JVM是如何从入门到放弃的?
前言只有光头才能变强JVM在准备面试的时候就有看了,一直没时间写笔记。现在到了一家公司实习,闲的时候就写写,刷刷JVM博客,刷刷电子书。学习JVM的目的也很简单:能够知道JVM是什么,为我们干了什么,具体是怎么干的。能够理解到一些初学时不懂的东西 在面试的时候有谈资 能装逼image(图片来源:https://zhuanlan.zhihu.com/p/255117...转载 2019-06-12 16:21:07 · 260 阅读 · 0 评论