欧博在线
热门标签

北京赛车电子游戏博彩网站排名_口试必问 | 聊聊JVM性能调优?

时间:2023-10-30 09:01    点击次数:131
北京赛车电子游戏博彩网站排名

[[438664]]足球注册球员条件

经过几天的想考,我决定暂时放下【字节码编程】的更新,先更新一些口试中等闲会被问及的一些常识点,以便梗概匡助小伙伴们系统的梳理口试中需要掌持的常识手段。

主要的形态是以口试的角度,深度聊聊口试中等闲被问及的各项常识点。

对于职责3年傍边的Java圭臬员来说,在口试大厂的经过中,口试官可能不会太关爱你作念了若干个边幅、你的CRUD水平怎样。更多的是关爱你对某项时间点的承接深度,是以说,职责3年傍边的小伙伴一定要把我方的要点放到时间的深度上来。

今天,咱们先一说念聊聊对于JVM性能调优的话题,本文的主要结构如下所示。

常见口试题

对于JVM,一说念常见的口试题等于:Java中创建的对象是存储在JVM中的哪个区域的?

例如,这里,咱们约略的列举一瞥代码,如下所示。

User 足球注册球员条件user = new User(); 

对于上头的代码,不年少伙伴皆知说念,创建出来的User对象是放在JVM中的堆区域的,而User对象的援用是放在栈中的。但如果你只是了解到这种进程,那口试官就会以为你了解的太浅易了,可能就会够不上他们的条目。其实口试官想要了解你是否对JVM有一个更长远的遒劲。

站在口试官的角度来看这个问题时,恢复创建出来的User对象是放在JVM的堆区,也并莫得错。关联词JVM的堆内存区域又会分为年青代和老年代,而年青代又会分为Eden区和Survivor区。JVM堆空间的逻辑结构如下图所示。

而口试官更想了解的是你能不可说出来创建的对象具体是存放在JVM堆空间的哪个区域。

在JVM里面,会将所有这个词堆空间辨认红年青代和老年代,年青代默许会占所有这个词堆内存空间的1/3,老年代默许会占所有这个词堆内存空间的2/3。年青代又会辨认为Eden区和两个Survivor区,它们之间的默许比例是Eden:Survivor1:Survivor2 = 8:1:1。

如果你能恢复出 新创建的User对象是存放在JVM堆空间中年青代的Eden区,那口试官就会对你刮目相看了。虽然,这里莫得斟酌JVM的逃遁分析情况,对于JVM的逃遁分析,大家不错参考《逃遁分析》一文。

JVM体绑缚构

JVM主要由三个子系统组成,分别为:类加载器子系统、运行时数据区(内存结构)和字节码实施引擎。

对于JVM的体绑缚构全貌,咱们先来看一张图。

博彩网站排名

当咱们设备Java圭臬时,领先会编写.java文献,之后,会将.java文献编译成.class文献。

JVM中,和会过类装载子系统将.class文献的内容装载到JVM的运行时数据区,而JVM的运行时数据区又会分为:方法区、堆、栈、土产货方法栈和圭臬计数器 几个部分。

在装载class文献的内容时,会将class文献的内容拆分为几个部分,分别装载到JVM运行时数据区的几个部分。其中,值得精通的是:圭臬计数器的作用是:记载圭臬实施的下一条指示的地址。

方法区也叫作元空间,主要包含了:运行往往量池、类型信息、字段信息、方法信息、类加载器的援用、对应的Class实例的援用等信息。

在JVM中,圭臬的实施是通过实施引擎进行的,实施引擎会调用土产货方法的接口来实施土产货方法库,进而完成所有这个词圭臬逻辑的实施。

咱们常说的垃圾网罗器是包含在实施引擎中的,在圭臬的运行经过中,实施引擎会开启垃圾网罗器,并在后台运行,垃圾网罗器会抑制监控圭臬运行经过中产生的内存垃圾信息,并字据相应的计谋对垃圾信息进行清算。

这里,大家需要精通的是:栈、土产货方法栈和圭臬计数器是每个线程运行时独占的,而方法区和堆是所有线程分享的。是以,栈、土产货方法栈和圭臬计数器不会波及线程安全问题,而方法区和堆会波及线程安全问题。

方法区(元空间)

许多小伙伴一看到方法区三个字,脑海中的第一印象可能是存储方法的方位吧。

实则否则,方法区的另一个名字叫作元空间,深信不年少伙伴或多或少的别传过元空间。这个区域是JDK1.8中辨认出来的。主要包含:运行往往量池、类型信息、字段信息、方法信息、类加载器的援用、对应的Class实例的援用等信息。方法区中的信息梗概被多个线程分享。

例如,在圭臬中声明的常量、静态变量和干系于类的信息等的援用,皆会存放在方法区,而这些援用所指向的具体对象 一般皆会在堆中开辟单独的空间进行存储,也可能会在径直内存中进行存储。

堆中主要存储的是施行创建的对象,也等于会存储通过new关键字创建的对象,堆中的对象梗概被多个线程分享。堆中的数据不需要预先明确生计期,不错动态的分拨内存,不再使用的数据和对象由JVM中的GC机制自动回收。对JVM的性能调优一般等于对堆内存的调优。

Java中基本类型的包装类:Byte、Short、Integer、Long、Float、Double、Boolean、Character类型的数据是存储在堆中的。

堆一般会被分红年青代和老年代。而年青代又会被进一步分为1个Eden区和2个Survivor区。在内存分拨上,如果保持默许建树的话,年青代和老年代的内存大小比例为1 : 2,年青代中的1个Eden区和2个Survivor区的内存大小比例为:8 : 1 : 1。

欺诈

栈一般又叫作线程栈或造谣机栈,一般存储的是局部变量。在Java中,每个线程皆会有一个单独的栈区,每个栈中的元素皆是迥殊的,不会被其他的栈所探望。栈中的数据大小和生计期皆是细则的,存取速率比拟快。

在Java中,所有的基本数据类型(byte、short、int、long、float、double、boolean、char)和援用变量(对象援用)皆是在栈中的。一般情况下,线程退出或者方法退出时,栈中的数据会被自动撤销。

付红琼出生于贵州毕节一个乡村教师家庭,她的父母都是当地学校老师,家庭条件还算可以。但是她从小就好逸恶劳,心高气傲,在学校里仗势欺人,不好好学习。18岁时,她辍学离开了家乡,只身来到了深圳打工。她渴望在这里闯出一片天地,过上富裕和奢侈的生活。但是她的学历不高,又不愿意吃苦,只能在工厂里做苦力。她很快就厌倦了这样的生活,开始迷恋上了深圳的灯红酒绿。

据悉,当年担任“音乐风云榜”评委主席的那英表示

圭臬在实施经过中,会在栈中为不同的方法创建不同的栈帧,在栈帧中又包含了:局部变量表、操作数栈、动态承接和方法出口。

对于局部变量表、操作数栈、动态承接和方法出口的具体作用,会在《架构师进阶系列》中的后续著作中详备泄露。

皇冠体育客服电话

栈中一般会存储对象的援用,这些援用所指向的具体对象一般皆会在堆中开辟单独的地址空间进行存储,也有可能存储在径直内存中。

精通:这里说的是这些援用所指向的具体对象一般皆会在堆中开辟单独的地址空间进行存储,也有可能存储在径直内存中。

因为在JVM中,如果开启了逃遁分析和标量替换,则可能不会再在堆上创建对象,可能会将对象径直分拨到栈上,也可能不再创建对象,而是进一步明白对象中的成员变量,将其径直在栈上分拨空间并赋值。

土产货方法栈

土产货方法栈相对来说比拟约略,等于保存native方法干预区域的地址。

例如,在Java中创建线程,调用Thread对象的start()方法时,和会过土产货方法start0()调用操作系统创建线程的方法。此时,土产货方法栈就会保存start0()方法干预区域的内存地址。

圭臬计数器

圭臬计数器也叫作PC计数器,惟有存储的是下一条将要实施的大叫的地址。

双亲请托机制

何为双亲请托?

JVM中是通过类的双亲请托机制来加载的,那什么是双亲请托机制呢?咱们先来看一张图。

当JVM加载某个类的时间,不会径直使用刻下类的加载器加载该类,会先寄托父加载器寻找要加载的见解类,找不到再寄托表层的父加载器进行加载,直到辅导类加载器一样找不到要加载的见解类,就会在我方的类加载旅途中查找并加载见解类。

约略来说:双亲请托机制等于:先使用父加载器加载,如果父加载器找不到要加载的见解类,就使用子加载器我方加载。

为何使用双亲请托机制?

这里,小伙伴们有莫得想过这样一个问题:JVM为何要使用双亲请托机制呢?

为了更好的诠释问题,咱们我方创建一个java.lang包,并在java.lang包下,创建一个String类,如下所示。

package java.lang;  /**  * @author binghe (公众号:冰河时间)  * @version 1.0.0  * @description 测试时双亲请托机制  */ public class String {     public static void main(String[] args){         System.out.println("自界说的String类");     } } 

这里,咱们我方创建一个java.lang.String类,而JDK中也存在一个java.lang.String类,如果运行咱们我方创建的java.lang.String会发生什么呢?会输出如下造作信息。

造作: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法界说为:

public static void main(String[] args) 

否则 JavaFX 专揽圭臬类必须彭胀javafx.application.Application

北京赛车电子游戏

那JVM为何要使用双亲请托机制呢?试想,如果咱们我方写的类梗概随敷衍便隐私JDK中的类的话,那JDK中的代码是不是就莫得任何安全性可言了?没错,JVM为了代码的安全性,也即是沙箱安全机制,使用了双亲请托机制。

另外,使用双亲请托机制,也能珍爱JVM内存中出现多份沟通的字节码。例如,两个类A和B,皆需要加载System类。如果JVM莫得提供双亲请托机制,那么A和B两个类就会分别加载一份System的字节码,这样JVM内存中就会出现这份System字节码。

违抗,JVM提供了双亲请托机制的话,在加载System类的经过中,会递归的向父加载器查找并加载,所有这个词经过会优先采取BootStrapClassLoader加载器,也等于咱们等闲说的辅导类加载器。如果找不到就逐级向下使用子加载器进行加载。

而System类不错在BootStrapClassLoader中进行加载,如果System类如故通过A类的援用加载过,此时B类也要加载System类,也会从BootStrapClassLoader脱手加载System类,此时,BootStrapClassLoader发现如故加载过System类了,就会径直复返内存中的System,不再从头加载。

最近,明星A在社交媒体上发布了一条关于体育比赛的帖子,引起了不少网友的关注和争议。有些人认为他对比赛的评价过于主观,有失公允,而另一些人则认为他有权利表达自己的观点,大家应该尊重他的看法。

这样,在JVM内存中,就只会存在一份System类的字节码。

类加载器的父子关系

怎样证据类加载器的父子关系呢?这里,咱们再来看一个示例代码,如下所示。

/**  * @author binghe (公众号:冰河时间)  * @version 1.0.0  * @description 类的双亲请托机制  */ public class User {     public static void main(String[] args){         User user = new User();         System.out.println(user.getClass().getClassLoader());         System.out.println(user.getClass().getClassLoader().getParent());         System.out.println(user.getClass().getClassLoader().getParent().getParent());     } } 

这段代码也比拟约略,创建了一个User对象,打印User对象的类加载器,父类加载和表层父加载器。在IDEA中运行上述代码,会输出如下信息。

sun.misc.Launcher$AppClassLoader@18b4aac2  sun.misc.Launcher$ExtClassLoader@135fbaa4  null 

不错看到,User对象的类加载器是AppClassLoader,父加载器是ExtClassLoader。而输出的null其实是BootStrapClassLoader,而BootStrapClassLoader也等于表层父加载器。

这样,类加载器的父子关系就出来了:AppClassLoader的父加载器是ExtClassLoader,ExtClassLoader的父加载器是BootStrapClassLoader。

这里,需要精通的是:父加载器并不是父类。

类加载器加载的类 辅导类加载器(BootStrapClassLoader):认真加载%JAVA_HOME%/jre/lib目次下的所有jar包,或者是-Xbootclasspath参数指定的旅途; 彭胀类加载器(ExtClassLoader):认真加载%JAVA_HOME%/jre/lib/ext目次下的所有jar包,或者是java.ext.dirs参数指定的旅途; 专揽类加载器(AppClassLoader):认真加载用户类旅途上所指定的类库。

精通:辅导类加载器和彭胀类加载器加载的类皆是预先加载好的,而专揽类加载用具来加载专揽工程的classes以及lib下的类库,只是声明,并不会提前载入JVM内存,比及使用的时间才会加载到JVM内存中。

类的加载经过

一个类在JVM中的加载经过苟简资历了加载、考据、准备、贯通和运转机。

太平洋娱乐

加载: 主若是在打算机磁盘上通过IO流读取字节码文献(.class文献),当圭臬需要使用某个类时,才会对这个类进行加载操作,比如,在圭臬中调用某个类的静态方法,使用new关键字创建某个类的对象等。在加载阶段,时时会在JVM的堆内存中生成一个代表这个类的Class对象,这个对象算作存放在JVM方法区中这个类的各式数据的探望进口,也不错叫作念探望句柄。

考据:主要的作用等于校验字节码的正确性,是否顺应JVM循序。 准备:为类的静态变量分拨相应的内存,并赋予默许值。 贯通:将圭臬中的秀丽援用替换为径直援用,这里的秀丽援用包括:静态方法等。此阶段等于将一些静态方法等秀丽援用替换成指向数据所在内存地址的指针,这些指针等于径直援用。如果是在类加载经过中完成的秀丽援用到径直援用的替换,这个替换的经过就叫作静态承接经过。如果是在运行时间完成的秀丽援用到径直援用的替换,这个替换的经过就叫作动态承接经过。 运转机:对类的静态变量进交运转机,为其赋予圭臬中指定的值,并实施静态代码块中的代码。

精通:在准备阶段和运转机阶段皆会为类的静态变量赋值,不同之处等于在准备阶段为类的静态变量赋予的是默许值,而在运转机阶段为类的静态变量赋予的是确实要赋予的值。

例如,在圭臬中有如下静态变量。

public static int count = 100; 

在准备阶段会为count赋予一个默许值0,而在运转机阶段才会确实将count赋值为100。

JVM调优参数

在JVM中,主若是对堆(重生代)、方法区和栈进行性能调优。各个区域的调优参数如下所示。

堆:-Xms、-Xmx 重生代:-Xmn 方法区(元空间):-XX:MetaspaceSize、-XX:MaxMetaspaceSize 栈(线程):-Xss

为了愈加直不雅的表述,咱们不错将JVM的内存区域和对应的调优参数回归成下图所示。

在诞生JVM启动参数时,需要颠倒精通方法区(元空间)的参数诞生。

对于方法区(元空间)的JVM参数主要有两个:-XX:MetaspaceSize和-XX:MaxMetaspaceSize。

皇冠客服真的假的

-XX:MetaspaceSize: 指的是方法区(元空间)触发Full GC的运转内存大小(方法区莫得固定的运转内存大小),以字节为单元,默许为21M。达到诞生的值时,会触发Full GC,同期垃圾网罗器会对这个值进行修改。

如果在发生Full GC时,回收了大皆内存空间,则垃圾网罗器会顺应裁汰此值的大小;如果在发生Full GC时,开释的空间比拟少,则在不跳跃诞生的-XX:MetaspaceSize值或者在没诞生-XX:MetaspaceSize的值时不跳跃21M,顺应普及此值。

-XX:MaxMetaspaceSize: 指的是方法区(元空间)的最大值,默许值为-1,不受堆内存大小界限,此时,只会受限于土产货内存大小。

临了需要精通的是: 退换方法区(元空间)的大小会发生Full GC,这种操作的代价短长常兴盛的。如果发现专揽在启动的时间发生了Full GC,则很有可能是方法区(元空间)的大小被迫态退换了。

是以,为了尽量不让JVM动态退换方法区(元空间)的大小形成频繁的Full GC,一般将-XX:MetaspaceSize和-XX:MaxMetaspaceSize诞生成一样的值。例如,物理内存8G,不错将这两个值诞生为256M

临了,咱们一说念看下在物理内存8G的情况下,启动专揽圭臬时,不错诞生的JVM参数。虽然,我这里给出的是一些训戒值,施行部署到分娩环境时,需要经过压测找到最好的参数值。

威尼斯人娱乐 启动SpringBoot
java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar xxx.jar 
启动Tomcat(Linux)

在Tomcat bin目次下catalina.sh文献里建树。

www.premiersportshq.com
‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M 
启动Tomcat(Windows)

在Tomcat bin目次下catalina.bat文献里建树。

皇冠体育hg86a

皇冠客服飞机:@seo3687
‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M 
回归

本文以口试为布景,探讨了干系JVM的常见口试问题。著作起原以一个常见的口试题例如,诠释了JVM在互联网大厂口试中的进攻性。接下里,先容了JVM的体绑缚构,包含:方法区(元空间)、堆、栈、土产货方法栈和圭臬计数器。

随后,先容了JVM中的双亲请托机制,诠释了何为双亲请托,为何使用双亲请托机制,类加载器的父子关系。需要精通的是:这里说的类加载器的父子关系并不是父类和子类的关系。随后,先容了各个类加载器要加载哪些类。

接下来,先容了类的加载经过,主要包含:加载、考据、准备、贯通和运转机等形势,同期,诠释了各个形势的主要作用。

临了,先容了JVM中常用的调优参数,涵盖堆、重生代、方法区(元空间)和栈(线程)常用的调优参数。并以Tomcat调优为例,详备诠释了怎样使用这些调优参数。 

说了这样多你皆掌持了吗?

皇冠现金

本文转载自微信公众号「冰河时间」,不错通过以下二维码关爱。转载本文请接洽冰河时间公众号。

 



上一篇:iba电子游戏博彩平台博弈_改日十年最“暴利”的五大行业,谁作念谁挣钱!
下一篇:太平洋在线私网博彩规则_国安无缘下赛季亚冠! 国安积48分无缘中超前四, 告别下赛季亚冠

网友评论