public class Car {public static void main(String[] args) {Car car1 = new Car();
Car car2 = new Car();
System.out.println(car1 == car2); //false,故其hascode不同
System.out.println(car1.getClass() == car2.getClass()); //true,故其hascode相同
System.out.println(car1.getClass().getClassLoader()); //AppClassLoader
System.out.println(car1.getClass().getClassLoader().getParent()); //ExtClassLoader
}
}
SandBox机制public class Demo1 {
public static void main(String[] args) {
new Thread(()->{
},"adair");
}
//native:java本身无法完成,无方法体,需要调用底层
//native会进入本地方法栈 → JNI → 本地方法库
//JNI作用,扩展java语言,融合不同编程语言为java使用。
//例如java驱动打印机,管理系统,写外挂
private native void start0();
}
内存
方法区JVM有三种hotspot
、J9VM
、JRockit
、
一个JVM只有一个堆,且堆内存的大小可变
堆的东西:类、方法、常量、变量、 真实对象
堆的三个区域:
新生区:类的诞生 + 甚至死亡的地方。
eden:对象被new的地方,满了就会触发轻GC,幸存者存放在s1
如果幸存区满了,引发重GC(全局清理),送入养老区
如果养老区满了,则OOM
永久区:常驻内存,存放JDK自身的Class对象。interface元数据,存储的是java运行时的环境。这个区域无GC,关闭JVM即可释放此区域。一个启动类,加载大量第三方jar包,或者生成大量的反射类,直到OOM
元空间、永久区、方法区、常量池关系:java8 hotspot取消了永久区。方法区是一个规范,规范没变,它就一直在,取而代之的是元空间,元空间存储类的元信息,静态变量和常量池等并入堆中。
元空间:逻辑存在,物理不存在,
JVM调参:
public class Car {public static void main(String[] args) {//jvm试图使用的大内存
long l = Runtime.getRuntime().maxMemory();
//jvm初始化的内存
long l1 = Runtime.getRuntime().totalMemory();
//默认大为电脑内存的1/4,初始化为1/64
System.out.println(l/(double)1024/1024);
System.out.println(l1/(double)1024/1024);
//jvm调参:-Xms1024m -Xmx2g -XX:+PrintGCDetails
}
}
Jprofiler在一个很大项目中,出现了OOM,OOM要想捕获用Error e捕获,如何使用专业工具排错
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
Thread Dump
可查看线程的main函数中具体第几行出现错误JVM的GC几乎全部在堆中,对堆的清理大部分在eden区
内存效率:复制算法 >标记清除 >标记压缩 (时间复杂度)
内存整齐度:复制算法 = 标记压缩 >标记清除
内存利用率:标记压缩 = 标记清除 >复制算法
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧