复习笔记6

趋势科技

引用
25*25的矩阵
从每行里面选择最大的一个数,然后找出最小的数记为A
从每列里面选择最小的一个数,然后找出最大的数记为B
问AB大小


第一反应是无法判断,写一下推理发现时另外一回事
假设A为(x1,y1),B为(x2,y2)
根据题设条件2,B应该小于(x2,y1)
根据题设条件1,(x2,y1)又小于A
所以B应该是小于A的,放开限制,应该是小于等于

引用
字符串text,求最大不重复字串长度


public int find(String[] arr) {
		int max = 1, templength = 1;
		int begin = 0, end = 1;
		HashSet<String> set = new HashSet<String>();
		set.add(arr[0]);
		while ((begin + max < arr.length) && (begin + templength < arr.length)
				&& (end < arr.length)) {
			String temp = arr[end];
			if (set.contains(temp)) {
				set.remove(arr[begin]);
				begin++;
				if (templength > max) {
					max = templength;
					templength--;
				} else if (templength > 1) {
					templength--;
				}
			} else {
				set.add(temp);
				end++;
				templength++;
			}
		}
		if (templength > max) {
			max = templength;
		}
		return max;
	}

时间复杂度o[n]
其实可以不用set而是用数组,将字符转为ascii码,然后成为数组的序号,这样空间复杂度上会更好一点。

另外趋势科技笔试题中出现了弱引用、ByteArrayInputStream.available() 这些之前根本没用过的api,需要今后注意一下。

-----------------------------------

网易

网易的笔试是我做过最难的一套java笔试题,最后的题目靠的是jvm优化
第一小问简单,heap的结构
第二小问是高吞吐要求下jvm优化策略
第三小问是低延时要求下jvm优化策略

查了下

引用

3.1 吞吐量优先

吞吐量是指GC的时间与运行总时间的比值,比如系统运行了100分钟,而GC占用了一分钟,那么吞吐量就是99%,吞吐量优先一般运用于对响应性要求不高的场合,比如web应用,因为网络传输本来就有延迟的问题,GC造成的短暂的暂停使得用户以为是网络阻塞所致。

吞吐量优先可以通过-XX:GCTimeRatio来指定。

当通过-XX:GCTimeRatio不能满足系统的要求以后,我们可以更加细致的来对JVM进行调优。

首先因为要求高吞吐量,这样就需要一个较大的Young generation,此时就需要引入“Parallel scavenging Collector”,可以通过参数:-XX:UseParallelGC来配置。

java -server -Xms3072m -Xmx3072m -XX:NewSize=2560m -XX:MaxNewSize=2560 XX:SurvivorRatio=2 -XX:+UseParallelGC

当年轻代使用了"Parallel scavenge collector"后,老生代就不能使用"CMS"GC了,在JDK1.6之前,此时老生代只能采用串行收集,而JDK1.6引入了并行版本的老生代收集器,可以用参数-XX:UseParallelOldGC来配置。
3.1.1 控制并行的线程数

缺省情况下,Parallel scavenging Collector 会开启与cpu数量相同的线程进行并行的收集,但是也可以调节并行的线程数。假如你想用4个并行的线程去收集Young generation的话,那么就可以配置-XX:ParallelGCThreads=4,此时JVM的配置参数如下:

java -server -Xms3072m -Xmx3072m -XX:NewSize=2560m -XX:MaxNewSize=2560 XX:SurvivorRatio=2 -XX:+UseParallelGC -XX:ParallelGCThreads=4
3.1.2 自动调节新生代

在采用了"Parallel scavenge collector"后,此GC会根据运行时的情况自动调节survivor ratio来使得性能最优,因此"Parallel scavenge collector"应该总是开启此参数。

此时JVM的参数配置如下:

java -server -Xms3072m -Xmx3072m -XX:+UseParallelGC    -XX:ParallelGCThreads=4 -XX:+UseAdaptiveSizePolicy


3.2 响应时间优先

响应时间优先是指GC每次运行的时间不能太久,这种情况一般使用与对及时性要求很高的系统,比如股票系统等。

响应时间优先可以通过参数-XX:MaxGCPauseMillis来配置,配置以后JVM将会自动调节年轻代,老生代的内存分配来满足参数设置。

在一般情况下,JVM的默认配置就可以满足要求,只有默认配置不能满足系统的要求时候,才会根据具体的情况来对JVM进行性能调优。如果采用默认的配置不能满足系统的要求,那么此时就可以自己动手来调节。

此时"Young generation"可以采用"Parallel copying collector",而"Old generation"则可以采用"Concurrent Collector",

举个例子来说,以下参数设置了新生代用Parallel Copying Collector,老生代采用CMS收集器。

java -server -Xms512m -Xmx512m  -XX:NewSize=64m -XX:MaxNewSize=64m -XX:SurvivorRatio=2         -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

此时需要注意两个问题:

1 如果没有指定-XX:+UseParNewGC,则采用默认的非并行版本的copy collector.

2  如果在一个单CPU的系统上设置了-XX:+UseParNewGC ,则默认还是采用缺省的copy collector.
3.2.1 控制并行的线程数

默认情况下,Parallel copy collector启动和CPU数量一样的线程,也可以通过参数-XX:ParallelGCThreads来指定,比如你想用3个线程去进行并发的复制收集,那么可以改变上述参数如下:

java -server -Xms512m -Xmx512m -XX:NewSize=64m  -XX:MaxNewSize=64m -XX:SurvivorRatio=2        -XX:ParallelGCThreads=4    -XX:+UseConcMarkSweepGC       -XX:+UseParNewGC
3.2.2 控制并发收集的临界值

默认情况下,CMS gc在"old generation"空间占用率高于68%的时候,就会进行垃圾收集,而如果想控制收集的临界值,可以通过参数:-XX:CMSInitiatingOccupancyFraction来控制,比如改变上述的JVM配置如下:

java -server -Xms512m -Xmx512m -XX:NewSize=64m  -XX:MaxNewSize=64m -XX:SurvivorRatio=2        -XX:ParallelGCThreads=4    -XX:+UseConcMarkSweepGC       -XX:+UseParNewGC      -XX:CMSInitiatingOccupancyFraction=35


待续

你可能感兴趣的:(jvm,cms,Web,网络应用)