
jvm
chuixue24
这个作者很懒,什么都没留下…
展开
-
尚硅谷-宋红康-JVM上中下篇完整笔记-JVM上篇_内存与垃圾回收篇
TIOBE语言热度排行榜世界上没有最好的编程语言,只有最适用于具体应用场景的编程语言。java: 跨平台的语言JVM: 跨语言的平台随着Java7的正式发布,Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序.原创 2023-05-06 11:02:36 · 5053 阅读 · 1 评论 -
GCRoot与safePoint
HotSpot虚拟机使用可达性分析算法确定对象是否可以被GC。可达性分析算法从一系列GCRoot对象开始,向下搜索引用链,如果一个对象没有与任何GCRoot对象关联,这个对象就会被判定为可回收对象。GCRoot包括以下对象:虚拟机栈上的本地变量表引用的对象 方法区中类的静态属性引用的对象 方法区中常量引用的对象 本地方法栈中JNI引用的对象这一过程称为根节点枚举,也就是垃圾回收中的标记过程,当前所有的垃圾收集器,在标记阶段都必须停止所有java执行线程(stop the world),以转载 2022-01-22 14:59:59 · 135 阅读 · 0 评论 -
Java堆栈内存、堆外内存、零拷贝浅析与代码实现
一、堆栈内存堆栈内存,顾名思义,指的是堆内存以及栈内存,其中,堆内存是由Java GC进行管理的内存区域,而栈内存则是线程内存。关于栈内存,这里不去细说。以Hotspot为例,堆内存的简要结构如下图所示:而堆栈的关系,我们可以通过一行简单的代码来理解: 1 2 3 public static void main(String[] args) { Object o = new Object(); } 上述代码主要完...转载 2021-12-30 10:05:43 · 435 阅读 · 0 评论 -
jvm minor gc 为什么比 full gc 快很多
1.minor gc也需要STW,只不过正常情况下 minor gc STW时间非常短,所以很多人误以为没有STW.这里的正常情况是,Eden区产生的新对象大部分被回收了,不需要拷贝。2.MinorGC采用的是标记复制算法,具体过程如下图:3.为什么minor gc比full gc 快?minorgc只针对young区, full gc针对所有区,包括young gen、old gen、perm gen.minor gc和 full gc 都是从 gc...转载 2021-12-15 13:23:02 · 889 阅读 · 0 评论 -
visualvm 插件 visual gc 使用介绍
visual gc 是 visualvm 中的图形化查看 gc 状况的插件。具体详细介绍可参照: http://www.oracle.com/technetwork/java/visualgc-136680.html本文也是在此基础上进行的整理归纳。 OUTPUT FORMATvisual gc 工具分成三大块 the Visual GC window th...转载 2018-12-20 17:48:44 · 2808 阅读 · 0 评论 -
synchronized锁实现与升级过程
原创 2021-10-04 12:06:59 · 112 阅读 · 0 评论 -
jstack找出占用cpu最高的线程堆栈信息
1 package com.tuling.jvm; 23 /** 4 * 运行此代码,cpu会飙高 5 */ 6 public class Math { 78 public static final int initData = 666; 9 public static User user = new User(); 1011 public int compute() { //一个方法对应一块栈帧内存区域 12 int a = 1; 13 int b = 2;原创 2021-09-29 12:39:14 · 379 阅读 · 0 评论 -
三色标记算法和浮动垃圾
三色标记在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。 这里我们引入“三色标记”来给大家解释下,把Gcroots可达性分析遍历对象过程中遇到的对象, 按照“是否访问过”这个条件标记成以 下三种颜色:黑色: 表示对象已经被垃圾收集器访问过, 且这个对象的所有引用都已经扫描过。 黑色的对象代表已经扫描 过, 它是安全存活的, 如果有其他对象引用指向了黑色对象, 无须重新扫描一遍。 黑色对象不可能直接(不经过 灰色对象) 指向某个白原创 2021-09-28 13:30:17 · 557 阅读 · 0 评论 -
如何选择垃圾收集器
3G以下用Parallel收集器,3到8G用CMS,8G以上有G1,超级大堆用ZGC。原创 2021-09-27 14:33:30 · 161 阅读 · 0 评论 -
如何判断一个类是无用的类
如何判断一个类是无用的类 方法区主要回收的是无用的类,那么如何判断一个类是无用的类的呢? 类需要同时满足下面3个条件才能算是 “无用的类” : 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。 加载该类的 ClassLoader 已经被回收。 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。...原创 2021-09-26 14:29:06 · 340 阅读 · 0 评论 -
对象内存分配
对象栈上分配 我们通过JVM内存分配可以知道JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要依靠GC进行回收内 存,如果对象数量较多的时候,会给GC带来较大压力,也间接影响了应用的性能。为了减少临时对象在堆内分配的数量,JVM通过逃逸分析确定该对象不会被外部访问。如果不会逃逸可以将该对象在栈上分配内存,这样该对象所占用的 内存空间就可以随栈帧出栈而销毁,就减轻了垃圾回收的压力。 对象逃逸分析:就是分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所...原创 2021-09-26 13:50:30 · 603 阅读 · 0 评论 -
java指针压缩
什么是java对象的指针压缩? 1.jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩 2.jvm配置参数:UseCompressedOops,compressed压缩、oop(ordinary object pointer)对象指针 3.启用指针压缩:XX:+UseCompressedOops(默认开启),禁止指针压缩:XX:UseCompressedOops 为什么要进行指针压缩? 1.在64位平台的HotSpot中使用32位指针,内存使用会原创 2021-09-26 13:04:49 · 1188 阅读 · 0 评论 -
java对象头中的类型信息
java对象头中的类型信息先指向元空间(方法区)内的类元信息(C++实现),然后类元信息再指向堆区内的class对象信息。原创 2021-09-25 23:50:36 · 206 阅读 · 0 评论 -
jvm调优之元空间
原创 2021-09-25 23:36:58 · 328 阅读 · 0 评论 -
jvm相关
注意下图中的执行引擎相关的线:原创 2021-09-25 23:27:37 · 99 阅读 · 0 评论 -
亿级电商网站JVM调优案例
每日用户点击量上亿次,用户平均点击20-30次,日活用户500万,最终付费下单用户10%,日均50万单,如果不做促销活动,这50万单大概在3到4个小时内完成,每秒平均35单左右,这个可以接受。但在促销场景下,如果每秒1000单,用3台服务器做负载均衡,每台服务器每秒300单,每台服务器上每秒产生的对象(1KB的订单对象以及关联的对象及查询业务的对象)大概为60M。假设JVM的参数设置为堆大小为3G,年轻代占3分之一为1G,其中eden区占800M,S0和S1占100M。这种情况下,...原创 2021-09-12 10:04:13 · 198 阅读 · 0 评论 -
指针碰撞和空闲列表
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指转载 2021-09-11 18:06:41 · 186 阅读 · 0 评论 -
GC日志中的三个时间
原创 2021-09-08 13:30:08 · 234 阅读 · 0 评论 -
GC的分类
哪些情况下会触发Full GC原创 2021-09-08 13:14:41 · 466 阅读 · 1 评论 -
类加载流程图
字符串是 字符串是 JavaJavaJavaJava程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 程序中最常用的数据结构之一。在 JavaJavaJavaJava中 StringStringStringStringString 类已经重载了 类已经重载了 类已经重载了 类已经重载了 "+""+""+"。也就是说,字符串可以直接 。也原创 2021-08-17 13:23:23 · 207 阅读 · 0 评论 -
类的显示加载与隐式加载
原创 2021-08-15 19:25:02 · 386 阅读 · 0 评论 -
java类加载器与Class实例和对象实例关系
原创 2021-08-15 19:15:36 · 155 阅读 · 0 评论 -
clinit方法的线程安全以及死锁
问题:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程数?我们都知道系统创建进程是需要消耗大量资源的,所以这样就会导致系统资源不足的情况。那么有没有一种方式可以让一个进程同时为多个客户端端提供服务?接下来要讲的IO复用技术就是对于上述问题的最好解答。对于IO复用,我们可以通过一个例子来很好的理解它。(例子来自于《TCP/IP网络编程》)某教室有10名学生和1名老师,这些学生上课会不停的提问,所以一个老师处理不了这么多的问题。那么学校为每个学生都配一名老师,也就原创 2021-08-12 14:11:06 · 347 阅读 · 0 评论 -
static+final变量显示赋值时机
synchronized使用方式我们知道并发编程会产生各种问题的源头是可见性,原子性,有序性。而synchronized能同时保证可见性,原子性,有序性。所以我们在解决并发问题的时候经常用synchronized,当然还有很多其他工具,如volatile。但是volatile只能保证可见性,有序性,不能保证原子性,参见我之前的文章面试官:volatile关键字用过吧?说一下作用和实现吧synchronized可以用在如下地方修饰实例方法,对当前实例对象this加锁修饰静态方法,对当前类的C原创 2021-08-12 14:00:09 · 174 阅读 · 0 评论 -
jvm同步控制指令
原创 2021-08-10 19:24:05 · 149 阅读 · 0 评论 -
new 构造器()对应的字节码
比如Object obj = new Object();对应的字节码为new #2 <java/lang/object>dupinvokespecial #1 <java/lang/Object.<init>>astore_1其中dup为复制指令,之所以出现复制指令因为invokespecial指令会消耗掉操作数栈中的一个obj引入(对象在堆中的地址),astore_1执行时也需要一个obj引用,这样一共是两个。...原创 2021-08-10 17:07:24 · 281 阅读 · 0 评论 -
jvm字节码指令:返回指令
原创 2021-08-10 12:55:36 · 145 阅读 · 0 评论 -
jvm字节码指令:方法调用
原创 2021-08-10 12:43:58 · 127 阅读 · 0 评论 -
jvm架构
原创 2021-08-08 07:54:08 · 177 阅读 · 0 评论 -
jvm栈帧之局部变量表
原创 2021-08-08 07:49:38 · 233 阅读 · 0 评论 -
java对象创建步骤
原创 2021-08-05 14:18:53 · 96 阅读 · 0 评论 -
ZGC入门
原创 2021-08-04 17:31:47 · 96 阅读 · 0 评论 -
JDK1.6、JDK1.7、JDK1.8 内存模型演变
原创 2021-04-21 11:16:25 · 316 阅读 · 0 评论 -
CPU中的“程序计数器”和JVM内存模型中的“程序计数器”
在理解JVM内存模型中的“程序计数器”时,可能会与CPU中的“程序计数器”混淆。CPU中的“程序计数器”属于硬件层面,如下图中的PC:JVM内存模型中的“程序计数器”属于内存中的一块区域,如下图中的程序计数器:...原创 2021-01-26 15:51:37 · 1711 阅读 · 1 评论 -
JVM体系结构之:本地方法栈
JVM体系结构之五:本地方法栈对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情。 本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法。 任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压.转载 2021-01-26 15:48:12 · 126 阅读 · 0 评论 -
程序计数器(PC寄存器)以及java虚拟机栈的存储结构与运行原理的基本介绍
学习内容:1、运行时数据区的结构2、JVM线程的说明3、程序计数器(PC寄存器)4、java虚拟机栈内容详情:1、运行时数据区的结构其中:上面的本地方法栈,程序计数器,虚拟机栈是每个线程都有一份的,堆区和和右边的方法区是线程共享的。一个进程有多个线程,每个线程都有自己的本地方法栈,程序计数器,虚拟机栈,他们共享堆区和方法区。右下角的元数据区和JIT编译产物就是方法区,可以将JIT编译产物认为是不属于方法区的,也可以认为是的,我就先认为是的,只要知道它不是堆区的,这样好描述,而且这个细节也不影转载 2021-01-26 15:46:03 · 1099 阅读 · 0 评论 -
Java 代码是怎么执行的
结合 CPU 理解一行 Java 代码是怎么执行的根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器、控制器、存储设备,以及输入输出设备,如下图所示。我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单元,存储单元。控制单元是 CPU 的控制中心, CPU 需要通过它才知道下一步做什么,也就是执行什么指令,控制单元又包含:指令寄存器(IR ),指令译码器( ID )和操作控制器( OC )。 当程序被加载进内存后,指令就在内存中了,这个时候说的内存是转载 2021-01-04 00:15:52 · 351 阅读 · 0 评论 -
JVM 执行引擎的作用及工作过程
执行引擎的概述执行引擎是 Java 虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构关系,能够执行那些不被硬件直接支持的指令集格式。JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,...转载 2021-01-04 00:03:29 · 495 阅读 · 0 评论 -
OpenJDK能替代Oracle JDK 吗
Oracle 要对JAVA收费了,许多人说可以用 OpenJDK替代,但这会对应用有影响吗?OpenJDK 项目主要基于 Sun 捐赠的 HotSpot 源代码。此外,OpenJDK 被选为 Java 的参考实现,由 Oracle 工程师维护。关于 JVM,JDK,JRE 和 OpenJDK 之间的区别,Oracle 博客帖子在 2012 年有一个更详细的答案:问:OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?答:非常接近 - 我们的 Oracle JD转载 2021-01-02 18:26:33 · 7125 阅读 · 2 评论 -
浅谈JVM GC算法、垃圾收集器及如何选择
引言GC算法(引用计数/复制/标记清除/标记整理)是内存回收的方法论,垃圾收集器就是算法的落地实现。目前还没有完美的收集器,只是针对具体应用最合适的收集器,进行分代收集。四大GC算法引用计数:每次对对象赋值时均要维护引用计数器,且计数器本身也有一定的消耗,较难处理循环引用,JVM的实现一般不会采用这种方式。复制算法:复制–>清空–>互换 --如此15次后如果还有对象存活则进入老年代(JVM参数MaxTenuringThreshold默认为15)1 复制(eden、survivo转载 2021-01-02 18:27:14 · 549 阅读 · 0 评论