JVM
文章平均质量分 77
com.li
It works on my machine
展开
-
java中String的两种创建方法、字符串常量池
创建1或2个字符串。如果常量池中已存在字符串常量“abc”,则只会在堆空间创建一个字符串常量“abc”。如果常量池中没有字符串常量“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共2个字符串对象。**这句代码里创建了几个字符串对象?检查指定字符串在常量池中是否存在?如果存在,则返回地址,如果不存在,则在常量池中创建。原创 2024-01-12 19:59:05 · 492 阅读 · 0 评论 -
JVM 元空间、java中的元空间
上述运行结果可以看出,相同的代码,在JDK 1.6会出现“PermGen Space”的永久代内存溢出,而在JDK 1.7和JDK 1.8中,会出现"Java heap space"堆内存溢出,并且DK 1.8中 PermSize和MaxPermGen参数已经无效。因此,在JDK 1.7和JDK 1.8中,已经将字符串常量由永久代转移到堆中,并且JDK 1.8中已经完全移除了永久代,采用元空间来代替。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过运行参数来指定元空间的大小。原创 2024-01-12 00:12:50 · 2468 阅读 · 0 评论 -
JVM,Java堆区、新生代、老年代,创建对象的内存分配,分代垃圾收集思想、堆区产生的错误
Java世界中“几乎”所有的对象都在堆中分配,但是,随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。 大部分情况下,对象会在Eden区生成,当Eden区装填满的时候,会触发Young Garbage Collection,即YGC垃圾回收的时候,在Eden区实现清楚策略,没有被引用的对象则直接收回。堆空间的内存大小是可以修改的,默认情况下,初始堆内存为物理内存的1/64,最大为物理内存的1/4。原创 2024-01-08 22:51:17 · 1309 阅读 · 0 评论 -
Java对象的创建过程、类加载的检查、内存分配、初始化零值、设置对象头、执行init构造方法
初始化零值完成后,虚拟机要对新对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。选择以上两种方式中的哪一种,取决于Java堆内存是否规整。在上面工作都完成后,从虚拟机的视角来看,一个新的对象已经产生了,但从Java程序的视角来看,对象创建才开始,原创 2024-01-05 21:45:00 · 523 阅读 · 0 评论 -
类加载机制之双亲委派模型、作用、源码、SPI打破双亲委派模型
由于双亲委派模型的存在,所以在rt.jar中的Object比在ClassPath 中的 Object 优先级更高,因为rt.jar中的object使用的是启动类加载器,而ClassPath中的 object使用的是应用程序类加载器。该模型要求除了顶层的启动类加载器外,其他的类加载器都要有自己的父类加载器。以下是抽象类 java.lang.ClassLoader的代码片段,其中的loadClass()方法运行过程如下:先检查类是否已经加载过,如果没有则让父类加载器去加载。原创 2024-01-04 22:09:46 · 538 阅读 · 0 评论 -
类的加载机制、主动引用、被动引用、什么是类加载器、类加载器的分类、自定义类的加载器
在类加载过程的加载阶段,通过类的完全限定名,获取描述类的二进制流的实现类,被称为“类的加载”。隔离加载类。在某些框架内进行中间件与应用的模块之间进行隔离,吧类加载到不同的环境。修改类加载方式。扩展加载源。比如:从数据库、网络、电视机顶盒进行类加载。防止源码泄露。比如:编译时字节码进行加密,需要通过自定义类加载器对字节码进行解密还原。原创 2024-01-03 21:45:00 · 937 阅读 · 0 评论