JDK体系结构
Java语言的跨平台特性
java语言的跨平台其实是靠不同操作系统对应不同的jvm,由jvm将class文件编码成对应操作系统的机器码,从而实现跨平台。
JVM整体结构及内存模型
二、JVM内存参数设置
方法区连个参数 -XX:MetaspaceSize, -XX:MaxMetaspaceSize
-XX:MaxMetaspaceSize:
方法区最大内存空间,如果不设置默认为-1,及不限制大小,或者说是物理机内存大小。
-XX:MetaspaceSize:
该参数设置触发full gc的阈值,默认为21M,方法区占用空间超过该值,JVM会触发一次full gc,之后会对该次GC结果进行评估,如果gc过后清理了大部分的类元信息,释放了大量内存,就会动态调整该参数的值,减少该阈值,反之则增加该阈值。如果一个web项目class文件较多(通常情况),且不设置该值,当方法区内存占满21M后会频繁出现full gc ,具体体现就是启动tomcat项目过程很慢。所以一般需要手动设置该参数大小。一般一个8G的服务机器设置成256M合适。
-Xss
虚拟机栈空间大小设置
java.lang.StackOverflowError 栈空间溢出例子
package com.zcp.jvm;
/**
* 线程栈空间测试
*/
public class XssTest {
static int count =0;
static void redo(){
count++;
redo();
}
/**
* -Xss128K 设置不同栈空间大小测试
* @param args
*/
public static void main(String[] args) {
try {
redo();
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println(count);
}
}
}
运行结果
1088
Exception in thread "main" java.lang.StackOverflowError
at com.zcp.jvm.XssTest.redo(XssTest.java:11)
at com.zcp.jvm.XssTest.redo(XssTest.java:12)
at com.zcp.jvm.XssTest.redo(XssTest.java:12)
at com.zcp.jvm.XssTest.redo(XssTest.java:12)
at com.zcp.jvm.XssTest.redo(XssTest.java:12)
当-Xss值设置的越大,对应count值就越大,体现JVM内存模型中就是 线程栈的栈帧数量越多,虚拟机可分配的线程数就会越小。
JVM内存参数大小该如何设置?
JVM参数大小设置并没有固定标准,需要根据实际项目情况分析。