JVM--一文精通

2023-10-26

调整JVM堆内存

在确定JVM堆内存大小时,需要考虑以下因素:

  1. 应用程序的内存需求。
  2. 操作系统和其他应用程序所需的内存。
  3. JVM的运行参数和GC算法。

根据通常的经验,可以将JVM最大堆内存设置为操作系统可用内存的约70%。也就是说,在16GB的机器上,建议将JVM堆内存设置为11GB左右。这样做可以确保一定的空闲内存供操作系统和其他应用程序使用,并且给JVM留出足够的空间来处理应用程序的内存需求。

当然,实际的情况可能因应用程序的特殊性质而异。如果应用程序需要更多的内存,那么可以相应地增加JVM堆内存大小。但是,要注意不要设置过大,否则可能会导致频繁的Full GC和长时间的停顿。

jvm的运行参数有哪些,如何调整

JVM的运行参数根据作用可以分为以下几类:

  1. 堆内存相关参数:包括-Xmx、-Xms、-XX:NewRatio、-XX:SurvivorRatio等,用于设置JVM堆内存大小以及新生代和老年代之间的比例等。

  2. GC相关参数:包括-XX:+UseG1GC、-XX:+UseConcMarkSweepGC、-XX:+UseParallelGC等,用于选择垃圾回收算法以及调整垃圾回收的行为。

  3. 线程相关参数:包括-XX:ParallelThreads、-XX:ConcGCThreads等,用于设置并发线程数以及并发GC的线程数。

  4. 类加载相关参数:包括-XX:PermSize、-XX:MaxPermSize、-XX:MetaspaceSize、-XX:MaxMetaspaceSize等,用于设置永久代或元空间的大小。

可以使用命令行方式或者配置文件方式来设置JVM运行参数。常用的命令行参数有:

  1. -Xmx:设置JVM最大堆内存大小。
  2. -Xms:设置JVM初始堆内存大小。
  3. -XX:PermSize:设置永久代大小。
  4. -XX:MaxPermSize:设置最大永久代大小。
  5. -XX:+UseG1GC:启用G1垃圾回收器。
  6. -XX:+PrintGCDetails:输出详细的GC信息。
  7. -XX:ThreadStackSize:设置线程栈大小。

 命令行:

java -Xmx4g -Xms2g -jar myapp.jar
对于较为复杂的应用程序,可以将JVM运行参数写入配置文件中,例如在Tomcat服务器中,可以在catalina.sh或catalina.bat脚本中添加以下内容:

JAVA_OPTS="-server -Xms2g -Xmx4g -XX:PermSize=256m -XX:MaxPermSize=512m"
export JAVA_OPTS


什么时候需要设置线程栈的大小

Java虚拟机中的每个线程都有一个私有的线程栈,用于存储本地方法栈、操作数栈、局部变量表等信息。默认情况下,每个线程栈的大小为1MB,可以通过设置命令行参数或者JVM选项来调整。

通常需要调整线程栈的大小是在以下场景:

  1. 栈溢出:如果线程使用的栈空间不足,就会抛出StackOverflowError异常。这通常发生在递归调用或者方法调用深度较大的情况下。可以通过增加线程栈的大小来避免栈溢出的问题。

  2. 内存占用:线程栈的大小也会影响应用程序的内存占用。如果创建了大量的线程,那么默认的线程栈大小可能会导致过多的内存占用。可以通过减小线程栈的大小来降低内存占用。

  3. 系统资源:线程栈的大小还会影响系统资源的使用。如果创建了过多的线程,并且每个线程都使用较大的栈空间,这可能会导致系统资源的浪费和效率下降。可以通过调整线程栈的大小来优化系统资源的使用。

需要注意的是,调整线程栈的大小可能会影响应用程序的性能和稳定性。如果线程栈的大小设置过小,可能会导致栈溢出和应用程序崩溃;如果线程栈的大小设置过大,可能会消耗过多的内存和系统资源。因此,在调整线程栈大小时需要综合考虑应用程序的需求和系统资源的情况,并进行测试和优化。

G1垃圾回收器限制

  1. 物理内存限制:G1垃圾回收器需要足够的物理内存才能发挥最佳性能。如果可用内存不足,则可能导致频繁的Full GC和长时间的停顿。

例如,在一个运行大型应用程序的服务器上,如果分配给Java进程的内存较小,那么G1垃圾回收器可能无法高效地工作,因为它需要足够的物理内存来执行标记、整理和压缩等操作。

  1. 启动时间延迟:G1垃圾回收器需要在启动时建立全局的Heap区域,这会导致较长的启动时间延迟。

例如,在一个需要快速启动的应用程序中,G1垃圾回收器可能不是最佳选择,因为它需要较长的启动时间来建立全局的Heap区域。

  1. 堆大小限制:G1垃圾回收器对堆内存的大小有一定的限制。通常建议将堆内存设置在4GB到32GB之间。如果堆内存过小,则可能导致频繁的Full GC;如果堆内存过大,则可能导致G1垃圾回收器无法高效地工作。

例如,在一个需要处理大规模数据集的应用程序中,如果堆内存设置过小,那么G1垃圾回收器可能无法有效地回收垃圾,导致频繁的Full GC和较长的暂停时间。

  1. 执行时间限制:G1垃圾回收器采用分代垃圾回收算法,因此在执行时会受到年轻代和老年代的大小限制。如果年轻代和老年代的大小比例不合适,则可能导致G1垃圾回收器效率下降。

例如,在一个需要处理大量短期请求的Web服务器上,如果设置了较小的年轻代空间,那么可能会导致G1垃圾回收器无法有效地回收短期对象,从而影响应用程序的性能。

  1. CPU资源限制:G1垃圾回收器需要占用一定的CPU资源来执行标记、整理和压缩等操作。如果CPU资源不足,则可能导致G1垃圾回收器无法高效地工作。

例如,在一个CPU资源有限的环境中,如果多个Java进程同时运行,并且使用了G1垃圾回收器,那么可能会导致CPU资源竞争和效率下降。

需要根据具体的应用情况来选择合适的垃圾回收算法以及调整相关的运行参数,以达到最佳的性能和可靠性。

为什么内存过小,会导致G1频繁的Full GC

在使用G1垃圾收集器时,内存过小可能会导致频繁的Full GC。G1垃圾收集器的主要任务是将堆空间划分为多个小块(region),并在每个小块中进行垃圾回收。Full GC是指在整个堆空间中进行垃圾回收的过程,而不仅仅是在某些小块中进行。

当内存过小时,G1垃圾收集器可能无法为对象保留足够的空间,因此需要更频繁地进行Full GC以便回收更多的空间。这会导致应用程序暂停,并且会降低应用程序的性能。

因此,在使用G1垃圾收集器时,请确保为其分配足够的内存,以避免频繁的Full GC。

g1和cms有什么区别

G1和CMS都是JVM中的垃圾回收器,用于回收不再使用的Java对象。它们之间的主要区别如下:

  1. 算法原理:G1采用的是基于区域的垃圾回收算法,而CMS则采用基于标记-清除的算法。

  2. 分代方式:G1将堆内存划分成多个大小相等的区域(Region),并根据每个区域的垃圾数量来决定回收顺序。CMS仅对老年代进行垃圾回收。

  3. 可预测性:G1垃圾回收器可以设置最大停顿时间,因此可以更好地控制垃圾回收期间的暂停时间。而CMS无法保证停顿时间。

  4. 内存占用:G1垃圾回收器可以动态调整堆内存大小,并且通常比CMS占用更少的内存。

  5. GC效率:G1垃圾回收器可以在多个CPU核心上并行执行标记、整理和压缩等操作,因此通常比CMS具有更高的GC效率。

总体而言,G1适用于需要高吞吐量和可预测性的应用程序,而CMS适用于需要快速响应时间和较低的暂停时间的应用程序。但是需要注意的是,对于特定的应用程序来说,并没有一种垃圾回收器可以适用于所有情况。因此,开发人员需要根据具体的应用场景和性能需求选择最合适的垃圾回收器。

从下图可以看出来,G1会做stop the world来进行筛选回收,但这个时间长短可以指定

G1原理图

 CMS原理图

jvm会在什么时候gc?什么时候full gc?

JVM(Java Virtual Machine)的垃圾回收机制是自动的,通常在以下情况下会进行垃圾回收:

  1. 空间规划阈值到达。JVM 在启动时会为 Java 堆分配一定大小的内存空间,当 Java 对象数量增加到一定程度时,就会触发 JVM 进行垃圾回收。

  2. 内存不足时。当 JVM 检测到 Java 堆没有足够的内存供应用程序使用时,就会启动垃圾回收机制。

  3. 调用 System.gc() 方法。虽然调用该方法并不能保证 JVM 立即执行垃圾回收,但它确实会增加 JVM 执行垃圾回收的可能性。

  4. 发生 OutOfMemoryError 错误。如果 JVM 检测到内存不足而且无法再分配更多内存时,就会抛出 OutOfMemoryError,此时 JVM 会启动垃圾回收机制。

Full GC 是一种特殊的垃圾回收机制,它会回收整个 Java 堆,包括 Eden 区、Survivor 区和老年代。Full GC 通常在以下情况下发生:

  1. 对象进入老年代时。当年轻代的 Eden 区、Survivor 区满了之后,对象会进入老年代,此时会触发 Full GC。

  2. 显式调用 System.gc() 方法。尽管显式调用 System.gc() 并不保证 JVM 立即执行 Full GC,但它确实会增加 JVM 执行 Full GC 的可能性。

需要注意的是,Full GC 是非常耗费资源的操作,因此建议在应用程序低峰期或者系统资源充足的情况下进行 Full GC。

类的加载过程:

1、当需要一个java类时,会通过classname,从classpath中查找到对应的class文件(加载过程通过双亲委派机制,直到顶层父加载器也找不到,就交由启动类加载器从磁盘里找到对应的class文件,并加载它),把class文件加载到方法区内,

2、class文件加载到内存后,jvm会对该类进行验证:检查正确性;准备:静态变量分配内存并设置默认值;解析:将符号引用变成直接引用(具体是指:常量池)

符号引用和直接引用

是常量池中的两种引用类型,符号是指具体描述符、直接引用是指通过符号可以直接定位到具体值

永久代、元空间、方法区:

永久代、元空间是实现方法区的一种方式,元空间再jdk8开始替换永久代,可以动态扩容

方法区主要存储类加载过程中的  类信息、常量、静态变量、静态方法。

static应用的对象,生命周期 等于 整个应用程序的生命周期

jvm堆内存

年轻代

老年代

如何判断对象是否可回收?

1、引用计数法,弊端 解决不了循环引用

2、可达性分析算法:通过虚拟机栈、本地方法区,方法去静态变量确定所有根节点,以这一组根节点作为起点,标记所有可达对象,没有被标记的就是可回收对象;

        注意可达性分析算法,计算可达遇到循环依赖依旧是通过计数法来解决循环标记的

垃圾回收算法

标记--清除 : 会造成内存碎片

复制算法:只利用了一般的内存空间,浪费资源

标记-整理:相对复制算法,比较耗时

在上面的基础上,诞生了分代回收法,根据对象的生命周期和特性,将堆内存分为新生代和老年代

新生代采用复制算法:8:1:1 S0 + 2个S1;老年代可以使用清楚或整理

有哪些垃圾回收器:

Serial收集器:单线程,stw、新生代:S0+2个S1/ 老年代也支持

Parallel收集器:stop the world:新生代老年代 

CMS收集器: 并发,stop the world时间短。老年代:标记清除、内存碎片

G1收集器:分块,没有年轻代和年老代之分,stw可配置,对内存要求高

jvm本地方法区:java的本地方法

jvm栈:虚拟机栈

栈帧是一种数据结构,即也就是队列,在虚拟机栈中

jvm为新线程创建虚拟机栈,执行方法时,jvm会会这个方法生成一个栈帧,将其推入前一个栈顶,开始执行这个方法的栈帧。jvm开始逐行执行这个方法,

执行完毕后,jvm弹出这个栈帧,返回到上一个栈帧继续执行,返回的值压入上一层的操作数栈中,当栈帧弹出后,虚拟机栈顶指向下一个栈帧,但线程执行完毕后,jvm会回收这个线程,并回收所创建的空间。

程序计数器

cpu有程序计数器,记录这上下指令的位置,记录这下一条执行的位置。

jvm线程也有程序计数器,

当一个方法被调用时,JVM 会将当前线程的程序计数器指向该方法的第一条字节码指令,并将该方法的栈帧推入虚拟机栈中。随着方法的执行,程序计数器会自动增加,指向下一条字节码指令,同时栈帧中的局部变量和操作数栈也会随之改变。当方法执行完毕后,该方法的栈帧从虚拟机栈中弹出,并且程序计数器会回到原来的值,继续执行调用该方法的方法。

就是说 jvm创建线程后,为其创建虚拟机栈和程序计数器,程序计数器记录着当前指令字节码的位置,并将方法压入栈顶,开始执行,执行过程中 程序计数器会不停的增加。

结合以上:new一个对象的过程

1、去方法区找class对象,如果没有双亲委派机制加载(从磁盘加载class文件字节流,load到方法区,开始 验证-准备(初始化静态)-解析(常量池符号引用-》直接引用:会加载所需依赖class)) 

2、找到之后,在堆中分配空间内存,创建对象

3、很大直接到老年代,不大的话就到S0,之后到S1,S2之后到到年老代

结合以上:方法是如何调用的

jvm创建线程后,为其创建虚拟机栈和程序计数器,程序计数器记录着当前指令字节码的位置,并将方法压入栈顶,开始执行,执行过程中 程序计数器会不停的增加。

JVM调优经验:

1、发现问题:访问很慢,经常堆溢出、栈溢出

2、堆溢出 需要考虑是否是大对象、内存空间分配不合理,对象产生较快

3、栈溢出 需要考虑是否死循环,导致调用递归过深,超过了jvm允许的最大深度,局部变量过多,超过了限制(1M)

4、借助一些监控工具,分析问题,适当调整相关内存大小,选择使用合适的回收器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM--一文精通 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • redis源码之:字典dict

    先来看看dict的大致结构 debug所用demo如下 void testDict int main int argc char argv testDict void testDict dict dict0 dictCreate hashD
  • SSH终端工具SecureCRT 8.5.4

    SecureCRT Mac版是mac上一款非常好用的SSH终端工具 可以为计算专业人士提供高级会话管理工具 从而提高效率工作并简化重复任务 SecureCRT为组织中的每个人提供安全的远程访问 文件传输和数据隧道 SecureCRT支持SS
  • OC门(Open Collector(Open Drain))

    OC门 又称集电极开路 漏极开路 与非门门电路 Open Collector Open Drain 为什么引入OC门 实际使用中 有时需要两个或两个以上与非门的输出端连接在同一条导线上 将这些与非门上的数据 状态电平 用同一条导线输送出去
  • 微信小程序——文字水平垂直居中

    记录一下CSS设置文字水平垂直居中 目录 1 代码说明 1 1 Html 1 2 CSS 2 效果 1 代码说明 对于直接在标签里面的文字 使用flex布局控制其中的文字水平和垂直居中 1 1 Html
  • java 使用sftp从远程服务器上传下载删除文件

    目录 前言 一 所需依赖 二 工具类 三 测试 1 判断指定目录是否存在 2 创建一个文件夹 3 删除指定文件 4 把文件上传到服务器上 5 从服务器上下载文件 6 执行Linux命令 前言 有时候我们需要让从代码里远程连接服务器进行文件上
  • jquery:值的操作

    jquery中一些操作值的方法 attr 操作某一个自定义属性值 text 操作文本值 html 操作html val 操作值
  • Python编程之控制台报错:Using TensorFlow backend.

    报错信息如下 报错原因 错误产生是因为tensorflow已经有更新 旧的内容已经不适用 解决方案 更新tensorflow的版本 1 pip uninstall tensorflow 2 pip uninstall tensorflow
  • MongoDB 性能调优

    一 explain 执行计划 MongoDB 提供了一个 explain 命令让我们获知系统如何处理查询请求 利用 explain 命令 我们可以很好地观察系统如何使用索引来加快检索 同时可以针对性优化索引 gt db t5 ensureI
  • 渗透测试之Google搜索语法

    目录 intitle allintitle inurl allinurl intext allintext filetype site link index of info define 通配符 intitle 从网页标题中搜索指定的关键字
  • 2012.11.21

    昨天的程序是有问题的 应该是杆8分别带动两侧的杆1 杆2 杆7 杆9分别被动旋转 起因在于杆8 杆1 杆2随杆8被动旋转在左侧 杆7副本 铲斗副本均绕着杆8副本被动旋转
  • 【转】【系列】【硬创邦】跟hoowa学做智能路由

    原文首发雷锋网 但雷锋网居然没把这个系列文章聚合起来 网上一搜 东一篇西一篇的 看起来十足不方便 现在聚合在此 方便学习 感谢作者hoowa 硬创邦 跟hoowa学做智能路由 一 我们来动手吧 硬创邦 跟hoowa学做智能路由 二 从芯片开
  • 最新阿里P7技术体系:大厂Offer拿到手软啊!年薪超过80万!

    说起IT行业 大多数人脑海里反应出的第一个标签一定是 高薪 而说起程序员 大家更多想到的可能是 秃顶 木讷 格子衫 加班多 能赚钱 不花钱 没对象 甚至很多人还说 程序员在互联网行业里面是吃青春饭的 干到30岁就会被行业淘汰掉 去年开始的各
  • http://jingyan.baidu.com/article/db55b609aac41e4ba30a2f86.html

    http jingyan baidu com article db55b609aac41e4ba30a2f86 html
  • 如何使用Grafana+Loki+Promtail日志聚合系统针对Kubernetes集群中Pods应用日志采集搜索展示...

    关注 WeiyiGeek 公众号 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 原文地址 如何使用Grafana Loki Promtail日志聚合系统针对Kubernetes集群中Pods应用日志采集搜索展示 本章
  • 数学建模-二胎政策对中国人口的影响

    研一的数学建模课上的关于 二胎政策对中国人口的影响 研究中国人口 发现中国人口老龄化非常严重 如今假设不放开全面二胎 那么中国的未来真的非常令人堪忧 事实上 如今的单独二胎对人口的影响不是太多 每年添加100多万的人口 对于中国日益下降的人
  • 单边指数衰减信号的频谱

    单边指数衰减信号的频谱 定义 傅里叶变换 幅度 相位 MATLAB作图代码 结果 定义 傅里叶变换 幅度 相位 MATLAB作图代码 单边指数 衰减 信号频谱作图 clear clc 幅度谱 w 2 0 1 2 y 1 sqrt 1 w w
  • PHP Opcache 配置优化实战

    前言 起源 在很长的一段时间里 我们的web服务器在遇到大规模流量访问的时候 很容易就把 CPU 负载飙到了 100 导致响应速度过慢 用户体验卡顿 直到最近开启了Opcahe后 我们的QPS从200 300 提升了1000 响应速度也提高
  • InnoDB: Check that you do not already have another mysqld process 错误解决办法

    非正常关机之后 再次启动mysql 失败 错误信息如下 150721 15 45 27 mysqld safe Starting mysqld daemon with databases from opt mysql data 150721
  • 电脑中打开VMware虚拟机提示权限不足无法访问文件如何解决

    最近使用win10系统电脑安装VMwame14后 打开虚拟机时报错 提示 打不开 vdmk格式文件 是由于 权限不足 无法访问 解决办法 试了网上说的很多办法 最简单的处理方式是鼠标右键使用管理员权限打开虚拟机 注意以管理员身份运行 当前登
  • JVM--一文精通

    调整JVM堆内存 在确定JVM堆内存大小时 需要考虑以下因素 应用程序的内存需求 操作系统和其他应用程序所需的内存 JVM的运行参数和GC算法 根据通常的经验 可以将JVM最大堆内存设置为操作系统可用内存的约70 也就是说 在16GB的机器