剑指Offer(JVM)——Java内存模型相关常考题

  1. JVM三大性能调优参数 -Xms -Xmx -Xss的含义?

-Xss:规定了每个线程虚拟机栈(堆栈)的大小,一般来说,256K就足够了。-Xss的大小会影响并发线程数的大小。

-Xms:堆刚被创建出来的时候的初始大小。

-Xmx:指堆的内存在不够的时候,会进行扩容,-Xmx是堆能扩展到的最大值。

但我们通常将-Xms和-Xmx的大小设置成一样的,因为当堆扩容的时候会发生内存抖动,影响程序性能。

  1. Java内存模型中堆和栈的区别

回答这个问题,我们首先需要了解一下内存分配策略。

程序运行的时候,有三种运行分配策略:

(1)静态

在编译的时候就能确定每个数据目标在运行的时候的存储空间的需求。这种情况下要求方法属性都为静态,不允许有变量存在,因为静态分配是一开始就决定好固定大小的,并且不允许使用递归和嵌套,因为编译器无法计算准确的存储空间。

(2)栈式

数据区需求在编译时未知,运行的时候模块入口前确定,也就是动态的存储分配,但是在进入每一个方法前必须知道需要分配的内存空间大小。

(3)堆式

编译或者运行的时候模块入口都无法确定,也是动态分配。

通过上面所讲的,我们就可以来探索一下堆和栈的区别和联系了:

  • 堆和栈的联系

引用对象、数组的时候,栈里定义变量保存堆中目标的首地址,所以我们就可以使用栈里面的变量来访问堆中的首地址了。引用变量就相当于是为数组或者对象起的一个名称,引用变量是普通的变量,在栈中分配,引用变量在其作用域使用过后就会被释放掉,而数组和对象本身在堆中分配,当没有引用变量去使用数组和堆的时候,也就是他们被回收的时候了,随后的一个不确定的时间就会被垃圾回收器去进行回收了。

  • 堆和栈的区别

在管理方式方面,堆需要GC去进行释放空间,而栈是自动进行释放。

在空间大小方面,栈比堆小。

在GC方面,栈产生的空间碎片比堆要小,因为堆里面存放了大量类的实例。

在分配方式方面,栈支持静态和动态分配,而堆仅仅支持动态分配。

在效率方面,栈的效率比堆要高。

总结一下,因为栈的结构更加接近计算机底层,所以栈的效率是要比堆要高的,并且栈的操作简单,之后入栈和出栈;但是堆最大的特点不在于速度如何,因为真正程序执行的过程中是变化莫测的,而堆的动态分配也就正好应了这一点,是十分灵活的。

  1. 请解释一下不同jdk版本之间的intern()方法的区别(JDK6 VS JDK6+)

我们先简单看看平时我们的intern方法是怎么用的:

String s = new String("a");
s.intern();

这是一个String自带的方法。

在JDK6之前,当调用intern方法的时候,如果字符串常量池先前已创建出该字符串对象,则返回池中的该字符串的引用,否则,将该字符串对象添加到字符串常量池中,并且返回该字符串对象的引用。

在jdk6之后,当调用intern方法的时候,如果字符串常量池先前创建过该字符串对象,就返回池中的该字符串的引用,否则,如果该字符串对象已经存在于Java堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用,如果堆中不存在,则在池中创建该字符串并且返回该引用。

总结一下,最大的区别就是,JDK6之后,不但会在池中加载字符串对象,还会在java堆上加载一份字符串对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值