- 博客(46)
- 收藏
- 关注
原创 JVM对象创建全过程
每个线程预先分配一小块内存(默认占Eden区1%)字段对齐(通常按8字节对齐)按照字段类型和声明顺序存储。(仅数组对象有,4字节)
2025-04-18 23:42:30
757
原创 Java对象内存结构详解
JVM要求对象起始地址必须是8字节的整数倍,因此可能需要填充字节(0-7字节)对象头包含运行时元数据和控制信息,占12字节(压缩指针)或16字节(未压缩)指向方法区中的类元数据的指针(开启压缩指针时为4字节,否则8字节):避免包装类(Integer等)的内存开销。:对于不变对象可复用(如String池)如果是数组对象,额外存储数组长度。:手动排列字段可减少填充。下方公众号资料免费获取。
2025-04-12 16:33:54
755
原创 OutOfMemoryError 和 StackOverflowError 的区别详解
NIO的DirectByteBuffer分配失败。检查内存泄漏(MAT工具分析堆转储):创建过多对象且GC无法回收。:单个方法占用过多栈空间。
2025-04-07 23:04:10
487
原创 Java类加载机制深度解析
.class文件 → 加载(Loading) → 链接(Linking) → 初始化(Initialization) → 使用(Using) → 卸载(Unloading)
2025-04-06 16:39:43
1257
原创 JVM 有哪些垃圾回收器
将可用内存按容量划分为两个区域,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面, 然后再把已使用过的内存空间一次清理掉。算法分为“标记” 和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记 的对象。标记阶段和标记清除算法一样,也是先标记出所需要回收的对象,然后让所有存活的对象移动到另一端,然后直接清理掉边界以外的内存。把Java堆分为新生代和老年代, 这样就可以根据各个年代的特点采用最适当的收集算法。
2025-04-04 21:59:14
1219
原创 什么是Stop The World
就像打扫房间时,如果家人同时乱扔垃圾,你永远打扫不干净。STW相当于让所有人暂停活动,等你打扫完再继续。是JVM在执行垃圾回收(GC)时的一种行为,
2025-04-04 18:28:40
388
原创 新生代如果只有一个Eden+一个Survivor可以吗?
JVM设计两个Survivor是为了高效实现复制算法,避免内存碎片并精确管理对象生命周期。单Survivor方案会导致性能下降和GC行为不稳定,在HotSpot JVM的垃圾回收(GC)设计中,新生代(Young Generation)通常采用。现代GC(如G1、ZGC)不再严格区分Eden/Survivor,而是采用。早期JVM或某些嵌入式场景可能采用单Survivor,但需配合。来尝试单Survivor,但会触发警告或性能问题。调整Eden/Survivor比例,甚至设置。,但底层仍遵循类似逻辑。
2025-04-02 13:30:00
475
原创 Java堆内存分代机制详解:为什么JVM要分代管理内存?
在JVM中,堆(Heap)是Java对象存储的主要区域,而现代JVM(如HotSpot)普遍采用**分代收集(Generational Collection)**策略,将堆划分为不同的区域,以适应不同对象的生命周期特点。177页jvm全面解析。
2025-04-02 09:00:00
917
原创 Java中的对象一定在堆上分配内存吗
对象未逃逸出方法,且生命周期与方法调用一致。:直接使用局部变量代替对象,避免分配完整对象。中分配,方法结束后自动销毁,无需GC介入。:对象未逃逸,且可拆解为基本类型(如。除了堆和栈,Java对象还可能分配在。开始,JVM引入了一项关键技术——:对象未逃逸,且同步代码块无竞争。:减少堆内存占用,降低GC压力。:需谨慎使用,容易导致内存泄漏。:移除不必要的同步锁(如。
2025-04-01 13:45:00
1022
原创 JVM的运行时内存区域是怎样的
Java虚拟机(JVM)在运行Java程序时,会将内存划分为不同的区域,每个区域负责不同的任务。了解这些内存区域对于优化程序性能、排查内存泄漏(如OOM错误)至关重要。
2025-04-01 08:00:00
937
原创 什么是编译和反编译
反编译**这两个术语。它们分别代表代码从高级语言到机器码的转换,以及从机器码或字节码逆向还原成可读代码的过程。理解这两个概念,有助于我们更好地掌握程序的运行机制,并在逆向分析、安全审计、调试优化等方面发挥作用。掌握这两者,能让我们更深入地理解程序的运行机制,并在开发、调试、安全等领域发挥作用。这说明Java字节码的反编译效果非常好。机器可执行的代码(如二进制文件、字节码)**的过程。编译是指将**高级编程语言(如Java、C++)在软件开发过程中,我们经常听到**“编译”让计算机理解我们的代码,
2025-03-31 23:20:57
1086
原创 深入浅出:JIT优化技术如何让Java运行更快
JIT通过动态编译和多种优化技术(如内联、逃逸分析、循环展开等),让Java在保留跨平台优势的同时,逼近原生语言的性能。JIT(Just-In-Time Compilation,即时编译)是Java虚拟机(JVM)的核心优化技术之一。Java程序默认是解释执行的,即JVM逐条读取字节码并解释成机器指令运行。,并将其编译成优化后的机器码,后续执行时直接运行机器码,避免解释开销。:将短小的方法调用直接替换为方法体,减少方法栈帧的创建和销毁开销。:减少循环控制语句的开销,将循环体复制多次。
2025-03-31 10:00:00
1013
原创 Java是编译型还是解释型
这个问题看似简单,但实际上涉及Java的底层执行机制。本文将从Java代码的编写到最终执行的完整流程出发,带你深入理解Java的独特运行方式。这种混合模式让Java兼具跨平台性和高性能,这也是它长期占据企业级开发主流地位的原因之一。在编程语言的学习过程中,我们经常会听到“编译型语言”和“解释型语言”这两个概念。,而是JVM能理解的中间代码,类似于汇编语言,但比机器码更抽象。除了传统的JIT编译,Java还支持。在讨论Java之前,我们先明确。Java的设计目标是“时,Java编译器(,其内容类似(可通过。
2025-03-30 16:51:06
753
原创 Java如何实现平台无关性
Write Once, Run Anywhere”(一次编写,到处运行)是Java最著名的口号之一,也是它能够风靡全球的重要原因。但Java究竟是如何实现这种跨平台能力的呢?本文将深入剖析Java平台无关性的实现原理,帮助开发者更好地理解Java虚拟机(JVM)的工作机制。
2025-03-30 16:36:39
1032
原创 MySQL数据库备份与恢复
MySQL数据库备份与恢复是数据安全的重要保障。根据业务需求选择合适的备份策略和工具,并定期验证备份的有效性,才能确保在数据丢失时能够快速恢复。记住,没有备份策略的系统就像走钢丝没有安全网,风险极高。
2025-03-26 23:32:49
406
原创 javascript学习
JavaScript快速入门什么是JavaScript? JS网页脚本语言。用来处理一些动态的DOM(document = html 标签)、用于用户交互、网页中的业务。DOM 和事件JS 有2套标准:W3C 和 IE浏览器厂商: IE ,火狐、谷歌、苹果、opera(欧鹏)IE 版本11以后开始 100% 兼容JavaScript ,因为对JS的不兼容导致对CSS3和Html5的不兼容,因为Html5和CSS3中内置了很多JShttps://www.w3school.com.cn/js/p
2021-01-04 09:58:20
492
原创 CSS学习
CSScss入门<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>css入门</title> <style type="text/css"> /*id选择器的引用*/ #text{ color: blue; } /*cl
2021-01-04 09:51:36
285
原创 html学习
Html5世界知名浏览器厂商对HTML5都支持html5+css3W3C标准W3CWorld Wide Web Consortium (万维网联盟)成立于1994年, Web技术领域最权威和具影响力的国际中立性技术标准机构http://www.w3.org/http://www.chinaw3c.org/W3C标准包括结构化标准语言(HTML、XML))表现标准语言(CSS)行为标准(DOM、ECMAScript )html5html->xhtml->html5BS
2021-01-04 09:43:41
249
原创 注解和反射学习笔记
注解和反射本文章参考https://www.bilibili.com/video/BV1p4411P7V3进行学习和记笔记注解什么是注解Annotation是从JDK5.0开始引|入的新技术.Annotation的作用:不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别)可以被其他程序(比如:编译器等)读取.Annotation的格式:注解是以"@注释名"在代码中存在的, 还可以添加一些参数值,例如:@SuppressWarnings(value=“un
2020-12-09 10:47:06
208
原创 多线程学习笔记
多线程编程线程就是独立的执行路径;在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;main() 称之为主线程,为系统的入口,用于执行整个程序;在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能认为的干预的。对同一份资源操作时, 会存在资源抢夺的问题, 需要加入并发控制;线程会带来额外的开销,如cpu调度时间,并发控制开销。每个线程在自己的工作内存交互,内存控制不当会造成数据不一致如果有错,各位可以指出
2020-12-02 16:51:52
238
原创 Lambda表达式简单使用
Lambda表达式为什么要使用lambda表达式避免匿名内部类定义过多可以让你的代码看起来很简洁去掉了一堆没有意义的代码,只留下核心的逻辑。也许你会说,我看了Lambda表达式,不但不觉得简洁,反而觉得更乱,看不懂了。那是因为我们还没有习惯,用的多了,看习惯了,就好了。理解Function Interface(函数式接口)是学习java8 lambda表达式的关键所在函数式接口的定义: 1.任何接口,如果包含唯一的抽象方法,那么它就是一个函数式接口public interface
2020-11-26 16:58:47
213
原创 IO流学习笔记
IO流参考:http://c.biancheng.net/java/130/;流的概念在 java 中所有数据都是使用流读写的。流是一组有序的数据序列,将数据从一个地方带到另一个地方输入:是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出:是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。流的分类数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。按方向输入流:将<存储设备>中的内容读到<内存>中输出流:将<
2020-11-19 16:56:09
234
2
原创 java集合、泛型、枚举
java集合、泛型、枚举参考资料:http://c.biancheng.net/java/110/参考视频:https://www.bilibili.com/video/BV1zD4y1Q7Fw?p=19
2020-11-13 16:48:00
140
原创 String字符串处理和常用API
字符串常用APIpublic class Hello{ // String 的常用API : 每一个都要自己动手写一下 public static void main(String[] _args){ String word = "hello world web"; // charAt(int index) //获取字符串单个字符 System.out.println(word.charAt(0)); int len = word.length(); System
2020-11-13 14:10:59
151
翻译 this和super详解
this和superthis关键字表示当前对象提示:当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用 this 关键字来访问类中的属性,以区分类的属性和方法中的参数。this.属性名new 出的是哪个对象,表示的就是哪个对象package com.qh.person;public class Person { String name = "父类"; public void show(){ System.out.println(
2020-11-13 10:37:35
192
转载 数组的Arrays工具类
数组的Arrays工具类数组的简介参考http://c.biancheng.net/java/70/Arrays 类是一个工具类,其中包含了数组操作的很多方法。这个 Arrays 类里均为 static 修饰的方法(static 修饰的方法可以直接通过类名调用),可以直接通过 Arrays.xxx(xxx) 的形式调用方法。package com.qh.array;import java.util.Arrays;public class ArraysTest { public st
2020-11-11 15:32:10
249
原创 递归
递归A方法调用B方法,我们很容易理解!递归就是: A方法调用A方法!就是自己调用自己利用递归可以用简单的程序来解决一些复 杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。递归结构包括两个部分:递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。递归体:什么时候需要调用自身方法。package
2020-11-10 16:24:02
173
1
原创 for循环练习
for循环练习package com.qh.exercisefor;public class forDemo01 { //0~100奇数和偶数的分别的和 public static void main(String[] args) { int ouresult = 0; int jiresult = 0; for (int i = 0; i <= 100; i++) { if(i%2 == 0){//偶数
2020-11-09 17:12:39
145
原创 java控制流程语句
java流程控制语句参考: http://c.biancheng.net/java/30/包括:if else 语句switch case 语句while 循环for循环for循环嵌套foreach语句return、break、continue 详解
2020-11-09 17:08:02
116
原创 Scanner用法
Scanner用法next和nextLinenext():一定要读取到有效字符后才可以结束输入。对输入有效字符之前遇到的空白, next() 方法会自动将其去掉。只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。next() 不能得到带有空格的字符串。nextLine():以Enter为结束符也就是说nextLine()方法返回的是输入回车之前的所有字符。可以获得空白。package com.qh.scanner;import java.util.Scanner;
2020-11-09 16:05:33
192
转载 javaDoc生成文档
javaDoc生成文档javadoc基本介绍javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。也就是说,只要在编写程序时以一套特定的标签作注释,在程序编写完成后,通过Javadoc就可以同时形成程序的开发文档了。javadoc命令是用来生成自己API文档的,使用方式:使用命令行在目标文件所在目录输入javadoc +文件名.java。javadoc常用标识@author 作者@version 版本号@param 参数名 描述
2020-11-09 12:59:13
370
原创 java自增自减运算符
java自增自减package com.data;public class Operator { public static void main(String[] args) { // 自增 ,自减 ++ -- ;一元运算符 int a =3; int b =a++; //执行完这行代码后,先给b赋值,再自增 //a = a+1 赋值后执行 /* int a = a++ 相当于 int b
2020-11-06 15:14:21
190
### 文章总结:TX-1C 51单片机开发板使用手册. 概述
2025-04-12
【Java面向对象编程】封装、继承、多态详解:三大特性实现原理与应用场景分析
2025-04-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人