JVM笔记
JVM含义
定义:Java Virtual Machine - java程序的运行环境(java二进制字节码的运行环境)
-
一次编写,到处运行
-
自动内存管理。垃圾回收功能
-
数组下标越界越界检查
-
多态
比较: jvm jre jdk
JVM体系
内存结构
1.程序计数器
1.1定义
Program Counter Register程序计数器(寄存器):记住下一条jvm指令的执行地址。
1.2作用
作用:是记住下一条jvm指令的执行地址
特点:.是线程私有的 .不会存在内存溢出
2.虚拟机栈
2.1定义
栈:线程运行需要的内存空间
栈帧:每个方法运行时需要的内存
-
每个线程运行时所需要的内存。称为虚拟机栈
-
每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
-
每个线程只能有一个活动栈帧。对应着当前正在执行的那个方法
1.垃圾回收是否涉及栈内存? 不涉及。
2.栈内存分配越大越好吗? 不是,分配的越大,线程数会变少。
3.方法内的局部变量是否线程安全? 是,方法内,共享的需要考虑线程安全,私有的不需要考虑。(本人回答)
如果方法内局部变量没有逃离方法的作用访问,它是线程安全的
如果是局部变量引用了对象。并逃离方法的作用方法,需要考虑线程安全
2.2栈内存溢出
栈帧过多导致栈内存溢出,栈帧过大导致栈内存溢出
/**
* 内存溢出
* 展示栈内存溢出 java.lang.StackOverflowError
* -Xss256k
* */
public class Demoneicunyichu {
private static int count;
public static void main(String[] args) {
try {
method1();
}catch (Throwable e){
e.printStackTrace();
System.out.println(count);
}
}
private static void method1( ) {
count++;
method1( );
}
}
/**
* json 数据转换
* */
public class Demojsontransition {
public static void main(String[] args) throws JsonProcessingException {
Dept dept = new Dept();
dept.setName("marry");
Emp e1 = new Emp();
e1.setName("wang");
e1.setDept(dept);
Emp e2 = new Emp();
e2.setName("ba");
e2.setDept(dept);
dept.setEmps(Arrays.asList(e1,e2));
// { name: 'marry', emps: [{ name:'wang', dept:{ name:'', emps: [ {}]} },] }
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(dept));
}
}
class Emp{
private String name;
@JsonIgnore
private Dept dept;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
class Dept{
private String name;
private List<Emp> emps;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Emp> getEmps() {
return emps;
}
public void setEmps(List<Emp> emps) {
this.emps = emps;
}
}
2.3线程运行诊断
3.本地方法栈
4.堆
5.方法区
每天更新!!!