面试专题:java虚拟机(2)

8.垃圾收集有哪些算法,各自的特点?

标记清除

直接将要回收的对象标记,发送gc的时候直接回收:特点回收特别快,但是回收以后会造成
很多不连续的内存空间,因此适合在老年代进行回收,CMS(current mark-sweep),就是采
用这种方法来回收老年代的。

标记整理

就是将要回收的对象移动到一端,然后再进行回收,特点:回收以后的空间连续,
缺点:整理要花一定的时间,适合老年代进行会后,parallel Old(针对parallelscanvange gc的) gc和Serial old就是采用该算法进行回收的。

 复制算法

将内存划分成原始的是相等的两部分,每次只使用一部分,这部分用完了,就将还存活
的对象复制到另一块内存,将要回收的内存全部清除。这样只要进行少量的赋值就能够
完成收集。比较适合很多对象的回收,同时还有老年代对其进行担保。

分代收集

    对新生代的对象的收集称为minor GC;对旧生代的对象的收集称为Full GC;程序中主动调用System.gc()的GC为Full GC。

9.HotSpot为什么要分为新生代和老年代?

因为有的对象寿命长,有的对象寿命短。应该将寿命长的对象放在一个区,寿命短的对象
放在一个区。不同的区采用不同的垃圾收集算法。寿命短的区清理频次高一点,寿命长的
区清理频次低一点。提高效率。

10.常见的垃圾回收器有那些?

JVM中的垃圾回收器,主要包括串行回收器、并行回收器以及CMS回收器、G1回收器。他们各自都有优缺点,通常来说你需要根据你的业务,进行基于垃圾回收器的性能测试,然后再做选择。下面给出配置回收器时,经常使用的参数:

-XX:+UseSerialGC:在新生代和老年代使用串行收集器-XX:+UseParNewGC:在新生代使用并行收集器-XX:+UseParallelGC :新生代使用并行回收收集器,更加关注吞吐量-XX:+UseParallelOldGC:老年代使用并行回收收集器-XX:ParallelGCThreads:设置用于垃圾回收的线程数-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器-XX:ParallelCMSThreads:设定CMS的线程数量-XX:+UseG1GC:启用G1垃圾回收器

现在常见的垃圾收集器有如下几种:

新生代收集器:

Serial
ParNew
Parallel Scavenge
老年代收集器:

Serial Old
CMS
Parallel Old
堆内存垃圾收集器:G1

每种垃圾收集器之间有连线,表示他们可以搭配使用。

或者也可以分为串行的/并行的/G1收集器

 串行的:也就是采用单线程(比较老了),分类:serial new(收集年轻代,复制算法)和serial old(收集老年代,标记整理),缺点:单线程,进行垃圾回收时暂时所有的用户线程。优点:实现简单

并行的:采用多线程,对于年轻代有两个: parallel new(简称ParNew)和parallel scavenge;parallel scavenge是一个针对年轻代的垃圾回收器,采用复制算法,主要的优点是进行垃圾回收时不会停止用户线程(不会发生stop all world)
老年代回收器也有两种:Parallel old和CMS。Parallel old是parallel scavenge为老年代设计的。CMS(并发标记清除),他采用标记清除算法,采用这种的优点就是快咯,因此会尽快的进行回收,减少停顿时间。

G1收集器,年轻代和老年代通吃,最新一代的技术。面向服务器端的垃圾收集器(并行+并发的垃圾收集器)整体上标记-整理 局部上 复制

11.介绍一下CMS,G1收集器。

区别一:使用的范围不一样
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。
G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用。

区别二:使用的算法不一样
CMS收集器是使用“标记-清除”算法进行的垃圾回收。
G1收集器使用的是“标记-整理”算法进行的垃圾回收。

区别三:CMS收集器和G1收集器的优劣性
CMS收集器以最小的停顿时间为目标的收集器,容易产生内存碎片。
G1收集器不会产生内存碎片。

区别四:垃圾回收的过程不一样
CMS收集器:初始标记→并发标记→重新标记→标记清楚
G1收集器:初始标记→并发标记→最终标记→筛选回收

12.Minor Gc和Full GC 有什么不同呢?

 区别:
Minor GC又称为新生代GC :指的是发生在新生代的垃圾收集。因为Java对象大多都具备朝生夕灭的特 性,因此Minor GC(采用复制算法)非常频繁,一般回收速度也比较快。
Full GC 又称为 老年代GC或者Major GC : 指发生在老年代的垃圾收集。出现了Major GC,经常会伴随 至少一次的Minor GC(并非绝对,在Parallel Scavenge收集器中就有直接进行Full GC的策略选择过程)。 Major GC的速度一般会比Minor GC慢10倍以上。老年代:标记-整理算法(清理的时候做内存移动)
 
拓展问题:
1.String类和常量池:

在java的内存分配中,经常听到很多关于常量池的描述,

String 对象的两种创建方式:

String str1 = "abcd";  // 先检查字符串常量池中有没有"abcd"。如果没有,则创建一个,然后 str1 指向字符串常量池中的对象;如果有,则直接将 str1 指向"abcd"String str2 = new String("abcd");  // 堆中创建一个新的对象String str3 = new String("abcd");  // 堆中创建一个新的对象System.out.println(str1==str2);  // falseSystem.out.println(str2==str3);  // false

第一种方式,是在常量池中拿对象(str1)
第二种方式,是直接在堆内存空间创建一个新的对象(str2和str3)

只要是使用 new 的方法,便需要创建新的对象

全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的。)。 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个哈希表,里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用(而不是驻留字符串实例本身),也就是说在堆中的某些字符串实例被这个StringTable引用之后就等同被赋予了”驻留字符串”的身份。这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。 

class文件常量池(class constant pool) :

我们都知道,class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。 字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。 符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可(它与直接引用区分一下,直接引用一般是指向方法区的本地指针,相对偏移量或是一个能间接定位到目标的句柄)。一般包括下面三类常量: 

类和接口的全限定名字段的名称和描述符方法的名称和描述符

常量池的每一项常量都是一个表,一共有如下表所示的11种各不相同的表结构数据,这每个表开始的第一位都是一个字节的标志位(取值1-12),代表当前这个常量属于哪种常量类型。 每种不同类型的常量类型具有不同的结构,具体的结构本文就先不叙述了,本文着重区分这三个常量池的概念(读者若想深入了解每种常量类型的数据结构可以查看《深入理解java虚拟机》第六章的内容)。 

2.8种基本类型的包装类和常量池

Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;这 6 种包装类默认创建了数值[-128,127] 的相应类型的缓存数据,而超出此范围的仍然会去创建新的对象
两种浮点数类型的包装类 Float,Double 并没有实现常量池技术

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp(二) 之 uniapp 搭建与组件库的引用

小扩展: rpx(responsive pixel):可以根据屏幕宽度自适应。规定屏幕宽度为750rpx。如果iphon6上,屏幕宽度为375px,共有750个像素,则750rpx 375培训 750物理像素,1rpx 0.5px 1物理像素。 页面跳转&#xff…

linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、update命令注意点

简介 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。 它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在…

linux进程管理原理

Linux 是一种动态系统,能够适应不断变化的计算需求。 linux 计算需求的表现是以进程的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,对进程…

【开发工具集】Process Explorer——进程资源管理器

进程资源管理器 特性 Process Explorer 是 Sysinternals 出品的工具,其在功能方面的独特之处有以下几点: 显示进程安全令牌(比如安全组列表、特权,以及虚拟化状态)。 加亮显示进程和线程列表中的变化。 列出服务宿主…

华为OD机试题【支持优先级的队列】【2023 B卷 100分】

文章目录 🎯 前言🎯 题目描述🎯 解题思路📙 Python代码实现📗 Java代码实现📘 C语言代码实现 🎯 前言 🏆 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最…

Windows进程管理

一、实验目的 (1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。 (2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,…

Python Supervisord 进程管理工具

Supervisord,用Python实现的一款非常实用的进程管理工具,在批量服务化管理时特别有效。 环境centospython2.6.6 安装 wget http://pypi.python.org/packages/source/s/supervisor/supervisor-3.0a10.tar.gztar zxvf supervisor-3.0a10.tar.gzcd superv…

Linux 进程管理

介绍一些 Linux 所提供的工具来进行进程的查看与控制,掌握这些工具让我们能在某些进程出现异常的时候及时查看相关的指标,从而解决问题。 一、进程查看 top:实时的查看进程的状态ps:静态查看当前的进程信息pstree:查看当前活跃进程的属性结构 1.1 top工…

Python实现的进程管理神器——Supervisor

文章目录 常用命令简介安装创建配置文件开机自启初试Web 界面配置文件子进程配置模板可用变量supervisorctl 命令Supervisor 组件卸载遇到的坑参考文献 常用命令 修改配置并重启子进程 vim /etc/supervisor/conf.d/xxx.conf supervisorctl reread supervisorctl update super…

Supervisor后台进程管理工具

Supervisor后台进程管理工具安装配置 一、安装及配置 1、Python liunx自带有了不需要安装(没有的话需要安装) 2、easy_install是setuptools包里带的一个命令 wget--no-check-certificate https://bootstrap.pypa.io/ez_setup.py -O - | sudo python 3、安…

Linux运维工具Supervisor(进程管理工具)

文章目录 一、介绍二、自带Web管理程序三、安装1、安装2、源码安装3、yum安装 四、配置文件五、启动六、设置开机启动七、查看 supervisord 是否在运行八、supervisorctl管理命令九、配置文件说明十、ini配置文件 举例说明十一、开启web页面管理程序十二、解决“unix:///tmp/su…

【Supervisor】Python 进程管理工具

Supervisor的安装配置与使用 一、简介 【1】Supervisor是Python开发的进程管理工具(Client/Server系统),可以管理和监控Unix,Linux,Mac OS X 系统上的进程,无法运行在Windows上 【2】Supervisor官方版目前只…

Python supervisor 强大的进程管理工具

一、问题背景 1、背景 如何才能让一个进程摆脱终端,获得相对较长的生命周期? 2、后台(守护)、前台进程 什么是守护进程?通俗点讲就是后台跑着的进程,不会因为你关了终端服务就会随之停止,直到你把计算机的电源关闭…

进程管理工具supervisor的使用、常见报错问题处理

进程管理工具supervisor的使用、常见报错问题处理 1 安装2 简介2.1 supservisor自身提供三个命令:2.1.1 supervisorctl2.1.2 supervisord2.1.3 echo_supervisord_conf 2.2 配置文件2.3 重要事项2.4 查看supervisor的log日志 3 配置3.1 修改配置文件3.2 加载配置文件…

进程管理工具——Supervisord简介及安装

一、简介 Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动、重启(自动重启程序)、关闭进程(不仅仅是 Python 进程) Supervisor 是一个 …

Supervisor进程管理详解

文章目录 1. supervisor简介2. supervisor安装2.1 安装方式2.2 验证 3. supervisor配置文件3.1 主配置文件3.2 子配置文件(program 配置)3.2.1 详细配置3.2.2 公司配置 4. 进程管理命令5. web管理(不常用)6. Supervisor配置systemctl服务7. Supervisor管…

Linux 中进程管理工具汇总

如果我们的Linux系统整个系统资源快要被耗尽时,我们是否能够找出那个最消耗系统资源的进程,然后删除该进程,让系统恢复正常呢,或者由于某个程序存在BUG,导致产生一系列的问题,有如何查找它并结束进程&#…

Supervisor安装与配置(Linux/Unix进程管理工具)

原文链接:http://blog.csdn.net/xyang81/article/details/51555473 Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很…

linux进程管理工具:supervisor

各种各样的程序运行情况中,或多或少都会有一些服务是用脚本跑起来的,我们通常的做法一般都是让其在后台运行,例如使用nohup,&等命令。 而这样的方法并不十分可靠,所以在这里推荐一个非常好用的进程管理工具&#x…

进程管理工具Supervisor

简介 Supervisor是一个客户端/服务器系统,允许用户在类UNIX操作系统上控制许多进程。它是基于python语言开发一个进程管理工具。 Supervisor的服务器端称为supervisord,主要负责在启动自身时启动管理的子进程,响应客户端的命令,重…