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

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

  1. -Xss:规定了每个线程虚拟机栈(堆栈)的大小,256K就已足够。-Xss大小会影响并发线程数的大小;
  2. -Xmx:堆的内存在不够的时候会进行扩容,-Xmx是堆能够扩展到的最大值;
  3. -Xms:堆刚被创建出来的初始大小。

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

2、Java内存模型中堆和栈的区别

首先来了解一下内存分配策略。
程序运行时候有三种运行分配策略:

  1. 静态存储

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

  1. 栈式存储

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

  1. 堆式存储

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

下面来说一下堆和栈的区别和联系:
堆和栈的联系

引用对象、数组的时候栈里定义变量保存堆中目标的首地址,可以使用栈里面的变量来访问堆中的首地址。引用变量相当于为数组或者对象起得一个名称,引用变量是普通的变量,在栈中分配,引用变量在其作用域使用过后就会被释放,数组和对象本身在堆中分配当没有引用变量去使用数组和堆的时候就是回收的时候,之后不确定的时间会被垃圾回收器进行回收。
在这里插入图片描述
堆和栈的区别

  • 管理方式:栈自动进行释放,堆需要GC去释放空间;
  • 空间大小:栈比堆小;
  • 碎片相关:栈产生的碎片远小于堆,是因为堆里面存放了大量类的实例;
  • 分配方式:栈支持静态和动态分配,堆仅支持动态分配;
  • 效率方面:栈的效率比堆高。

栈的结构更加接近计算机底层,因此栈的效率要比堆高,栈的操作简单只有出栈和入栈;但是堆最大的优点不再于速度因为真正程序执行过程中是很复杂的堆的动态分配正好说明这一点。

3、解释一下不同版本JDK之间的intern()方法的区别(JDK6和JDK6+)

intern方法时如何使用的:

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

intern是String自带的一个方法。

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

JDK6+:调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中的该字符串的引用。否则如果该字符串对象已经存在于Java堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在则池中创建该字符串并返回其引用。

简单总结一下:JDK6之后不仅在池中加载字符串对象,还会在Java堆中加载一份字符串对象。

发布了242 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44240370/article/details/104065129
今日推荐