- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机.
虚拟机是指通过软件模拟的具有完整硬件功能的,运行在一个完全隔离的环境中的完整计算机系统.
堆 : 放的是 new 的对象
方法区 : 放的是 类对象
栈 : 放的是局部变量
程序计数器 : 放了一个内存地址
注意事项:
示例 :
class Student{
public int Id;
}
public class Test {
Student student2 = new Student();
static Student student3 = new Student();
public static void main(String[] args) {
Student student1 = new Student();
}
}
student1 是在栈里
student2 是在堆里
student3 是在方法区里
这是类加载的过程.
Java虚拟机需要完成以下三件事情:
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
验证刚刚的Class文件是不是一个合法的文件.
验证选项:
为了类对象中的一些成员分配内存空间(静态变量),并且进行一个初步的初始化(把初始的空间设为全0).public static int value = 333
它初始化 value 的值为0,并非333
Class文件中就会涉及一些字符串常量.
解析就是把这个类加载过程中,需要把这些字符串常量给替换成当前JVM内部已经持有的字符串常量的地址.
这个阶段就是真正开始堆静态变量进行初始化.同时也会执行static代码块
在 JVM 中, 有三个类加载器(三个特殊的对象) 来负责进行这里的找文件的操作.
这里如果一个类收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这个请求给委派给父亲加载器.BootStrap
是爷爷,ExtClassLoader
是父亲,AppClassLoader
是儿子.
当收到一个类加载请求,首先从 AppClassLoader
开始查找,在查找之前会把这个请求委派给父亲ExtClassLoader
,在 ExtClassLoader
开始查找之前,会把这个请求委派给父亲 BootStrap
.BootStrap
没有父亲,就自己查找.
如果BootStrap
找到了,就直接加载.如果没有找到,就回到孩子继续查找.
如果ExtClassLoader
找到了,就直接加载.如果没有找到,就回到孩子继续查找
如果AppClassLoader
找到了,就直接加载.如果没有找到,就抛出 ClassNotFoundException.
垃圾回收(GarbageCollection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
由于栈和程序计数器的内存都是和具体的线程绑定在一起,代码块结束/线程结束,内存就自动释放了.
方法区和堆是垃圾回收机制要释放的内容.方法区进行垃圾回收比较特殊不考虑.
这里讨论的垃圾回收主要指的是堆上内存的回收.
堆上的内存分为三类:
Java 中的垃圾回收, 是以"对象"为基本单位的.一个对象不会存在被回收一半的情况.
垃圾回收就是 先找到垃圾,然后再回收垃圾
垃圾: 就是再也不会被使用到的对象
就相当于在对象里面增加一个引用计数器,
每当有一个地方引用它的时候,计数器就+1.
每当这个引用失效时,计数器就-1
优点 :
规则简单,实现方便,比较高效
缺点 :
从一组初始的位置出发, 向下进行深度遍历, 把所有能够访问到的对象都标记为 “可达”.对应的, 不可达的对象就是垃圾.
JVM 中采取的方案. JVM 存在一个/一组线程,周期性的进行遍历,不断的找出这些不可达的对象,由 JVM 回收.
把可达性分析, 初始位置为 “GC Root”
可作为GC Roots的对象包含下面几种:
Java的引用也可以被判定对象的生死了
四种引用:
该算法分为 “标记” 和 “清除” 两个阶段:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象.
缺点 :
将内存按容量划分为大小相等的两块, 每次只使用一块.当这块内存需要进行垃圾回收时,会将此区域还存活的对象复制到另一块上.
缺点 :
跟标记-清除一样,只不过后续让存活的对象都向一段搬运
缺点 :
在这个搬运过程中,也是一个很大的开销,这个开销比复制算法里面复制对象的开销甚至更大
在 JVM 中, 进行垃圾回收扫描也是周期性的,这个对象每次经历了一个扫描周期, 就认为"长了一岁"
根据这个对象的年龄来堆整个内存进行分类.年龄短的对象放在一起,年龄长的对象放在一起.不同的年龄的对象,就可以采取不同的垃圾回收算法来进行处理了.
分代回收的过程:
特殊情况,如果这个对象特别大,就会直接进入老年代.
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!