Java8新特性学习

Java8刚正式发布没几天,今天特地体验了一下,看了一下官方文档和牛人的点评,最让我印象深刻有两个:Lambda表达式和MetaSpace!

Lambda表达式

Lambda表达式可以说是千呼万唤始出来,不记得从什么时候开始,Java一直要加这个特性,直到今天终于实现了!Lambda表达式对大家来说想必不陌生,C#语言很早就支持Lambda表达式。Lambda表达式的优点就是十分简洁,原来5行代码现在一行可以实现,而且可读性强。下面是官方文档Lambda Quick Start的一个例子:

public class RunnableTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("===RunnableTest===");
		// Anonymous Runnable
		Runnable r1=new Runnable() {
			
			public void run() {
				System.out.println("hello world one!");
			}
		};
		
		//Lambda Runnable
		Runnable r2=() ->System.out.println("Hello world two!");
		
		r1.run();
		r2.run();
	}
可以看出,Lambda语法很简洁,可读性很强。Java这次加入Lambda表达式特性后,增加了一个新的包:java.util.function.这个包里定义了很多接口,通过这些接口,使用Lambda表达式,很容易开发出通用性很强的程序,具体的使用大家可以看看官方文档。

另外Java8也修改了很多原来的包,如collection、concurrent,为了能够让大家使用Lambda表达式,特别是collection集合类,添加了许多用于查找、过滤的方法,通过Lambda表达式和function包中的接口,可以迅速查找集合元素,并做一些业务逻辑等。

Remove PermGen,Metaspace
想必大家在开发过程中,肯定遇到过这样的错误:OutOfMemorry:PermGen,特别是在web应用中,热部署或者大量使用框架,经常出现这种错误。这是因为在程序启动时,会预先加载类信息和一些常量到JVM内存中,这块内存叫做PermGen,由于PermGen默认较小,所以在不进行调整时,会经常出现PermGen不够用的情况,还有就是程序有内存泄漏情况,内存回收无法及时回收PermGen内存,导致使用内存越来越大。
这次Java8修改了JVM,去掉了PermGen内存,转而出现了一个Metaspace,其实这两个的作用都类似,都是用来装载一些类信息。但是PermGen是在JVM内存中的,而新的Metaspace是直接在本地内存中的!!!
也就是说,Metaspace大小默认是不受限制的(当然还要根据本地机器的内存大小),这样关于PermGen 内存不够用这样的错误,大家可能再也见不到了,除非你的程序需要很大内存,比机器本身内存还大。
那么我们如果想控制Metaspace内存大小怎么办?MaxMetaspaceSize这个参数可以用来控制最大Metaspace空间。如果设置了这个参数,当你的程序有内存泄漏或者类信息十分多,Metaspace使用量可能超过MaxMetaspaceSize,这时程序将会出现错误:OutOfMemorry:Metaspace!
国外有人详细对比了两个版本JVM关于这块内存修改的影响:Java 8: From PermGen to Metaspace


Java8新特性学习,布布扣,bubuko.com

Java8新特性学习

上一篇:为什么在Spring的配置里,最好不要配置xsd文件的版本号


下一篇:Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryEr