趋势科技
[quote]25*25的矩阵
从每行里面选择最大的一个数,然后找出最小的数记为A
从每列里面选择最小的一个数,然后找出最大的数记为B
问AB大小[/quote]
第一反应是无法判断,写一下推理发现时另外一回事
假设A为(x1,y1),B为(x2,y2)
根据题设条件2,B应该小于(x2,y1)
根据题设条件1,(x2,y1)又小于A
所以B应该是小于A的,放开限制,应该是小于等于
[quote]字符串text,求最大不重复字串长度[/quote]
时间复杂度o[n]
其实可以不用set而是用数组,将字符转为ascii码,然后成为数组的序号,这样空间复杂度上会更好一点。
另外趋势科技笔试题中出现了弱引用、ByteArrayInputStream.available() 这些之前根本没用过的api,需要今后注意一下。
-----------------------------------
网易
网易的笔试是我做过最难的一套java笔试题,最后的题目靠的是jvm优化
第一小问简单,heap的结构
第二小问是高吞吐要求下jvm优化策略
第三小问是低延时要求下jvm优化策略
查了下
[quote]
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
[/quote]
待续
[quote]25*25的矩阵
从每行里面选择最大的一个数,然后找出最小的数记为A
从每列里面选择最小的一个数,然后找出最大的数记为B
问AB大小[/quote]
第一反应是无法判断,写一下推理发现时另外一回事
假设A为(x1,y1),B为(x2,y2)
根据题设条件2,B应该小于(x2,y1)
根据题设条件1,(x2,y1)又小于A
所以B应该是小于A的,放开限制,应该是小于等于
[quote]字符串text,求最大不重复字串长度[/quote]
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优化策略
查了下
[quote]
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
[/quote]
待续