JVM题目和自己的解法(持续更新)

1、题目:
写一个程序,让程序在运行之后,最终抛出由于Perm区溢出引起的OOM,给出运行的jdk版本,程序源码,运行参数,
以及系统溢出后的截图、程序所依赖的jar包说明,并说明你的基本思路
思路:
参考添加链接描述

  • 想要perm抛出Oom,首先要知道oom存放什么数据: 类型的常量池, 字段、方法信息 ,方法字节码
  • 由于Java想要动态创建字段、class信息需要引用到第三方Jar包。所以这个地方我利用无限创建常量池来使得抛出perm gen oom jvm
  • 运行参数:-server -Xmx10m -Xms10m -XX:-DoEscapeAnalysis -XX:+PrintGC
    在这里插入图片描述
    代码:
	public static void main(String[] args) {
//		写一个程序,让程序在运行之后,最终抛出由于Perm区溢出引起的OOM
//		,给出运行的jdk版本,程序源码,运行参数,
//		以及系统溢出后的截图、程序所依赖的jar包说明,并说明你的基本思路
		List<String> list = new ArrayList<String>();
		while (true) {
			list.add(UUID.randomUUID().toString().intern());
		}

	}

2、题目:
你能想到有什么办法,可以让一个程序的函数调用层次变的更深。比如,你在一个递归调用中,发生了stack的溢出,你可以做哪些方面的尝试,使系统尽量不溢出?阐述你的观点和原因。
我们首先要了解递归调用时哪些会放在栈中,方法的局部变量、操作数栈、常量池指针这些会放在栈中,因此我们想尽量扩大深度,那么这些肯定要是最小的,但是为了计算深度,其次我们可以用volatile关键字来进一步降低空间,因为线程会对一个没有volatile的变量进行临时存储,这就导致线程栈的空间增大,如果对一个变量增加volatile修饰,可以适当增加深度。代码:

private volatile int i = 0;
	private volatile int b = 0;
	private volatile int c = 0;
 
	// private int i=0;
	// private int b=0;
	// private int c=0;
 
	public static void main(String[] args) {
		Test o = new Test();
		try {
			o.deepTest();
		} catch (Throwable e) {
			System.out.println("over flow deep:" + o.i);
			e.printStackTrace();
		}
	}
 
	private void deepTest() {
		++i;
		++b;
		++c;
		deepTest();
	}

加上volatile关键字为:

在这里插入图片描述
去掉volatile关键字的深度为9944,比上面少了一些
在这里插入图片描述
当然如果你在方法上面再加上一些局部变量,深度就又会少一些。

以下这两道题没有写出来。。。
3、题目:
-Xmx 和 –Xms 应该保持一个什么关系,可以让系统的性能尽可能的好呢?是不是虚拟机内存越大越好?
首先并不是虚拟机内存越大就越好,大概原因是因为:内存越大,JVM 进行 Full GC 所需的时间越久,由于 Full GC 时 stop whole world 特性,如果是用于响应HTTP 请求的服务器,这个时候就表现为停止响应,对于需要低延迟的应用来说,这是不可接受的。对于需要高吞吐量的应用来说,可以不在乎这种停顿,比如一些后台的应用之类的,那么内存可以适当调大一些。需要根据具体情况权衡。

4、问题:
如果你要做一个Java的桌面产品,需要绑定JRE,但是JRE又很大,你如何做一下JRE的瘦身呢?
编写脚本,剔除rt.jar中不需要的class

5、问题:
标记压缩对标记清除而言,有什么优势呢?
我觉得标记压缩可以使空间连续,但是增加了移动成本

6、问题
GC的主要作用区域

是方法区和堆!!!

7、Java.lang.NoSuchFieldError错误可能在什么阶段抛出
这个错误在校验阶段抛出
校验器在进行符号引用的验证。
如果一个需要使用的类无法在系统中找到会抛出NoClassDefFoundError.

8、遇到内存溢出后,应该如何思考和处理问题?
emm,我觉得从堆,永久区、线程栈以及直接内存四个方面进行描述即可

9、减少锁粒度后,可能会带来什么负面影响呢?以ConcurrentHashMap为例,说明分割为多个
Segment后,在什么情况下,会有性能损耗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值