当前位置: 首页 > news >正文

一朋友做网站网站被抓了生鲜网站建设背景

一朋友做网站网站被抓了,生鲜网站建设背景,为什么用wp做网站,公司网站建设文案概叙 科普文#xff1a;一文搞懂jvm(一)jvm概叙-CSDN博客 科普文#xff1a;一文搞懂jvm原理(二)类加载器-CSDN博客 科普文#xff1a;一文搞懂jvm原理(三)执行引擎-CSDN博客 前面我们介绍了jvm#xff0c;jvm主要包括两个子系统和两个组件#xff1a; Class loader(类… 概叙 科普文一文搞懂jvm(一)jvm概叙-CSDN博客 科普文一文搞懂jvm原理(二)类加载器-CSDN博客 科普文一文搞懂jvm原理(三)执行引擎-CSDN博客 前面我们介绍了jvmjvm主要包括两个子系统和两个组件 Class loader(类装载器) 子系统Execution engine(执行引擎) 子系统Runtime data area (运行时数据区域)组件 Native interface(本地接口)组件。 这里我们主要讲解Runtime data area (运行时数据区域)组件讲到这个就和jvm优化相关。 java代码编译和运行流程 主要是两个阶段编译和执行。 编译javac编译器将源代码*.java编译成class文件即java字节码文件。 执行jvm虚拟机即java命令执行class文件时通过加载器加载class文件并通过执行引擎中的解释器翻译成汇编语言机器指令符号表辅助信息执行。 JVM组织架构 图一jvm的运行时区、执行引擎、本地方法接口和库 ​ 图二这个是前面文中多次出现的jvm详细图 ​ 前面我们说过我们的类会经过类加载器进行的加载 – 验证 – 准备 – 解析 – 初始化这几个阶段完成后就会用到执行引擎对我们的类进行使用同时执行引擎将会使用到我们运行时数据区。 ​ ​ 运行时数据区其实用的就是内存而内存是非常重要的系统资源是硬盘和CPU的中间仓库及桥梁承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略保证了JVM的高效稳定运行以及不同的JVM对于内存的划分方式和管理机制存在着部分差异。 jvm内存划分 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区 域【JAVA 堆、方法区】、直接内存。 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。                线程共享区域随虚拟机的启动/关闭而创建/销毁。 1、JVM内存模型 线程独占:栈,本地方法栈,程序计数器 线程共享:堆,方法区 2、栈线程独占 又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方 法出口等信息.调用方法时执行入栈,方法返回式执行出栈. 3、本地方法栈线程独占 与栈类似,也是用来保存执行方法的信息.执行Java方法是使用栈,执行Native方法时使用本地方法栈. 4、程序计数器线程独占 保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行 Native方法时,程序计数器为空. 5、堆线程共享 JVM内存管理最大的一块,对被线程共享,目的是存放对象的实例,几乎所欲的对象实例都会放在这里, 当堆没有可用空间时,会抛出OOM异常.根据对象的存活周期不同,JVM把对象进行分代管理,由垃圾回 收器进行垃圾的回收管理 5、堆上的TLAB线程分配缓冲区线程独享 堆中的线程私有缓存区域TLABThread Local Allocation Buffer是Java虚拟机JVM中用于提高对象分配性能的一种优化技术。 在多线程的Java应用程序中对象的分配通常是并发的操作。为了避免不同线程之间频繁地竞争堆内存的分配问题JVM引入了TLAB这个概念。 TLAB是为每个线程分配的一块私有的内存区域用于存放该线程分配的新对象。每个线程都有自己的TLAB它们在堆中是独立的不会被其他线程访问。这样可以减少不同线程之间因为对象分配而造成的竞争提高了对象分配的效率。 6、方法区线程共享 又称非堆区,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器优化后的代码等数据.1.7 的永久代和1.8的元空间都是方法区的一种实现。 7、直接内存线程共享 直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式, 它可以使用 Native 函数库直接分配堆外内存, 然后使用 DirectByteBuffer 对象作为这块内存的引用进行操作(详见: Java I/O 扩展), 这样就避免了在 Java 堆和 Native 堆中来回复制数据, 因此在一些场景中可以显著提高性能。 ​ ​ JVM内存 线程与jvm内存之间的关系 java线程操作线程独占内存、共享内存、直接内存。 关于Runtime类 每个JVM只有一个Runtime实例。即为运行时环境相当于内存结构的中间的那个框框运行时环境。 Hotspot JVM里面的系统线程 使用jconsole、jvisualvm或者是任何一个调试工具都能看到在后台有许多线程在运行。 不过这些线程不包括调用public static void main(String[])的main线程以及所有这个main线程自己创建的线程。 而这些后台系统线程在Hotspot JVM主要有以下几种 虚拟机线程这种线程的操作是需要JVM达到安全点才会出现。这些操作必须在不同的线程中发生的原因是他们都需要JVM达到安全点这样堆才不会变化。这种线程的执行类型括”stop-the-world”的垃圾收集线程栈收集线程挂起以及偏向锁撤销周期任务线程这种线程是时间周期事件的体现比如中断他们一般用于周期性操作的调度执行GC线程这种线程对在JVM里不同种类的垃圾收集行为提供了支持编译线程这种线程在运行时会将字节码编译成到本地代码信号调度线程这种线程接收信号并发送给JVM在它内部通过调用适当的方法进行处理 1、栈VM Stack虚拟机栈线程独占 又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方 法出口等信息.调用方法时执行入栈,方法返回式执行出栈. 每个方法的运行都对应的入栈出栈的过程 这是一种快速有效的分配存储方式。栈中存储栈帧 每个栈帧就对应一个方法。 栈大小配置-Xss参数指定线程的栈大小     默认是1MB可以视情况而定128kb 执行引擎在执行的过程中究竟需要执行什么样子的字节码指令完全依赖于 PC 寄存器。 每当执行一项指令操作以后PC 寄存器即程序计数器就会更新下一条需要被执行的指令地址。 当然方法在执行的过程中执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在 Java 堆区中的对象实例信息以及通过对象头中的元数据指针定位到目标对象的类型信息。 从外观上来看所有的 Java 虚拟机的执行引擎输入、输出都是一致的输入的是字节码二进制流处理过程是字节码解释执行的等效过程输出的是执行结果。 2、Native Method Stack本地方法栈线程独占 与栈类似,也是用来保存执行方法的信息.执行Java方法是使用栈,执行Native方法时使用本地方法栈。 本地方法栈Native Method Stack是Java虚拟机JVM内存模型中的一部分用于支持Java程序中调用本地方法Native Method的执行过程(System.load方法, System.loadLibrary方法)。本地方法是使用其他编程语言如C、C等编写的通过JNIJava Native Interface技术与Java代码进行交互。本地方法栈主要用于管理本地方法的执行。 功能 本地方法栈为每个线程提供了一个独立的内存区域用于管理本地方法的调用和执行过程。 当Java程序调用本地方法时本地方法栈用于保存本地方法的局部变量、参数、返回值和临时数据。线程私有 与Java虚拟机栈类似本地方法栈也是线程私有的。每个线程都拥有自己独立的本地方法栈不与其他线程共享。         在线程切换时本地方法栈也会随着线程的切换而变化保证线程之间的本地方法调用不会相互影响。与Java虚拟机栈的区别 本地方法栈与Java虚拟机栈也称为Java栈是两个不同的栈分别用于管理Java方法和本地方法的调用。         Java虚拟机栈用于执行Java方法的调用和返回而本地方法栈用于执行本地方法的调用和返回。栈帧结构 本地方法栈的栈帧结构与Java虚拟机栈的栈帧结构类似。每个栈帧包含了本地方法的相关信息包括局部变量表、操作数栈、返回地址等。         栈帧中的局部变量表用于存储本地方法的局部变量和参数。         操作数栈用于执行本地方法中的操作指令。栈帧大小 本地方法栈的栈帧大小是固定的由本地方法的实现语言和编译器决定。         在调用本地方法时JVM会预先为本地方法分配一块足够大的栈帧空间确保本地方法的执行能够正常进行。异常处理 与Java虚拟机栈类似本地方法栈也可以捕获和处理异常。当本地方法抛出异常时JVM会在本地方法栈上找到相应的异常处理器并进行处理。 常用的本地方法 Object作为所有类的父类其所有的方法都被Java对象所共享 这些方法包括hashcode()equals()clone()toString() getClass()wait()notify()nptifyAll()Object这些类的实现很多都调用了系统底层的本地方法所以有必要在这里先说明一下关于本地方法的情况 1.本地方法的概念本地方法是指用本地程序设计语言比如c或者c来编写的特殊方法。在java语言中通过native关键字来修饰通过Java Native Interface(JNI)技术来支持java应用程序来调用本地方法本地方法在本地语言中可以执行任意的计算任务并返回到java程序设计语言中 2.本地方法的用途 从历史上看本地方法主要有三种用途 1) 提供“访问特定于平台的机制”的能力比如访问注册表和文件锁 2) 提供访问遗留代码库的能力从而可以访问遗留数据 3) 可以通过本地语言编写应用程序中注重性能的部分以提高系统的性能 3.使用本地方法的优缺点 优点: 1) 访问特定于平台的机制 2) 提高系统性能 缺点: 1) 本地代码中的一个bug就有可能破坏掉整个应用程序 2) 本地语言是不安全的所以使用本地方法的应用程序也不能免受内存毁坏错误的影响 3) 本地语言是与平台相关的使用本地方法的应用程序也不再是可自由移植的 4) 使用本地方法的应用程序更难调试 5) 在进入和退出本地代码时需要相关的固定开销所以如果本地代码时做的少量的工作本地方法就可能降低性能 6) 需要“胶合代码”的本地方法编写起来单调乏味并且难以阅读 如何优化本地方法栈         优化本地方法栈可以提高程序的性能和稳定性。以下是一些优化建议 尽量减少native方法的调用过多的native方法调用会导致本地方法栈的频繁创建和销毁从而增加程序的开销。因此尽量减少不必要的native方法调用可以提高程序的性能。合理设置本地方法栈的大小如果本地方法栈的大小设置得太小可能会导致StackOverflowError异常如果设置得太大则会浪费内存资源。因此需要根据程序的实际情况合理设置本地方法栈的大小。使用JIT编译器优化native方法JIT编译器可以将热点代码编译成本地代码从而提高程序的执行效率。对于频繁调用的native方法可以使用JIT编译器进行优化。避免在native方法中使用复杂的算法和数据结构复杂的算法和数据结构可能导致本地方法栈的快速增长和收缩从而影响程序的性能和稳定性。因此在编写native方法时应尽量使用简单、高效的算法和数据结构。确保native方法的正确性由于native方法是使用非Java语言编写的因此需要特别注意其正确性和稳定性。在编写和测试native方法时应确保其功能正确、性能良好且稳定可靠。 总结本地方法栈是JVM中用于支持native方法执行的重要组件。通过深入理解本地方法栈的作用、结构、工作原理以及与Java堆栈的区别我们可以更好地理解JVM的工作机制并为编写高效、稳定的程序提供重要支持。 3、程序计数器Program Counter Register线程独占 程序计数寄存器Program Counter Register中Register的命名源于CPU的寄存器寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。 程序计数器用来存储指向下一条指令的地址也即将要执行的指令代码。由执行引擎读取下一条指令并执行该指令。 保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行 Native方法时,程序计数器为空. 它是一块很小的内存空间几乎可以忽略不记。也是运行速度最快的存储区域。        在JVM规范中每个线程都有它自己的程序计数器是线程私有的生命周期与线程的生命周期保持一致。        任何时间一个线程都只有一个方法在执行也就是所谓的当前方法。        程序计数器会存储当前线程正在执行的Java方法的JVM指令地址或者如果是在执行native本地方法栈方法则是未指定值undefined。        它是程序控制流的指示器分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。        字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。        它是唯一一个在Java虚拟机规范中没有规定任何OutofMemoryError情况的区域。 使用程序计数器存储字节码指令地址有什么用         因为CPU运行时需要在各个线程间切换切换回来后就得知道需要从哪开始接着执行。JVM的字节码解释器就需要通过改变程序计数器的值来明确下一条应该执行什么样的字节码指令。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。 举例体会PC寄存器 public class PCRegisterTest {public static void main(String[] args) {int i 10;int j 20;int k i j;String s abc;System.out.println(i);System.out.println(k);} }先通过字节码来看看信息 public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack2, locals5, args_size10: bipush 102: istore_13: bipush 205: istore_26: iload_17: iload_28: iadd9: istore_310: ldc #2 // String abc12: astore 414: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;17: iload_118: invokevirtual #4 // Method java/io/PrintStream.println:(I)V21: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;24: iload_325: invokevirtual #4 // Method java/io/PrintStream.println:(I)V28: returnLineNumberTable:line 10: 0line 11: 3line 12: 6line 14: 10line 15: 14line 16: 21line 18: 28LocalVariableTable:Start Length Slot Name Signature0 29 0 args [Ljava/lang/String;3 26 1 i I6 23 2 j I10 19 3 k I14 15 4 s Ljava/lang/String;左边的数字代表指令地址指令偏移即 PC 寄存器中可能存储的值然后执行引擎读取 PC 寄存器中的值并执行该指令。 比如说PC寄存器存放指令地址5而执行引擎会看到PC寄存器存放的是5那么会去对应的操作指令instore_2将它放到操作局部变量表、操作数栈保存并且讲字节码指令翻译成机器指令让CPU执行。 常见面试题 使用PC寄存器存储字节码指令地址有什么用呢 为什么使用 PC 寄存器来记录当前线程的执行地址呢 因为CPU需要不停的切换各个线程这时候切换回来以后就得知道接着从哪开始继续执行JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令PC寄存器为什么被设定为私有的 因为我们知道所谓的多线程是在一个特定的时间段内只会执行其中某一个线程的方法而CPU会不停地做任务切换这样必然导致经常中断或恢复如何保证分毫无差呢最好的办法自然是为每一个线程都分配一个PC寄存器准确地记录各个线程正在执行的当前字节码指令地址。这样一来各个线程之间便可以进行独立计算从而不会出现相互干扰的情况。CPU 时间片CPU时间片即CPU分配给各个程序的时间每个线程被分配一个时间段称作它的时间片在宏观上我们可以同时打开多个应用程序每个程序并行不悖同时运行但在微观上由于只有一个CPU一次只能处理程序要求的一部分如何处理公平一种方法就是引入时间片每个程序轮流执行并发和并行的区别这里我们讲解一下并发与并行的区别并行Parallel当系统有一个以上CPU时当一个CPU执行一个进程时另一个CPU可以执行另一个进程两个进程互不抢占CPU资源可以同时进行这种方式我们称之为并行并发Concurrent在操作系统中是指一个时间段中有几个程序都处于已启动运行到运行完毕之间且这几个程序都是在同一个处理机上运行用网吧的机子来说我们有十台电脑晚上可以让十个人同时上机这叫并行同时进行互不争抢假如我们只有一台电脑但是有五个人来上机可能就是每个人玩一段时间或者干脆等待别人下机再到你 4、堆Heap线程共享 JVM内存管理最大的一块,对被线程共享,目的是存放对象的实例,几乎所欲的对象实例都会放在这里, 当堆没有可用空间时,会抛出OOM异常.根据对象的存活周期不同,JVM把对象进行分代管理,由垃圾回 收器进行垃圾的回收管理.。 堆内存参数配置 1.1 堆的配置参数 -Xms -Xmx 设置初始堆和最大堆内存 -Xmn 设置新生代内存大小 -XX:NewRatio 。可以设置老年代与新生代的比例。设置一个较大的新生代会减小老年代的大小这个参数对系统性能及GC行为有很大的影响。新生代的大小一般设置为整个堆空间的1/3到1/4。默认值为设置老年代和新生代内存占比默认值为2:1。默认-XX:NewRatio2新生代占1,老年代占2,年轻代占整个堆的1/3 假如 -XX:NewRatio4新生代占1,老年代占4,年轻代占整个堆的1/5 NewRatio值就是设置老年代的占比,剩下的1给新生代-XX:SurvivorRatio用来设置新生代中eden区和from/to区的比例 JVM参数中有一个比较重要的参数SurvivorRatio它定义了新生代中Eden区域和Survivor区域From幸存区或To幸存区的比例默认值为8:1:1Eden:From:To也就是说Eden占新生代的8/10From幸存区和To幸存区各占新生代的1/10-XX:SurvivorRatio 可参考以下计算公式Eden (R*Y)/(R11) From Y/(R11) To Y/(R11) 1 2 3 其中 RSurvivorRatio比例 Y新生代空间大小这里举个例子如果我们通过设置-Xmn60M来指定新生代分配的空间大小那么Eden则会分配60M * 0.8 48MSurvivor一共分配60M * 0.2 12M的内存空间 启动参数配置-Xmn60M -XX:SurvivorRatio8 -XX:PrintFlagsFinal 1 2 3 控制台输出uintx NewSize : 62914560 {product} uintx MaxNewSize : 62914560 {product} ————————————————-XX:MaxTenuringThreshold从年轻代到老年代最大晋升年龄。CMS 下默认为 6G1 下默认为 15-XX:MaxDirectMemorySize用于设置直接内存的最大值限制通过 DirectByteBuffer 申请的内存 -XX:ReservedCodeCacheSize用于设置 JIT 编译后的代码存放区大小如果观察到这个值有限制可以适当调大一般够用即可1.2 堆OOM 导出堆的参数配置 参数-XX: HeapDumpOnOutOfMemoryError 配置堆异常时导出 -XX:HeapDumpPath./dumplog/dumplog.log 配置都出 堆 dump文件的路径nohup java -Xms768m -Xmx768m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./dumplog/dumplog.log -jar xxxxxx.jar logs/xxxxxx.log 21 堆上存储的数据字符串常量池、静态变量、java对象。 堆上内存分配 逃逸分析 5、堆上的TLAB线程分配缓冲区线程独享 堆中的线程私有缓存区域TLABThread Local Allocation Buffer是Java虚拟机JVM中用于提高对象分配性能的一种优化技术。 在多线程的Java应用程序中对象的分配通常是并发的操作。为了避免不同线程之间频繁地竞争堆内存的分配问题JVM引入了TLAB这个概念。 TLAB是为每个线程分配的一块私有的内存区域用于存放该线程分配的新对象。每个线程都有自己的TLAB它们在堆中是独立的不会被其他线程访问。这样可以减少不同线程之间因为对象分配而造成的竞争提高了对象分配的效率。 6、方法区线程共享 又称非堆区,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器优化后的代码等数据.1.7 的永久代和1.8的元空间都是方法区的一种实现。 方法区参数配置 在JDK 1.6、JDK 1.7中方法区可以理解为永久区Perm。在JDK 1.8、JDK1.9、JDK1.10中永久区已经被彻底移除。取而代之的是元数据区元数据区大小可以使用参数-XX:MaxMetaspaceSize指定一个大的元数据区可以使系统支持更多的类这是一块堆外的直接内存Perm区域的参数配置由-XX:MaxMetaspaceSize 替换-XX:MaxMetaspaceSize指定永久区的最大可用值 在JDK1.6和JDK1.7等版本中可以使用-XX:PermSize和-XX:MaxPermSize配置永久区大小-XX:MetaspaceSize 参数的理解那么-XX:MetaspaceSize256m的含义到底是什么呢其实这个JVM参数是指Metaspace扩容时触发FullGC的初始化阈值也是最小的阈值。这里有几个要点需要明确如果没有配置-XX:MetaspaceSize那么触发FGC的阈值是21807104约20.8m可以通过jinfo -flag MetaspaceSize pid得到这个值如果配置了-XX:MetaspaceSize那么触发FGC的阈值就是配置的值 Metaspace由于使用不断扩容到-XX:MetaspaceSize参数指定的量就会发生FGC且之后每次Metaspace扩容都可能会发生FGC至于什么时候会比较复杂跟几个参数有关 如果Old区配置CMS垃圾回收那么扩容引起的FGC也会使用CMS算法进行回收如果MaxMetaspaceSize设置太小可能会导致频繁FullGC甚至OOM任何一个JVM参数的默认值可以通过java -XX:PrintFlagsFinal -version |grep JVMParamName获取例如java -XX:PrintFlagsFinal -version |grep MetaspaceSize ———————————————— Metaspace使用的是本地内存而不是堆内存也就是说在默认情况下Metaspace的大小只与本地内存大小有关。当然你也可以通过以下的几个参数对Metaspace进行控制-XX:MetaspaceSizeN 这个参数是初始化的Metaspace大小该值越大触发Metaspace GC的时机就越晚。随着GC的到来虚拟机会根据实际情况调控Metaspace的大小可能增加上线也可能降低。在默认情况下这个值大小根据不同的平台在12M到20M浮动。使用java -XX:PrintFlagsInitial命令查看本机的初始化参数-XX:Metaspacesize为21810376B大约20.8M。-XX:MaxMetaspaceSizeN 这个参数用于限制Metaspace增长的上限防止因为某些情况导致Metaspace无限的使用本地内存影响到其他程序。在本机上该参数的默认值为4294967295B大约4096MB。-XX:MinMetaspaceFreeRatioN 当进行过Metaspace GC之后会计算当前Metaspace的空闲空间比如果空闲比小于这个参数那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40也就是40%。设置该参数可以控制Metaspace的增长的速度太小的值会导致Metaspace增长的缓慢Metaspace的使用逐渐趋于饱和可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快浪费内存。-XX:MaxMetasaceFreeRatioN 当进行过Metaspace GC之后 会计算当前Metaspace的空闲空间比如果空闲比大于这个参数那么虚拟机会释放Metaspace的部分空间。在本机该参数的默认值为70也就是70%。-XX:MaxMetaspaceExpansionN Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B大约为5MB。-XX:MinMetaspaceExpansionN Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B大约330KB为。以前只认为Metaspace区是保存在本地内存中是没有上限的经查阅资料才发现原来JDK8中XX:MaxMetaspaceSize确实是没有上限的最大容量与机器的内存有关但是XX:MetaspaceSize是有一个默认值的21M-XX:CompressedClassSpaceSize 设置方法区类信息加载空间的大小因为 CompressedClassSpaceSize的大小是由MaxMetaspaceSizeInitialBootClassLoaderMetaspaceSizeCompressedClassSpaceSize这三个参数共同影响的结果。具体就是min_metaspace_sz 加CompressedClassSpaceSize大于 MaxMetaspaceSize的时候CompressedClassSpaceSize就强制被设置为(MaxMetaspaceSize - min_metaspace_sz)。64位下默认4M32位下默认2200K-XX:InitialBootClassLoaderMetaspaceSize 设置类信息区引导类的元空间大小查看类加载与卸载时候的信息 我增加了如下两个JVM启动参数来观察类的加载、卸载信息-XX:TraceClassLoading -XX:TraceClassUnloading 1 nohup java -Xms1g -Xmx1g -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./dumplog/dumplog.log -Xloggc:./dumplog/gc.log -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintHeapAtGC -XX:MetaspaceSize128m -XX:MaxMetaspaceSize1500m -XX:MaxMetaspaceExpansion50M -XX:MinMetaspaceExpansion10M -XX:CompressedClassSpaceSize1200m -XX:TraceClassUnloading -XX:TraceClassLoading -jar xxxx.jar logs/xxx.log 21 7、直接内存线程共享 直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式, 它可以使用 Native 函数库直接分配堆外内存, 然后使用 DirectByteBuffer 对象作为这块内存的引用进行操作(详见: Java I/O 扩展), 这样就避免了在 Java 堆和 Native 堆中来回复制数据, 因此在一些场景中可以显著提高性能。 -XX:MaxDirectMemorySize用于设置直接内存的最大值限制通过 DirectByteBuffer 申请的内存 -XX:ReservedCodeCacheSize用于设置 JIT 编译后的代码存放区大小如果观察到这个值有限制可以适当调大一般够用即可
http://www.dnsts.com.cn/news/42281.html

相关文章:

  • 月子会所网站建设方案现在网站开发用什么
  • 在线企业建站服务网站设计人员就业要求
  • 展示网站方案网站下方链接图标怎么做
  • 网站搜索引擎优化怎么做网站建设安全技术方面
  • 福田网站建设深圳信科一份完整的市场调查方案
  • 深圳网站设计按天收费网站建设公司高端
  • 怎么利用自媒体做网站优化高端网站制作的公司
  • 烟台网站建设托管做网站的外包公司上班好不好
  • 郑州网站建设方案网站的费用可以做无形资产吗
  • 电商网站开发人员菏泽专业网站开发公司
  • 网站建设 镇江万达网站的二级网页关键词
  • 建设网站哪家公司比较好网站建设那里
  • 网站主机多大外贸网站空间
  • 做ppt好的网站加强网站的建设与管理
  • 专注咖啡相关的网站做平面什么网站好用
  • 成都个人网站建设1千万人网站维护成本
  • 建网站是永久的吗seo查询徽号{lotlek}出本词效果
  • 大概开发一个网站多少钱简历在线制作网站
  • 长沙手机模板建站wordpress随机背景图片
  • 网站建设如何跑单子婚恋网站上认识人 带你做原油交易
  • 电影网站的建设目标网站开发协议书由谁来写
  • 中国建设银行云南官网站纪念币seo搜索优化网站推广排名
  • 职业院校专题建设网站设计制作照片
  • 做网站网页培训加盟
  • 找网站设计公司 看那些wordpress 建立商城
  • 有后台的网站怎么做wordpress博客源码下载
  • 知知网站推荐三亚文明城市建设服务中心报名网站
  • 建站网站设计网络推广方法有
  • wordpress恢复网站石家庄营销型网站制作
  • 网站备案中查询安装wordpress教程