傻瓜式jvm基础学习

news/2024/12/5 10:23:37/文章来源:https://www.cnblogs.com/db-put/p/18585142

Qjvm调优是在做什么?

A:通过修改jvm参数和更换合适的垃圾回收器从而达到提高垃圾回收效率、降低停顿时间,提高系统的吞吐量和响应速度。

  从上面的问答中可以得到两个概念,jvm参数、垃圾回收器。

 

 

 

程序计数器

   存储当前线程正在执行的Java方法的字节码指令地址的内存区域,作为一个指示器使用,不会进行内存分配,因此不存在内存溢出的问题。

由于程序计数器是线程私有的,每个线程都有独立的程序计数器。这确保了在多线程环境下,线程切换后能够正确地恢复到上一个线程执行的位置。程序计数器在线程切换时起到了保持状态的重要作用。

Java虚拟机栈

  采用栈的数据结构来管理方法调用中的基本数据,先进后出(First In Last Out,每一个方法的调用使用一个栈帧(Stack Frame)来保存,虚拟机栈种保存着方法的局部变量、操作数栈(虚拟机在执行指令过程中用来存放临时数据的一块区域)、动态链接、方法返回地址(方法正常退出或异常退出的定义)和一些附加信息;局部变量的数量会影响到栈的深度

每个线程都会创建一个虚拟机栈,是线程私有的。栈的生命周期和线程同步一致,当线程线程结束,该虚拟机栈也就销毁了。

本地方法栈

  本地方法就是Java程序调用非Java代码的接口,它的实现不是由Java语言实现。当Java程序需要和外间需要交互时,就可以选择使用本地方法

     本地方法栈(Native Method Stack)用于本地方法的调用,线程私有,它允许被实现成固定大小或是可动态扩展的内存大小。程序使用本地方法栈的具体做法是:在本地方法栈中登记native方法,在执行引擎执行时加载本地方法库。当某个线程调用一个本地方法时,它就进入了一个全新的且不受虚拟机限制的世界,它和虚拟机拥有同样的权限。

  HotSpot直接将本地方法栈和虚拟机栈合二为一。

堆区

 

 

  堆是一种动态内存分配机制,用于存储在程序运行过程中创建的对象。它是线程共享的,堆中的对象都需要考虑线程安全问题;存放引用数据类型的数据和new出来的的对象。

      Jdk8后在逻辑上可以将堆区划分为新生代和老年代。新生代又可以划分为伊甸园区与幸存者区之间发生的内存整理行为是MinorGC,老年代发生的内存整理行为是MajorGC,整理堆区和方法区内存的行为是FullGC。

  堆内存的大小可以在运行时进行调整,以满足程序的需求。调整过程涉及到如下三个概念;used指的是当前已使用的堆内存,totaljava虚拟机已经分配的可用堆内存,maxjava虚拟机可以分配的最大堆内存。

  在 Java 中,堆内存的分配和管理由垃圾回收器(Garbage Collector,简称 GC)负责。当对象不再被引用时,GC 会自动回收其占用的内存空间。

  Java服务端程序开发时,建议将-Xmx和-Xms设置为相同的值,这样在程序启动之后可使用的总内存就是最大内存,而无需向java虚拟机再次申请,减少了申请并分配内存时间上的开销,同时也不会出现内存过剩之后堆收缩的情况

  默认的新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ) , 即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域, Edem 和俩个 Survivor 区域比例是 = 8 : 1 : 1 ( 可以通过参数 – XX:SurvivorRatio 来设定 ) ,但是 JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以 无论什么时候,总是有一块 Survivor 区域是空闲着的。

方法区

 

 

   用于存储类型信息、方法信息、常量、及时编译器编译后的缓存代码。方法区与Java堆一样,是各个线程共享的内存区域,并且在JVM启动时被创建,物理内存空间可以不连续,随着JVM的关闭而释放‌。

    JDK 7以前,习惯上把方法区称为永久代(习惯上),而到了JDK8,废弃了永久代的概念,改用与JRockitJ9一样在本地内存中实现的元空间(Metaspace)来代替。这两个最大的区别就是:元空间不在虚拟机设置的内存中,而是使用本地内存。

  jdk8 及之后使用参数 -XX:MetaspaceSize和-XX:MaxMetaspaceSize 来指定元空间的初始分配空间与最大可分配空间。在windows平台下,初始元空间的默认可分配空间是 21M ,最大可分配空间参数值为 -1(-1表示不限制)。

  如果不指定元空间可分配最大内存空间,极端情况下虚拟机会耗尽所有的可用系统内存,如果元空间区发生溢出,虚拟机会抛出异常:OutOfMenoryErrorMetaspace

 设置jvm内存的常用参数

参数类型

参数举例

备注

堆最大值(max

-Xmx6M

Xmx必须大于 2 MB,默认单位为字节(必须是1024的倍数)也可是指定单位k(K)m(M)g(G)

堆初始值(total)

-Xms6M

Xms必须大于1MB,默认单位为字节(必须是1024的倍数)也可是指定单位k(K)m(M)g(G)

Young区大小

-Xmn52M

 

元空间的初始分配空间(MetaspaceSize)

-XX:MetaspaceSize=128M

 

元空间的最大可分配空间(MaxMetaspaceSize)

-XX:MaxMetaspaceSize=512M

 

Java虚拟机栈

-Xss128K

默认单位为字节(必须是1024的倍数)也可是指定单位k(K)m(M)g(G)栈的大小直接决定了函数调用的最大可达深度,设置的值超过默认最大或者最小时设置失效

 

 

 

 

Jdk8常用的垃圾回收器

垃圾回收器

简介

目标

启用参数

适用场景

‌Serial收集器

Serial收集器是单线程的,在进行垃圾回收时会暂停所有用户线程,直到回收结束

响应速度优先

-XX:+UseSerialGC

单核处理器或客户端模式下的虚拟机

‌ParNew收集器‌‌

ParNewSerial收集器的多线程版本。它主要用于新生代垃圾回收,老年代则使用Serial Old

响应速度优先

-XX:+UseParNewGC

适用于多核处理器server模式

‌Parallel Scavenge收集器‌‌

这是一个并行多线程收集器,Parallel Scavenge收集器可以与Serial OldParallel Old搭配使用

吞吐量优先

-XX:+UseParallelGC

适用于服务端模式,适合响应时间要求不高的应用场景

‌CMSConcurrent Mark Sweep)收集器‌‌

这是一种并发收集器。CMS收集器在垃圾回收时允许用户线程继续执行,但它在处理老年代时需要依赖新生代的收集器,如ParNew

响应速度优先

-XX:+UseConcMarkSweepGC

适用于追求低延迟的应用,例如互联网网站或者bs系统

‌G1Garbage-First)收集器‌‌

G1收集器旨在平衡吞吐量和停顿时间。G1将堆内存划分为多个区域,并优先回收垃圾最多的区域,减少停顿时间

响应速度优先

-XX:+UseG1GC

适用于大内存服务器和复杂应用

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

既然overleaf崩了,那就立马尝试装本地的latex吧

目前还没定下来具体的latex搭配方案,只是先安装了各个软件 参考博客:https://zhuanlan.zhihu.com/p/607473890VSCode+Texlive+LaTeX Workshop+Copilot AI辅助写作 (推荐)参考博客:https://blog.csdn.net/Luan__Yu/article/details/143562703 超详细2024版Latex安装Texlive…

Everything 重大更新(新增拼音搜索 + 文档内容搜索)

Everything 重大更新(新增拼音搜索 + 文档内容搜索)原文:https://mp.weixin.qq.com/s/rrrijG0HXbQaCssWN9zAkQ Everything v1.5a 新版本开启拼音搜索的方法 现在官方更新,终于直接内置了中文拼音缩写搜索功能了! 另外,新版 Everything 还加入了呼声很高的文件全文内容搜索功…

jfinal 快速入门

0000package cn.jbolt.starter;import cn.jbolt.config.AppConfig; // 导入应用配置类 import com.jfinal.server.undertow.UndertowServer; // 导入Undertow服务器类// 主应用类 public class App {// 主函数,程序的入口点public static void main(String[] args) {// 创建Un…

高精度计算器-Qt版

代码 widget.h 文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <vector> #include <stack> using namespace std;QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:…

Power Automate 获取用户属性

前言最近,要在项目里需要获取用户的属性正文在Power Automate里有个Office 365 Users,里面有Action可以获取用户属性执行的结果,可以获取到很多属性,当然,这里都是默认的,如果想要更多的属性,在Select fields里添加就可以了。结束语想要其它的属性,参考官网就可以了。u…

JavaSwing 事件处理

1. 事件类型 2. ActionListenera:如果同一个组件添加了多个监听器,则每个监听器都会被执行, 后添加监听器会先被执行!b: 同一个监听器对象,可以监听多个组件!try{BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;o…

C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

学期2024-2025-1 学号20241424 《计算机基础与程序设计》第11周学习总结

学期2024-2025-1 学号20241424 《计算机基础与程序设计》第11周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十一周作业这个作业的目标 <1.学习计算机科学概论第15,16章 并完成云班课测…

牛客周赛 Round 70 个人题解

牛客周赛 Round 70 个人题解 (A~G) 牛客周赛 Round 70 A. 小苯晨跑 #include<bits/stdc++.h> #define endl \n using namespace std; void solve(){int a,b,c,d;cin>>a>>b>>c>>d;if(a==b && b==c && c==d){cout<<"NO…

2024/12/3 【哈希表】

https://www.programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%B8%B8%E8%A7%81%E7%9A%84%E4%B8%89%E7%A7%8D%E5%93%88%E5%B8%8C%E7%BB%93%E6%9E%84 哈希表(Hash table)也称为散列表。 一. 哈希表是什么? 哈希表是根据关键码的…

基于GA遗传算法的PID控制器参数优化matlab建模与仿真

1.程序功能描述基于GA遗传算法的PID控制器参数优化,对比GA优化前后的PID控制器的控制曲线。 2.测试软件版本以及运行结果展示本程序和本人之前写的《基于GA遗传优化的PID控制器最优控制参数整定matlab仿真_ga-pid-CSDN博客》 区别是:之前的控制对象采用的是差分方程实现的,G…

基于MIMO系统的PE-AltMin混合预编码算法matlab性能仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要在现代无线通信系统中,多输入多输出(Multiple-Input Multiple-Output, MIMO)技术是提高频谱效率和数据传输速率的关键。然而,随着天线数量…