![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 90
Art&Code
艺术与代码相辅相成。
展开
-
热部署和类加载器
热部署和类加载器 热部署 对于Java应用程序来说,热部署就是在运行时更新Java类文件。 热部署的原理是什么 想要知道热部署的原理,必须要了解java类的加载过程。一个java类文件到虚拟机里的对象,要经过如下过程。 首先通过java编译器,将java文件编译成class字节码,类加载器读取class字节码,再将类转化为实例,对实例newInstance就可以生成对象...原创 2018-10-30 19:28:00 · 265 阅读 · 0 评论 -
Java内存模型
Java内存模型 多线程有三大特性 原子性、可见性、有序性 什么是原子性 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。 我们操作数据也是如此,比...原创 2018-10-22 15:18:00 · 130 阅读 · 0 评论 -
finalize方法
finalize方法 什么是垃圾回收机制 不定时去堆内存中清理不可达对象。不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。程序员唯一能做的就是通过调用System.gc 方法来"建议"执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。...原创 2018-10-29 19:05:00 · 250 阅读 · 0 评论 -
新生代与老年代
新生代与老年代 新生代与老年代 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包...原创 2018-10-29 19:16:00 · 162 阅读 · 0 评论 -
引用计数法和根搜索算法
引用计数法和根搜索算法 如何判断对象是否存活 引用计数法 概念 引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种方法的缺点就是不能检测到环的存在。 首先需要声明,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存。 什么是引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1.任何时刻计数器值为0的对象就是...原创 2018-10-29 19:31:00 · 575 阅读 · 0 评论 -
垃圾收集算法
垃圾收集算法 标记清除算法 概念 该算法有两个阶段。 1. 标记阶段:找到所有可访问的对象,做个标记 2. 清除阶段:遍历堆,把未被标记的对象回收 应用场景 该算法一般应用于老年代,因为老年代的对象生命周期比较长。 优缺点 标记清除算法的优点和缺点 1. 优点 - 是可以解决循环引用的问题 - 必要时才回收(内存不足时) 2. 缺点: - 回收时,应用需要挂起,也就是s...原创 2018-10-29 21:58:00 · 82 阅读 · 0 评论 -
JVM参数调优
JVM参数调优 JVM参数配置 JVM提供了诸多的参数进行JVM各个方面内存大小的设置,为Java应用进行优化提供了诸多的工具,本文将会详细分析各个参数的功能与使用。 常见参数配置 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 -Xms...原创 2018-10-29 23:45:00 · 200 阅读 · 0 评论 -
内存溢出问题解决
内存溢出问题解决 Java堆溢出 错误原因: java.lang.OutOfMemoryError: Java heap space 堆内存溢出 解决办法:设置堆内存大小 // -Xms1m -Xmx10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError 下面这段代码,至少配10M内存 package jvmTest; i...原创 2018-10-30 00:09:00 · 222 阅读 · 0 评论 -
栈溢出解决
栈溢出解决 递归调用,栈深度。 错误原因: java.lang.StackOverflowError 栈内存溢出 栈溢出产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用,也会发生栈溢出。 解决办法:设置线程最大调用深度 -Xss5m 设置最大调用深度 小伙伴,玩个好玩的,最大默认深度: package jvmTest; //打印堆的基本内存信息 publi...原创 2018-10-30 00:18:00 · 1066 阅读 · 0 评论 -
内存溢出与内存泄漏区别
内存溢出与内存泄漏区别 Java内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽); 而Java内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 内存溢出,这个好理解,说明存储空间不够大。就像倒水倒多了,从杯子上面溢出了来了一样。 内存泄漏,原理是,使用过的内存空间没有被及时释放,长时间占用内存,最终导致内存空间不足,而出现内存溢...原创 2018-10-30 00:34:00 · 300 阅读 · 0 评论 -
四种常用的垃圾收集器
四种常用的垃圾收集器 对于垃圾收集器做个小总结: 垃圾回收器从线程运行情况分类有三种 串行回收,Serial回收器,单线程回收,全程stw; 并行回收,名称以Parallel开头的回收器,多线程回收,全程stw; 并发回收,cms与G1,多线程分阶段回收,只有某阶段会stw; 注: 串行回收: JDK1.5前的默认算法 缺点是只有一个线程,执行垃圾回收时程序停止的时...原创 2018-10-30 00:51:00 · 1594 阅读 · 0 评论 -
Tomcat调优策略
Tomcat调优策略 Jmeter压力测试工具 JMeter是一款在国外非常流行和受欢迎的开源性能测试工具,像LoadRunner 一样,它也提供了一个利用本地Proxy Server(代理服务器)来录制生成测试脚本的功能,但是这个功能并不好用。所以在本文中介绍一个更为常用的方法——使用Badboy录制生成 JMeter 脚本。 简单的介绍一下Badboy。Badboy是一款不错的Web自动...原创 2018-10-30 01:04:00 · 101 阅读 · 0 评论 -
jconsole工具检测堆内存变化的使用
jconsole工具检测堆内存变化的使用 jconsole将Java写的程序检测。 从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。 如果是从命令行启动,使...原创 2018-10-30 11:51:00 · 442 阅读 · 0 评论 -
字节码技术
字节码技术 使用字节码技术对类的基本信息进行操作,对属性和方法进行修改。 字节码技术应用场景 AOP技术、Lombok去除重复代码插件、动态修改class文件等 字节技术优势 Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改。Java字节码增强主要是为了减少冗余代码,提高性能等。 实现字节码增强的主要步...原创 2018-10-30 13:36:00 · 755 阅读 · 0 评论 -
ClassLoader
ClassLoader 类加载器 类加载的机制的层次结构 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程...原创 2018-10-30 15:47:00 · 478 阅读 · 0 评论 -
多线程与Java的JMM内存模型
多线程与Java的JMM内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念...原创 2018-10-21 21:15:00 · 194 阅读 · 0 评论