我是靠谱客的博主 怕孤单柜子,最近开发中收集的这篇文章主要介绍Jdk8新特性(八):新的内存空间和异常处理8. JDK8 新的内存空间和异常处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

8. JDK8 新的内存空间和异常处理

8.1. JDK8内存空间Matespace

 JVM 种类有很多,⽐如 Oralce-Sun Hotspot,Oralce JRockit,IBM J9,Taobao JVM,我们讲的是Hotspot才有,JRockit以及J9是没有这个区域。

 JVM内存知识,在JDK8之前的HotSpot JVM,有个区域叫做“永久代(permanent generation), 通过在命令行设置参数-XX:MaxPermSize来设定永久代最大可分配的内存空间。

 如果JDK8⾥里里⾯面设置了了PermSize和MaxPermSize 会被忽略并给出警告。

 作用:该块内存主要是被JVM用来存放class和mate信息的,当 class 被加载(loader)的时候就会被存储到该内存区中,如方法的编译信息及字节码、常量池和符号解析、类的层级信息,字段,名字等。

 有大项目经验的同学对下面这个异常应该熟悉:
java.lang.OutOfMemoryError: PermGen space
原因是: 永久代空间不够,类太多导致。

 Jdk8的修改JDK8 HotSpot JVM 使用本地内存来存储类元数据信息,叫做元空间(Metaspace),在默认情况下Metaspace的大小只与本地内存大小有关。
常用的两个参数:
-XX:MetaspaceSize=N 指Metaspace扩容时触发FullGC的初始化阈值。
-XX:MaxMetaspaceSize=N 指用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存。
注:不管两个参数如何设置,都会从20.8M开始,然后随着类加载越来越多不断扩容调整直到最大。

 查看大⼩ jstat -gc pid MC: current metaspace capacity MU: mateaspace utilization 单位是KB。


8.2. JDK7异常处理try-with-resources

8.2.1. Try-catch-finally

经典案例代码:数据库查询操作

String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/dept?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "1234";

public void OldTest() {
	Connection conn = null;
	PreparedStatement pst = null;
	ResultSet rs = null;
	try {
		Class.forName(driver);
		conn = DriverManager.getConnection(url, username, password);
		String sql = "select * from dept limit 1";
		pst = conn.prepareStatement(sql);
		rs = pst.executeQuery();
		while(rs.next()) {
			String name = rs.getString("name");
			System.out.println(name);//研发部
		}
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		if(conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(pst != null) {
			try {
				pst.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

8.2.2. Try-with-resources

在JDK7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resources语法,才实现了这一功能。

try-with-resources并不是JVM虚拟机的新增功能,只是JDK实现的一个语法糖,反编译后,看到JVM实际执行的还是Try-catch-finally中的代码。

try-with-resources中,try后面圆括号内的代码即为resources(resources必须为实现java.lang.AutoCloseable或者java.io.Closeable接口的类),并且resources可以有多个,用分号隔开。try代码块执行完毕后,Java会自动调用close方法,这个动作会早于finally中的方法。

public void newTest() {
	try {
		Class.forName(driver);
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
	String sql = "select * from dept limit 1";
	try (
		Connection conn = DriverManager.getConnection(url, username, password);
		PreparedStatement pst = conn.prepareStatement(sql);
		ResultSet rs = pst.executeQuery();
	){
		while(rs.next()) {
			String name = rs.getString("name");
			System.out.println(name);//研发部
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

最后

以上就是怕孤单柜子为你收集整理的Jdk8新特性(八):新的内存空间和异常处理8. JDK8 新的内存空间和异常处理的全部内容,希望文章能够帮你解决Jdk8新特性(八):新的内存空间和异常处理8. JDK8 新的内存空间和异常处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部