学习JVM
java虚拟机
流程:helloworld.java----(javac编译)----helloworld.class-------(java运行)——JVM——机器码
JVM功能
*解释和运行
*内存管理
*即时编译(跨平台-慢一点)jit
(反复用到的代码 解释保存再内存里面)
jvm主要组成:
*类加载器,
*运行时数据区(jvm管理的内存),
*执行引擎(即时编译器,解释器,垃圾回收器)
字节码文件组成
工具:notepad++是不可以的 工具用 jclasslib
组成:基本信息,常量池,字段,方法,属性
基本信息
1, magic(魔数):确认是字节码文件(前缀固定0xcofe base)
2,主版本号 : (-44就等于jdk)-可以确定运行jdk和编译的版本是否一致
常量池
避免重复内容的重复定义,浪费空间
*常量池的数据都有一个编号
*字节码指令中提高编号引用常量池的过“符合引用”
方法
JVM:堆,栈,方法区
栈:是线程用的,(后进先出)(执行完就会释放)
*有多个栈帧组成,对应着每次方法调用时所占的内存
*每个线程只能有一个活动栈帧,对应正在执行的方法
递归会导致栈溢出
一个线程一个栈,一个方法一个栈帧
JVM调优
栈和栈帧
程序启动 在jvm的加载机制
1,将代码加载到 方法区(类加载)
2,栈启动mian主线程: 然后给线程的方法分配栈帧
new出来的对象放堆,方法执行完栈帧就会释放
!!!!
1线程启动就会分配栈,和程序计数器
2执行方法就会右栈帧(线程的栈帧是独立的)
3方法执行完栈帧就会释放,线程执行完栈就释放
程序计数器: *记录每个线程的执行到哪里-记录当前线程的状态-线程独有的)多线程切换用的
*由字节码执行引擎修改里面的内容
多线程的时候 操作系统的任务调度器 分配时间片
栈帧存的数据
1局部变量表(int = 1等)
2操作数栈(加减乘除操作时的数据空间,计算完就释放)
3动态链接、(每个方法内存地址,映射 元空间/方法区)
4方法出口(方法执行完 要继续执行main方法的下一个)
堆:new出来的对象---公共
栈(线程):放线程的--私有
栈里面的对象(保证地址)是指向堆的
本地方法栈:(用native修饰的方法-底层是用C++实现的)--私有
Thread类的本地方法 System类的本地方法
方法区(元空间):常理,静态变量,类信息---公共
方法区的对象也是指向堆的
JDK诊断工具
*Java VisualVM是JDK自带的基本调优工具之一
*jdk自带诊断命令
*arthas(阿里巴巴)诊断工具
。可以快速点位cpu高代码
。可以快速点位锁代码
。线上运行代码反编译
JVM堆的组成
1. 新生代(Young Generation):新生代是堆的一部分,用于存储新创建的对象。它又分为Eden区、Survivor区(通常有两个)。
- Eden区:新创建的对象首先分配在Eden区。
- Survivor区:当Eden区满时,存活的对象会被移到Survivor区。Survivor区一般有两个,分别称为From区和To区。存活的对象会在From区和To区之间进行复制,经过多次垃圾回收后(每次年龄+1),仍然存活的对象会被移动到老年代(15岁/6 CMS)。
2. 老年代(Old Generation):老年代用于存储长时间存活的对象。当对象经过多次垃圾回收后仍然存活,它们会被移动到老年代。(full GC老年代也回收)
对象年龄判断机制(如果对象大于Survivor 50%会直接放老年代)
3. 永久代(Permanent Generation):永久代用于存储类的元数据(metadata)和方法信息(method information)。在JDK 8之后,永久代被元空间(Metaspace)所取代。元空间不再位于堆中,而是位于本地内存中。
4. 堆外内存(Off-Heap Memory):堆外内存是指不受JVM堆管理的内存,通常由本地方法直接分配和释放。堆外内存包括直接内存(Direct Memory)和本地内存(Native Memory)。
需要注意的是,JVM的堆大小可以通过启动参数进行配置,例如-Xmx和-Xms参数用于设置堆的最大和初始大小。堆的大小对于应用程序的性能和内存使用有重要影响,需要根据具体应用场景进行合理配置。
堆-对象直接进入老年代
1,动态年龄判断:survivor从小到大累加年龄超过空间的50%(默认) ,后面的会直接晋升老年代
2 ,大对象直接接入 大对象就是需要大量连续内存空间的对象(比如:字符串、数组)。
复制很耗性能,
JVM参数XX:PretenureSizeThreshold 可以设置大 对象的大小,如果对象超过设置大小会直接进入老年代,不会进入年轻代,这个参数只在 Serial 和ParNew两个收集器下 有效。比如设置JVM参数:
-XX:PretenureSizeThreshold=1000000 (单位是字节) -XX:+UseSerialGC ,再执行下上
面的第一 个程序会发现大对象直接进了老年代
为什么要这样呢?(原因)
为了避免为大对象分配内存时的复制操作而降低效率。
(解决——加大Survivor区,并用G1分代收集)
3,老年代空间担保机制
From区和To区的作用如下:
1. 存储存活对象:在Minor GC过程中,存活的对象会被移动到Survivor区的From区。
2. 进行对象复制:在下一次Minor GC之前,存活的对象会从From区复制到To区。
3. 清空From区:复制完成后,From区会被清空,为下一次Minor GC做准备。
4. 交换From区和To区:在下一次Minor GC时,From区和To区会互换角色,即From区变为To区,To区变为From区。
通过交替使用From区和To区,Survivor区可以实现对象的复制和清理,以进行有效的垃圾回收。这种复制算法被称为"标记-复制"(Mark and Copy)算法,它可以有效地处理新生代中的对象,并减少内存碎片化的问题。
需要注意的是,Survivor区的大小可以通过JVM参数进行调整,以适应不同应用程序的需求。一般来说,Survivor区的大小应该合理设置,避免过小导致频繁的对象复制,或过大导致浪费内存空间。
垃圾回收
Minor GC 和 Full GC 垃圾回收会导致 stw(Stop the World")这个系统停顿
为什么要这样设计:不停止用户线程里面对象就会不断变化,实现简单,
JVM的可达性分析
JVM的可达性分析(Reachability Analysis)是垃圾回收的一种核心算法,用于确定哪些对象是可达的(reachable)或不可达的(unreachable),从而确定哪些对象应该被回收。
可达性分析的基本原理是从一组称为"GC Roots"的根对象开始,通过遍历对象引用链,标记所有与根对象直接或间接相连的对象为可达对象。而未被标记的对象则被认为是不可达的,即无法通过任何引用链访问到的对象。这些不可达对象将被垃圾回收器识别并回收,释放其占用的内存空间。
GC Roots包括以下几种类型的对象:
1. 虚拟机栈(VM Stack)中的引用对象。
2. 方法区(Method Area)中类静态属性引用的对象。
3. 方法区中常量引用的对象。
4. 本地方法栈(Native Method Stack)中JNI引用的对象。
通过从GC Roots出发进行可达性分析,JVM可以确定哪些对象是活动的,即仍然被引用和使用的对象,而哪些对象是不再使用的,可以被回收的对象。
可达性分析是现代垃圾回收器中常用的算法,它具有高效、准确的特点,并能够处理复杂的对象引用关系。通过可达性分析,JVM可以自动管理内存,释放不再使用的对象,从而提高系统的性能和资源利用率。
Minor GC
Minor GC(Minor Garbage Collection)是Java虚拟机(JVM)中的一种垃圾回收操作,主要针对新生代进行回收。新生代是Java堆内存中的一部分,用于存储新创建的对象。Minor GC的目标是清理新生代中的无用对象,以释放内存空间。
在Minor GC过程中,垃圾回收器会扫描新生代中的对象,并标记那些仍然存活的对象。然后,它会将存活的对象复制到Survivor区(通常是From区),同时清理掉无用的对象。在复制过程中,存活的对象会被移动到Survivor区的To区。最后,From区会被清空,为下一次垃圾回收做准备。
Minor GC通常发生在新生代中的Eden区(新对象的分配区域)空间不足时。当Eden区满了之后,会触发Minor GC来回收无用的对象,以便为新对象腾出空间。通常情况下,大部分对象在新生代中很快被回收,只有少部分对象会进入老年代(Old Generation)。
相比于Full GC(Full Garbage Collection),Minor GC的开销较小,回收的对象数量也较少。因此,Minor GC的执行时间通常较短,对应用程序的停顿时间影响较小。它是Java堆内存中垃圾回收的常见操作之一,用于保证新生代的内存空间的有效利用。
Full GC
Full GC(Full Garbage Collection)是Java虚拟机(JVM)中垃圾回收的一种操作,它是对整个堆内存进行回收的过程。Full GC会清理整个堆内存中的所有对象,包括年轻代和老年代。
Full GC通常是在进行一次完整的垃圾回收之前执行的,目的是回收所有不再被引用的对象,释放内存空间。Full GC的执行会导致应用程序的停顿,因为在此期间,所有的应用线程都会被暂停,直到垃圾回收完成。
Full GC通常发生在以下情况下:
1. 当堆内存空间不足时(如老年代太多),无法分配新的对象时,会触发Full GC来回收内存。
2. 当执行System.gc()方法或者调用Runtime.getRuntime().gc()方法时,可能会触发Full GC。
3. 当永久代(Permanent Generation)空间不足时(在JDK 8及之前的版本中),会触发Full GC来回收永久代。
Full GC的执行时间通常比部分垃圾回收(如年轻代的Minor GC)更长,并且会导致较长的停顿时间。因此,对于性能敏感的应用程序,需要合理配置堆内存大小,以减少Full GC的频率和影响。
总之,Full GC是Java虚拟机中对整个堆内存进行的垃圾回收操作,它会清理整个堆内存中的所有对象,包括年轻代和老年代,通常会导致较长的停顿时间。
JVM中常见的垃圾回收算法和策略包括以下几种:
1. 标记-清除算法(Mark and Sweep):该算法分为两个阶段,首先标记所有活动对象,然后清除未标记的对象。但是,标记-清除算法会产生内存碎片,可能会导致内存分配效率降低。
2. 复制算法(Copying):该算法将堆内存划分为两个相等大小的区域,每次只使用其中一个区域。当一个区域满时,将存活的对象复制到另一个区域,然后清除当前区域中的所有对象。复制算法消耗的时间较短,但会浪费一部分内存空间。
3. 标记-压缩算法(Mark and Compact):该算法首先标记所有活动对象,然后将活动对象向一端移动,最后清理掉边界以外的内存空间。标记-压缩算法消除了内存碎片,但可能会导致对象移动的开销较大。
4. 分代收集算法(Generational Collection):该算法根据对象的生命周期将堆内存划分为不同的代(Generation),如新生代(Young Generation)和老年代(Old Generation)。新生代中的对象生命周期较短,采用复制算法;而老年代中的对象生命周期较长,采用标记-压缩算法。
5. 并发标记清除算法(Concurrent Mark and Sweep):该算法允许垃圾回收器与应用程序并发执行,减少停顿时间。它通过在标记和清除阶段之间允许应用程序继续运行来提高性能。
6. G1收集器(Garbage-First Collector):G1收集器是一种面向服务端应用的垃圾回收器,它将堆内存划分为多个大小相等的区域(Region),通过并发标记、并发清除和并发整理来实现高效的垃圾回收。
这些垃圾回收算法和策略的选择取决于应用程序的性能需求和内存特点。JVM根据实际情况自动选择适当的垃圾回收器和算法来管理内存。
垃圾收集器
G1(Garbage First)收集器是Java虚拟机(JVM)中的一种垃圾收集器。它在JDK 7u4版本中首次引入,并在JDK 9及以后的版本中成为默认的垃圾收集器。G1收集器采用了分代收集和并发标记整理的方式,旨在提供可预测的停顿时间和高吞吐量的垃圾收集性能。
G1收集器的主要特点和优势包括:
1. 分代收集:G1收集器将堆内存划分为多个大小相等的区域(Region),每个区域可以是Eden区、Survivor区或Old区。这种分代的方式可以更好地适应不同对象的生命周期和内存使用模式。
2. 并发标记:G1收集器使用并发标记算法,在垃圾收集过程中,可以与应用程序线程并发执行标记阶段,减少垃圾收集对应用程序的影响。
3. 空闲区域优先回收:G1收集器的名字“Garbage First”即表示它优先回收垃圾最多的区域。这种策略可以最大程度地回收垃圾,提高垃圾收集的效率。
4. 可预测的停顿时间:G1收集器通过将堆内存划分为多个区域,并使用增量式的并发标记算法,可以控制垃圾收集的停顿时间。这对于要求低延迟的应用程序非常重要。
5. 自适应调节:G1收集器会根据堆内存的使用情况和垃圾收集的效果,动态地调整各个阶段的参数,以达到最优的垃圾收集性能。
G1收集器适用于大内存、多核处理器的应用场景,尤其是需要低延迟和高吞吐量的服务端应用程序。它在处理大堆内存和大量对象时表现出色,并且可以通过调整参数来满足不同应用程序的需求。
相关文章:

学习JVM
java虚拟机 流程:helloworld.java----(javac编译)----helloworld.class-------(java运行)——JVM——机器码JVM功能 *解释和运行 *内存管理 *即时编译(跨平台-慢一点)jit (反复用到的代码 解释保存再内存里面)…...

Oracle MongoDB
听课的时候第一次碰到,可以了解一下吧,就直接开了墨者学院的靶场 #oracle数据库 Oracle数据库注入全方位利用 - 先知社区 这篇写的真的很好 1.判断注入点 当时找了半天没找到 看样子是找到了,测试一下看看 id1 and 11 时没有报错 2.判断字段…...
Linux-RedHat系统-安装 中间件 Tuxedo
安装步聚 一、中间件安装包: tuxedo121300_64_Linux_01_x86 Tuxedo下载地址: Oracle Tuxedo Downloads 二、新建用户: (创建Oracle用户时,需要root权限操作) 创建用户: # useradd oracle …...
PHP中的依赖注入是怎样的?
依赖注入(Dependency Injection,DI)是一种设计模式,它用于解耦组件之间的依赖关系,提高代码的可维护性、可测试性和灵活性。在 PHP 中,依赖注入通常通过构造函数注入、方法注入或属性注入来实现。 以下是依…...

Python求小于m的最大10个素数
为了找到小于m的最大10个素数,我们首先需要确定m的值。然后,我们可以使用一个简单的算法来检查每一个小于m的数字是否是素数。 下面是一个Python代码示例,可以找到小于m的最大10个素数: def is_prime(n): if n < 1: …...

系统的安全性设计
要设计一个安全的系统,除了要了解一些前面讲到的常用的保护手段和技术措施外,还要对系统中可能出现的安全问题或存在的安全隐患有充分的认识,这样才能对系统的安全作有针对性的设计和强化,即“知己知彼,百战百胜”。 下…...

美容店预约小程序搭建指南
随着互联网的发展,越来越多的传统行业开始尝试将业务与互联网相结合,以提供更加便捷、高效的服务。美容行业也不例外。本文将通过使用第三方制作平台,如乔拓云网,指导您如何搭建一个美观实用的美容店预约小程序,帮助您…...
AI:ElasticSearch
ElasticSearch是一款开源的分布式搜索引擎和数据分析引擎,主要用于处理海量数据并提供近实时的搜索和分析功能。它具有全文检索、结构化检索和数据分析等特点,能够满足各种复杂的搜索需求。ElasticSearch使用Java编写,可以运行在多个服务器上…...
如何用 Python 代码打包成一个可执行的 exe 文件?
将Python代码打包成可执行的EXE文件通常需要使用第三方工具,其中PyInstaller是一个流行的选择。PyInstaller可以将Python脚本打包成独立的可执行文件,无需用户安装Python解释器。 打包Python代码成EXE文件的步骤 步骤1:安装PyInstaller 首…...

【Hive】——CLI客户端(bin/beeline,bin/hive)
1 HiveServer、HiveServer2 2 bin/hive 、bin/beeline 区别 3 bin/hive 客户端 hive-site.xml 配置远程 MateStore 地址 XML <?xml version"1.0" encoding"UTF-8" standalone"no"?> <?xml-stylesheet type"text/xsl" hre…...

简约大气视频制作模板PR剪辑素材PR项目工程文件
Premiere Pro模板,简约大气视频剪辑素材PR项目工程文件(包含手机竖屏分辨率),包含24个媒体占位符和9个文本占位符。可以编辑和自定义文本占位符和媒体占位符。用来展示照片视频制作。包含视频教程。 来自PR模板网:http…...
Guarded Suspension(担保挂起)设计模式
当线程访问某个对象时,发现条件不满足,暂时挂起等待条件满足时再次访问。Guarded Suspension模式是一个非常基础的模式,主要关注(临界值)不满足时将操作的线程正确挂起,以防止出现数据不一致或者操作超过临…...

禾匠榜店商城系统 RCE漏洞复现
0x01 产品简介 禾匠榜店商城系统是浙江禾匠信息科技有限公司的一套基于PHP和MySQL的商城系统。 0x02 漏洞概述 禾匠榜店商城系统的api/testOrderSubmit模块下的preview方法存在命令执行漏洞,攻击者可以向服务器写入木马文件,直接获取服务器权限 0x03 漏洞概述 FOFA:bod…...

Python移动未标注的图片数据集
Python移动未标注的图片数据集 前言前提条件相关介绍实验环境Python移动未标注的图片数据集情况一:有图,无标注文件代码实现输出结果 情况二:有图,有标注文件,但标注信息为空代码实现输出结果 情况一与情况二同时都考虑…...

判断css文字发生了截断,增加悬浮提示
示例: 固定显示宽度,溢出显示...,利用了css的属性,想要实现成下面这样: 针对溢出的文字,hover显示全部。 提示很好加,使用tooltip组件就行了,难点是如何判断是否发生了文字溢出。…...

day33-37-SpringBootV12(整合Spring,SpringMVC,Mybatis,日志,api测试等框架)
ssm spring --> applicationContext.xml配置文件 springmvc --> springmvc.xml配置文件 mybatis —> mybatis-config.xml配置文件 —> springboot优化了之前的框架配置,思想是约定大于配置 一、引言 1.1 初始化配置 为了使用SSM框架去开发,准备SSM…...

如何处理好面试中的“压力测试”?
作为一名求职者,在面试时有时遇到的是压力测试,有时则遇到的是一些无良企业单位,究竟如何把握忍耐的限度,才合格当一个能经受压力的员工,才能避免对无良单位的一味隐忍! 压力面试是指有意制造紧张,以了解求…...

大数据----31.hbase安装启动
二.Hbase安装 先前安装: Zookeeper 正常部署 首先保证 Zookeeper 集群的正常部署,并启动之。 三台机器都执行:zkServer.sh startHadoop 正常部署 Hadoop 集群的正常部署并启动。 主节点上进行 :start-all.sh 1.HBase 的获取 一定…...

ChatGPT Plus重新开启订阅
12月14日凌晨,OpenAI首席执行官Sam Altman在社交平台宣布,终于找到了更多的GPU算力,重新开启订阅ChatGPT Plus。 上个月15日,OpenAI就因为算力不足,以及用户激增等原因暂停了ChatGPT Plus订阅。 Sam表示,在…...

C#科学绘图之scottPlot绘制多个图像
文章目录 示例移除图像图例信号图 scott系列:绘图初步 示例 从名字就能看出,ScottPlot的绘图函数AddScatter的作用是为图窗添加数据点,换言之,每调用一次AddScatter,就可以在图窗中添加一组图像。下面添加两个按钮&a…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...