第2章 Java内存区域与内存溢出异常

本章从概念上介绍Java虚拟机内存的各个区域,讲解这些区域的作用、服务对象以及其中可能产生的问题。

一、运行时数据区域

1、程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

继续阅读“第2章 Java内存区域与内存溢出异常”

Java零散知识点

1、Java是值传递的

①对于基本数据类型short、int、long、float、double、char、byte、boolean这八种按值传递调用函数并不会改变在原函数中的值。

② 对于引用数据类型数组、类、接口按值传递的时候都是传递对象的地址,方法体内改变形参的引用,不会改变实参的引用,但有可能改变实参对象的属性值。

public class Demo {
    public static void main(String[] args) {

        //demo1
        String str = "hello";
        char[] chs = {'w','o','r','l','d'};
        change(str, chs);
        System.out.println(str + " " + new String(chs));
        //输出“hello World”

        //demo2
        StringBuffer sb = new StringBuffer("hello");
        change(sb);
        System.out.println(sb);
        //输出“hello world”
    }

    public static void change(StringBuffer sb) {
        sb.append(" world");
        //此处的sb与main方法中的sb指向同一个对象,改变了对象的内容 
    }

    public static void change(String str, char[] chs) {
        str.replace('h', 'H');
        //因为String的不可变性,此处str指向对象的内容没有发生变化
        //str = str.replace('h', 'H');
        //此处str指向内容为“Hello”的对象,不改变main方法中str的指向

        chs[0] = 'W';
        //此处的chs与main方法中的chs指向同一个对象,改变了对象的内容
    }
}
继续阅读“Java零散知识点”