河南省城市建设网站网络营销外包有限公司
web/
2025/9/28 9:35:09/
文章来源:
河南省城市建设网站,网络营销外包有限公司,四川省建设厅官方网站首页,关于我们页面模板目录
1.Java程序运行时内存说明
2.JVM内存划分
3.Java中数据类型
4.Java中的String
5.结合HelloWorld分析java程序内存分布 1.Java程序运行时内存说明 编写的.java程序文件需要java编译器javac转成.class文件#xff0c;然后通过jvm#xff08;名为java的可执行程序然后通过jvm名为java的可执行程序来加载.class文件执行。每运行一个java程序就会产生一个javaJVM的实例。一个java进程对应一个JVM实例该进程可能包含一个或者多个线程每个JVM实例都有一个对应的堆每个线程有自己私有的栈。进程创建的所有类的对应本身何数组本身存放在堆上由进程所有的线程共享。Java中堆上为对象分配内存会初始化这个对象中的变量。堆上对象的引用是再栈中分配创建一个对象再堆和栈上都分配内存堆中分配的内存存放对象本身而在栈中分配的内存呢只是存放指向这个堆对象的引用而已。在函数栈帧中new出来一个局部变量时在栈空间和堆空间中分配空间当局部变量生命周期结束后栈空间立刻被回收堆空间区域等待GC回收。
2.JVM内存划分
JVM的内存可分为3个区堆(heap)、栈(stack)和方法区(method也叫静态区)
堆区: 1存储的全部是对象每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令) 2jvm只有一个堆区(heap)且被所有线程共享堆中不存放基本类型和对象引用只存放对象本身和数组本身
栈区: 1每个线程包含一个栈区栈中只保存基础数据类型本身和自定义对象的引用 2每个栈中的数据(原始类型和对象引用)都是私有的其他栈不能访问 3栈分为3个部分基本类型变量区、执行环境上下文、操作指令区(存放操作指令)
方法区静态区: 1被所有的线程共享方法区包含所有的classclass是指类的原始代码要创建一个类的对象首先要把该类的代码加载到方法区中并且初始化和static变量。 2方法区中包含的都是在整个程序中永远唯一的元素如classstatic变量。 堆(heap)和栈(stack)的区别 1栈(stack)与堆(heap)都是Java用来存放数据的地方。与C不同Java自动管理栈和堆程序员不能直接地设置栈或堆。 2栈的优势是存取速度比堆要快仅次于直接位于CPU中的寄存器。但缺点是存在栈中的数据大小与生存期必须是确定的缺乏灵活性。 堆的优势是可以动态地分配内存大小生存期也不必事先告诉编译器Java的垃圾收集器会自动收走这些不再使用的数据。 但缺点是由于要在运行时动态分配内存存取速度较慢。
3.Java中数据类型
1基本类型(primitive types), 共有8类即int, short, long, byte, float, double, boolean, char。 这种类型的定义是通过诸如int a 3; long b 255L;的形式来定义的称为自动变量。自动变量存的是字面值不是类的实例 即不是类的引用这里并没有类的存在。如int a 3; 这里的a是一个指向int类型的引用指向3这个字面值。 这些字面值的数据由于大小可知和生存期可知(这些字面值固定定义在某个程序块里面程序块退出后字段值就消失了)出于追求速度的原因就存在于栈中。 2包装类数据如Integer, String, Double等将相应的基本数据类型包装起来的类。 这些类数据全部存在于堆中Java用new()语句来显示地告诉编译器在运行时才根据需要动态创建因此比较灵活但缺点是要占用更多的时间。 3自定义数据类型 用new()语句创建对象存放在在堆区通过栈区的引用来使用。
4.Java中的String
1栈的共享特性 String str1 abc; String str2 abc; System.out.println(str1str2); //true 说明 1编译器先处理String str1 abc它会在栈中创建一个变量为str1的引用然后查找栈中是否有abc这个值如果没找到就将abc存放进来然后将str1指向abc。 2接着处理String str2 abc;在创建完b的引用变量后因为在栈中已经有abc这个值便将str2直接指向abc。这样就出现了str1与str2同时均指向abc的情况。 所以我们在使用诸如String str abc的格式定义类时总是想当然地认为创建了String类的对象str。其实对象可能并没有被创建在栈上创建而可能只是指向一个先前已经创建的对象。 2堆内存 通过new()方法才能保证每次都创建一个新的对象。其存放在堆上。由于String类的immutable性质当String变量需要经常变换其值时应该考虑使用StringBuffer类 以提高程序效率。
5.结合HelloWorld分析java程序内存分布
HelloWorld.java
//import java.lang.Integer;public class HelloWorld { //运行时jvm 把HelloWorld的代码全部都放入方法区 public static void main(String[] args) { //main方法放在方法区System.out.println(Hello World!);Student stu new Student(110, Andy, 18); //stu在栈上引用堆上new出来的对象new Student(110, Andy, 18)在堆上存储stu.printStudent();int[] iArr new int[10]; //iArr在栈上引用堆上new出来的对象new int[10]在堆上存储for (int i 0; i 10; i) {iArr[i] i;}System.out.println(iArr: iArr);int[] iArr1 {12, 34, 45, 60, 45, 82};System.out.println(iArr: iArr1);}
}class Student { //运行时jvm 把Student的代码全部都放入方法区
private int id;
private String name;
private Integer age; public Student(int id, String name, Integer age) { this.id id;this.name name;this.age age;
} public void printStudent() { //printStudent方法放在方法区System.out.println(id: id); System.out.println(name: name); System.out.println(age: age);
} }编译运行 备注错误 【错误: 编码GBK的不可映射字符】解决办法
报错原因windows下默认的字符集为GBK而当你的java文件当中的汉字不是字符集GBK时javac进行编译的时候就会报错。
解决方法
1javac指定文件编码方式例如
javac -encoding UTF-8 HelloWorld.java
2将文件编码设置成GBK编码
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83262.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!