一. Java虚拟机的基本结构以及各个部分的作用
每个区域各司其职
- 1. 类加载系统负责从文件系统或者网络中加载class信息
- 2. 方法区存放加载的class信息
- 3. java堆存放几乎所有的对象实例。所有线程共享.
- 4. 直接内存可以用java nio库来分配,直接内存访问速度优于堆内存,但是分配速度会慢,如果频繁读写,那么可以使用它.
- 5. Java栈是线程独用的,线程创建时会分配.里面保存着局部变量,方法参数。
- 6. 本地方法栈用于本地方法调用
- 7. PC寄存器是每个线程的私有空间.如果一个线程正在执行的方法不是本地方法,它会指向当前正在被执行的指令.否则,它的值就是undefined.
二.java 堆结构
根据垃圾回收机制的不同,Java堆有不同的结构.最为常见的是java分为新生代和老年代.新生代又分为eden区,s0,s1区,s0,s1也被称为from和to区域,他们大小相等.
一个对象的分配过程可以这样来描述
- 1. new一个对象的时候会把它分配在eden区,
- 2. 进行一次回收后,如果这个对象还存在,会进入s0或者s1
- 3. 之后没进行一次垃圾回收,它的年龄就会+1。
- 4. 当它达到一定年龄时,就会进入老年代
三.函数如何调用
java栈是先进后出的数据结构,主要保存的数据结构是栈帧。
举例:假设函数1调用函数2函数2调用函数3,那么当函数1被调用时,入栈,函数2被调用时,入栈。以此类推, 一直执行,当前执行的函数对应的帧保存着当前函数对应 的局部变量,中间运算陈果.
Java又两种返回函数方式,return和抛异常.
一个栈帧中至少要包含局部变量表,操作数栈和帧数据.-Xss用来指定最大栈空间,它决定了函数调用最大深度.
局部变量表中的参数个数也决定了函数最大调用深度.用不断递归调用自身的方法可以使得栈空间溢出.
局部变量表
里面包含了索引(index ),名字(name),数据类型(descriptor),里面的每一行代表一个槽位,如果一个局部变量过了作用域,那么再它之后申明的变量会复用这个槽位.
举例说明: 加上这个参数查看gc情况. -XX:+PrintGC
public void local1(){ //数组被a引用,不会回收 byte[] a =new byte [1024*1024]; System.gc();} public void local2(){ //byte失去引用,顺利回收 byte[] a =new byte [1024*1024]; a=null; System.gc(); } public void local3(){ //虽然离开作用域,a仍然存在局部表量表 { byte[] a =new byte [1024*1024]; } System.gc(); } public void local4(){ //a的槽位被c占用 { byte[] a =new byte [1024*1024]; } int c= 1; System.gc(); } public void local5(){ //方法执行结束,栈空间弹出,栈帧被销毁 local1(); System.gc(); } public static void main(String[] args) { LocalVarTableTest l = new LocalVarTableTest(); l.local1(); }
栈上分配
栈上分配是一项优化技术.对于那些不会被其他线程访问到的对象,直接打散分配在栈上.函数调用结束后自行销毁,不需要垃圾回收.
它的一个技术基础是进行逃逸分析,判断对象的作用域是否能逃逸出函数体,例如,静态成员变量,以及return 返回.
例子:jvm参数-server -Xms10m -Xmx10m -XX:+PrintGC -XX:+DoEscapeAnalysis -XX:-UseTLAB -XX:+EliminateAllocations
可以去掉-XX:+DoEscapeAnalysis -XX:-UseTLAB -XX:+EliminateAllocations
public class StackRunawayTest { private static class User{ public int id =0; public String name=""; } public static void alloc(){ User u = new User();//对象头暂居8个字节 u.id =1 ;//4个字节 u.name="ffff";//4个字节 //总共16个字节. } public static void main(String[] args) { for(int i = 0;i<3;i++){ //创建1亿个对象,约等于1.5g,如果堆空间小于这个值可定会抛出异常 alloc(); } } }
试一试两种情况执行的效率以及GC的情况,你就会发现使用逃逸分析的效率明显高于不使用逃逸分析.
方法区
方法区在jdk1.6,1.7可以理解为永久区(Perm).默认是64M.用参数
-XX:PermSize -XX:MaxPermSize设置.如果系统使用了动态代理,那么就会出现大量的类把空间撑爆。
在jdk1.8中,取而代之的是元数据区.用参数-XX:MaxMetaspaceSize指定.这个属于堆外直接内存,如果不指定大小,会耗尽所有内存.
相关推荐
- JVM(Java虚拟机)是Java程序执行的基础,它负责将源代码文件(`.java`文件)编译成字节码文件(`.class`文件),这些字节码文件可以在任何支持JVM的平台上运行,从而实现了Java的“一次编写,到处运行”的特性。...
JVM:java虚拟机,它是将java代码编译成机器语言,实现java的跨平台。 第一个JAVA程序HelloWorld 1.Java程序的最小单位是“类”,一个Java程序至少包含一个类。 2.Java程序的入口是main函数,main函数的写法是固定的
### 初识JAVA的知识:配置Java环境变量于Windows 7 #### 一、Java与环境变量的重要性 Java作为一门跨平台的编程语言,其运行环境的配置至关重要。无论是开发还是运行Java程序,都需要确保系统中正确设置了Java环境...
#### 第一章 初识Java - **Java跨平台原理**:Java的跨平台特性主要得益于字节码文件(`.class`文件)和Java虚拟机(JVM)。Java程序编译成字节码文件后,由不同平台上的JVM解释执行这些字节码文件,从而实现了“一...
5.2.1 第一板斧——初识影子对象 96 5.2.2 第二板斧——由弱生强 103 5.2.3 第三板斧——破解生死魔咒 106 5.2.4 轻量级的引用计数控制类LightRefBase 108 5.2.5 题外话——三板斧的来历 109 5.3 Thread类及...
对象自救是指在finalize()方法中让对象重新被引用,但这只会发生在第一次回收时,后续回收不会再次调用。 理解JVM的内存管理和垃圾收集机制对于优化Java应用的性能至关重要,尤其是在处理大量对象和复杂数据结构时...
3. ** HelloWorld程序**:初识Java,编写第一个"Hello, World!"程序,理解编译和运行过程。 4. **基本语法**:包括数据类型(整型、浮点型、字符型、布尔型)、变量、常量、运算符的使用。 5. **流程控制**:条件...
1.1 Java虚拟机及Java的跨平台原理 1.2 Java开发环境的搭建 1.3 体验Java编程的过程 1.4 classpath的设置 1.5 有效利用Java的文档帮助 1.6 JVM(虚拟机)的运行过程 1.7 垃圾回收器 1.8 反编译工具的介绍 第2章 Java...
2. 编译和解释:Java代码首先被编译成字节码,然后在不同的平台上通过JVM(Java虚拟机)进行解释执行。 3. 自动无用内存回收:Java提供了垃圾回收机制,自动管理内存,避免了内存泄漏的问题。 4. 面向对象:Java是...
- **第一步:编写源程序** 使用文本编辑器或集成开发环境(IDE)如Eclipse、IntelliJ IDEA等编写Java源代码文件,扩展名为`.java`。 - **第二步:编译** 通过Java编译器`javac`将源代码文件编译成字节码文件,扩展...
4. 从第一条指令开始执行:取指令、指令译码、取操作数,运算、送结果、PC 指向下一条指令。 5. 重复第 4 步骤直到程序执行完成。 本节总结了 Java 基础知识,包括二进制基础、Java 语言的历史和特点,以及计算机...
#### 第一章 初识Java ##### 1.1 Java简介 - **定义**: Java是一种高级的、面向对象的编程语言,它支持跨平台特性,即“一次编写,到处运行”(Write Once, Run Anywhere, WORA)。Java程序经过编译后会转换成字节...
Scala与Java的关系密切,因为Scala是基于Java虚拟机(JVM)运行的。这意味着Scala源代码会被编译成Java字节码,可以在JVM上执行,并能够无缝调用Java类库。对于熟悉Java的开发者来说,理解Scala与Java的异同点是快速...
小统计:代码目录第00章_初识Java 你好,世界初步认识程序格式关键字:如果不这样做,切换,换一会儿,一会儿,做一会儿,中断,继续,无效变量作用域:出了这个大括号就再也没有人认识这个变量了。基本数据类型:...
马士兵是一位知名的IT教育专家,他的课程涵盖了广泛的Java技术,包括“初识JAVA 20. 反编译工具的使用”这一部分。在这一章节中,他可能讲解了如何利用jd-gui.exe来查看和理解Java程序的内部工作原理,这对于分析...
### 第一章 初识 Java 1. **Java跨平台原理**:Java程序通过编译成字节码(`.class`文件),可以在任何支持Java的平台上运行,这得益于Java虚拟机(JVM)。JVM为每个平台提供了不同的实现,使得字节码能在不同操作...
#### 第一节:JAVA-初识 - **常见的DOS命令**:文档中提到了几个常见的DOS命令,包括`dir`用于查看当前目录下的所有文件;`cd`用于进入指定的目录;`cd..`用于退出当前目录返回上一级;`cd\`用于直接退出到根目录;...
### 第一章 初识Java 1. **Java跨平台原理**:Java的跨平台特性基于“一次编写,到处运行”的理念。Java源代码被编译成字节码(`.class`文件),这些字节码由Java虚拟机(JVM)执行。不同的操作系统上有不同的JVM...