如何建立网站平台的步骤,开发网站监控工具,环保局网站建设,河南省新闻发布会最新全文目录#xff1a; 开篇语第一部分#xff1a;Java内存模型#xff08;JMM#xff09;简介1.1 共享变量的可见性#xff1a;volatile关键字 第二部分#xff1a;垃圾回收的基本原理2.1 简单的垃圾回收示例 第三部分#xff1a;GC的种类与调优3.1 配置GC日志 第四部分 开篇语第一部分Java内存模型JMM简介1.1 共享变量的可见性volatile关键字 第二部分垃圾回收的基本原理2.1 简单的垃圾回收示例 第三部分GC的种类与调优3.1 配置GC日志 第四部分内存泄漏的排查与解决方法4.1 内存泄漏示例与解决4.2 解决内存泄漏 总结文末 开篇语 哈喽各位小伙伴们你们好呀我是喵手。运营社区C站/掘金/腾讯云/阿里云/华为云/51CTO欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点并以文字的形式跟大家一起交流互相学习一个人虽可以走的更快但一群人可以走的更远。 我是一名后端开发爱好者工作日常接触到最多的就是Java语言啦所以我都尽量抽业余时间把自己所学到所会的通过文章的形式进行输出希望以这种方式帮助到更多的初学者或者想入门的小伙伴们同时也能对自己的技术进行沉淀加以复盘查缺补漏。 小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持 第一部分Java内存模型JMM简介
1.1 共享变量的可见性volatile关键字
volatile关键字用于保证变量的可见性即一个线程修改的变量对其他线程立即可见。
示例代码
public class VolatileExample {private static volatile boolean flag false;public static void main(String[] args) {// 启动两个线程Thread thread1 new Thread(() - {try {Thread.sleep(1000);flag true; // 设置flag为trueSystem.out.println(Flag is set to true.);} catch (InterruptedException e) {e.printStackTrace();}});Thread thread2 new Thread(() - {while (!flag) {// 一直等待直到flag变为true}System.out.println(Flag is now true!);});thread1.start();thread2.start();}
}解释
volatile确保thread2能够及时看到flag的修改避免了线程1对flag的修改对线程2不可见的问题。 第二部分垃圾回收的基本原理
2.1 简单的垃圾回收示例
在Java中垃圾回收是由JVM自动管理的无需开发者显式释放内存。以下是一个简单的示例演示了对象的创建与垃圾回收。
示例代码
public class GarbageCollectionExample {public static void main(String[] args) {// 创建对象Employee emp new Employee(Alice);emp null; // 将emp引用设置为null标记对象为可回收// 建立一个垃圾回收请求System.gc(); // 强制垃圾回收只是建议JVM会决定是否执行System.out.println(Garbage Collection request made.);}static class Employee {String name;Employee(String name) {this.name name;}Overrideprotected void finalize() throws Throwable {System.out.println(name object is being collected by GC);}}
}解释
当emp对象被设置为null后它变得不可访问成为垃圾回收的候选对象。System.gc()请求垃圾回收但实际的垃圾回收由JVM决定何时进行。finalize()方法会在对象被垃圾回收之前执行这里我们用它来输出提示信息。 第三部分GC的种类与调优
3.1 配置GC日志
为了优化GC的性能首先需要分析GC的行为。我们可以启用GC日志来查看垃圾回收的详细信息。
示例命令
java -Xloggc:gc.log -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:UseG1GC MyApplication解释
-Xloggc:gc.log将GC日志输出到gc.log文件。-XX:PrintGCDetails打印详细的GC信息。-XX:PrintGCDateStamps打印GC时间戳。-XX:UseG1GC使用G1垃圾回收器。 第四部分内存泄漏的排查与解决方法
4.1 内存泄漏示例与解决
内存泄漏是指不再使用的对象无法被垃圾回收器回收从而导致内存占用持续增加。下面是一个内存泄漏的示例它通过静态引用导致对象无法回收。
示例代码
import java.util.ArrayList;
import java.util.List;public class MemoryLeakExample {private static ListObject list new ArrayList();public static void main(String[] args) {// 模拟内存泄漏while (true) {list.add(new Object()); // 不断添加新对象到静态集合中}}
}解释
由于list是一个静态变量每次循环都会向list中添加一个新对象。即使这些对象不再使用它们依然会被list引用导致内存泄漏。
4.2 解决内存泄漏
我们可以通过显式地释放资源如关闭连接、清空缓存来防止内存泄漏。
改进后的代码
import java.util.ArrayList;
import java.util.List;public class FixedMemoryLeakExample {private static ListObject list new ArrayList();public static void main(String[] args) {try {// 模拟内存泄漏问题清理资源for (int i 0; i 1000; i) {list.add(new Object()); // 添加对象if (i % 100 0) {list.clear(); // 清理不再使用的对象System.gc(); // 强制垃圾回收}}} catch (OutOfMemoryError e) {System.out.println(Out of Memory!);}}
}解释
使用list.clear()及时清除不再需要的对象避免内存泄漏。强制垃圾回收通过System.gc()调用有助于回收未引用的对象。 总结
通过本文我们深入探讨了Java内存模型JMM和垃圾回收的基本原理了解了如何通过volatile确保共享变量的可见性如何利用垃圾回收机制自动管理内存。我们还讨论了如何调优GC启用GC日志以及如何排查和解决内存泄漏问题。
了解并掌握这些内存管理技巧能够帮助我们编写出更加高效、稳定的Java应用避免因内存问题导致的性能下降和程序崩溃。在日常开发中保持对内存管理的关注并进行适当的调优和优化是提高代码质量和性能的关键。
… …
文末
好啦以上就是我这期的全部内容如果有任何疑问欢迎下方留言哦咱们下期见。
… …
学习不分先后知识不分多少事无巨细当以虚心求教三人行必有我师焉
wished for you successed ⭐️若喜欢我就请关注我叭。
⭐️若对您有用就请点赞叭。 ⭐️若有疑问就请评论留言告诉我叭。 版权声明本文由作者原创转载请注明出处谢谢支持