学习笔记
HotSpot不区分虚拟机栈和本地方法栈,所以-Xoss参数(设置本地方法栈大小)虽然存在但是无效。
栈容量只由-Xss参数设定
StackOverflowEror:线程请求深度大于虚拟机所允许的最大深处
OutOfMemoryError:虚拟机在扩展栈是无法获取足够的内存空间
-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError
demo
/**
* -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
* 设置设置最小和最大内存。当出现内存溢出是Dump出堆转内存的快照
*/
public class HeapOOM {
static class OOMObject{
}
public static void main(String[] args) {
List<OOMObject> aa = new ArrayList<OOMObject>();
while(true)
aa.add(new OOMObject());
}
}
/**
* 虚拟机栈和本地方法栈OOM(OutOfMemeroyError)测试
* java -Xss128k JavaVMStackSOF 设置栈内存大小
*/
public class JavaVMStackSOF {
private int stackLength = 1;
public void stackLeak(){
stackLength++;
stackLeak();
}
public static void main(String[] args) {
JavaVMStackSOF test = new JavaVMStackSOF();
try{
test.stackLeak();
}catch(Throwable e){
System.out.println(test.stackLength);
e.fillInStackTrace();
}
}
}
/**
* -XX:PermSize=10M -XX:MaxPermSize=10M
设置方法区的大小。常量区分配在方法区,故限制方法区的大小就限制了方法区的大小
* Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
at java.lang.String.intern(Native Method)
at RuntimeConstantPoolOOM.main(RuntimeConstantPoolOOM.java:11)
常量区内存溢出
*/
public class RuntimeConstantPoolOOM {
public static void main(String[] args) {
List<String> aa = new ArrayList<String>();
int i = 0;
while(true){
aa.add(String.valueOf(i++).intern());
}
}
}
public static void main(String[] args) {
/**
* bootstrap classloader - 引导(也称为原始)类加载器,它负责加载Java的核心类。
* 在Sun的JVM中,在执行java的命令中使用-Xbootclasspath选项或使用-D选项指定sun.boot.class.path系统属性值可以指定附加的类。
* 这个加载器的是非常特殊的,它实际上不是java.lang.ClassLoader的子类,而是由JVM自身实现的。
* 大家可以通过执行以下代码来获得bootstrap classloader加载了那些核心类库
*/
URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (int i = 0; i < urls.length; i++) {
System.out.println(urls[i]);
}
}