- Java核心技术面试实战:谢飞机的搞笑求职记
sinat_26229211
Java场景面试宝典JavaJVMSpringBootRedisKafkaSpringCloud分布式事务
场景设定某互联网大厂正在招聘Java开发工程师,谢飞机作为求职者前来面试。面试官严肃认真,而谢飞机则以搞笑的方式回答问题,简单问题能答对并获得夸赞,复杂问题则含糊其辞。第一轮提问(基础技术)面试官:谢先生,请问你了解Java虚拟机(JVM)吗?它的内存结构是怎样的?谢飞机:当然知道!JVM内存分为堆、栈、方法区和本地方法栈。其中堆是用来存放对象实例的,栈用来存放局部变量和操作数。面试官:不错!那请
- 从一个简单的HelloWorld来完整介绍Java的类加载过程
goTsHgo
JavaJVMjava开发语言
我将以一个典型Java程序(HelloWorld)的执行过程为基础,逐步分析类加载的每一步,明确涉及的类、方法、输入数据格式、中间数据处理流程,以及最终输出数据格式。本文从程序启动开始,涵盖类加载的所有阶段(加载、链接、初始化),并具体到每个阶段调用的类和方法。1.概述:类加载的背景和流程类加载是Java虚拟机(JVM)将类文件(.class文件或字节码)加载到内存,并将其转换为可执行的java.
- JVM调优真香警告:AI生成G1参数配置方案,堆内存利用率飙升40%
互联网
在Java应用程序的开发与运行过程中,Java虚拟机(JVM)的性能调优一直是一项极具挑战性的任务,尤其是内存优化方面。不合适的JVM内存配置可能会导致应用程序出现性能瓶颈,甚至频繁抛出内存溢出异常,影响业务的正常运行。而飞算JavaAI的出现,为解决JVM调优难题带来了新的曙光,它能够自动生成内存优化方案,让JVM调优变得不再困难。一、JVM内存调优的难点1、复杂的内存模型JVM的内存模型由多个
- JVM基础认知:JVM到底是什么?为什么它如此重要?
阿文_ing
JVM修炼笔记jvm
随着Java语言在企业级应用、互联网服务、嵌入式系统等领域的广泛采用,JVM(JavaVirtualMachine,Java虚拟机)成为了支撑整个生态的核心基础。初学者往往会把注意力集中在Java代码本身,却忽视了背后那台“看不见的机器”——JVM。本文将从“JVM是什么”“JVM做了什么”“为什么它如此重要”三个层面,带你构建对JVM的完整认知。一、JVM是什么?•Java虚拟机(JVM)并非一
- 深入理解Java虚拟机-垃圾收集器与内存分配策略
Aurora_NeAr
java开发语言
对象存活判定引用计数法(ReferenceCounting)每个对象维护一个引用计数器,记录有多少引用指向该对象。当引用计数器为0时,表示对象不再被使用,可以被回收。无法解决循环引用问题(如上述示例),需要额外的空间存储引用计数可达性分析算法(ReachabilityAnalysis)通过一系列称为GCRoots的根对象作为起点,从这些根对象开始向下搜索,形成引用链如果一个对象不在任何引用链上(即
- JVM知识
海形のjava
jvm
JVM内存模型JVM的内存模型介绍一下根据JVM8规范,JVM运行时内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。JVM的内存结构主要分为以下几个部分:方法区:存放类对象Java虚拟机栈:存放方法之间的调用关系(方法的入口,方法的形参,方法的返回值,局部变量)本地方法栈:与虚拟机栈类似,区别是虚拟机栈执行java方法,本地方法站执行native方法。程序计数器:存放下一条执行的指
- Java 性能优化:JVM 调优的实战技巧与案例分析
向哆哆
Java入门到精通java性能优化jvm
Java性能优化:JVM调优的实战技巧与案例分析在Java开发领域,性能优化是提升应用效率和用户体验的关键环节,而JVM(Java虚拟机)调优作为性能优化的核心内容,一直是开发者们关注的重点。本文将深入探讨Java性能优化中JVM调优的实战技巧,并结合实际案例进行分析,帮助读者更好地理解和掌握这一重要技能。一、JVM基础架构与性能调优原理(一)JVM的基本结构JVM是Java程序运行的基础环境,它
- Java如何实现平台无关性
qian_qh
面试八股文jvmjava
Java如何实现平台无关性引言“WriteOnce,RunAnywhere”(一次编写,到处运行)是Java最著名的口号之一,也是它能够风靡全球的重要原因。但Java究竟是如何实现这种跨平台能力的呢?本文将深入剖析Java平台无关性的实现原理,帮助开发者更好地理解Java虚拟机(JVM)的工作机制。一、平台无关性的实现基础1.Java虚拟机(JVM)的核心作用Java实现平台无关性的关键在于Jav
- idea 如何看bytecode_IDEA字节码学习查看神器一、背景bytecode viewer介绍
weixin_39616503
idea如何看bytecode
一、背景很多人想学习Java反汇编后的字节码,但是一方面缺乏好的资料,另外一方面缺乏好的工具。关于资料大家可以看《Java虚拟机规范》、《深入理解Java虚拟机》,还可以购买JVM字节码相关的专栏。虽然大家可以使用JDK自带的javap命令行工具,但是总是有些不方便。这里介绍下jclasslibbytecodeviewer这款神器。二、安装使用开源地址:https://github.com/ing
- 2025年Java技术栈全解析:从基础到实战,代码示例深度剖析
软件职业规划
java策略模式开发语言
一、Java基础(一)Java入门1.Java语言概述Java是一种跨平台、面向对象的编程语言,具有简单性、安全性、多线程等特点。它通过JVM(Java虚拟机)实现跨平台运行,一次编写,到处运行(WriteOnce,RunAnywhere)。2.环境配置安装Java开发工具包(JDK)和配置环境变量是Java开发的第一步。以下是环境配置的代码示例:#在Linux或MacOS中配置环境变量expor
- 一文读懂JVM内存模型
派鑫大
JVMjvm
JVM内存模型JVM的内存结构主要分为以下几个部分:程序计数器:可以看做是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的java方法的JVM指令地址。Java虚拟机栈:每个线程都有自己独立的虚拟机栈,生命周期与线程相同,每个方法在执行时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。本地方法栈:与java虚拟机栈类似,主要为虚拟机使用到Native方法服务
- 深入理解 Java 内存区域与内存溢出异常
小窦总
JAVA学习笔记java开发语言
个人主页文章专栏文章目录一、引言二、Java运行时数据区域(一)程序计数器(二)Java虚拟机栈(三)本地方法栈(四)Java堆(五)方法区(六)运行时常量池(七)直接内存三、内存溢出异常实战(一)Java堆溢出(二)虚拟机栈溢出(三)方法区和运行时常量池溢出(四)本机直接内存溢出四、结语注:本文结合《深入理解JAVA虚拟机》第二章第一节和第二节而作。一、引言在Java编程领域,内存管理看似由虚拟
- Java异常和注解学习笔记
[abcdem]
java学习笔记
异常定义:一个需要处理的、不正常的错误(比如比较空指针的值,数组越界之类的)异常分类所有非运行时异常没有统一的父类,叫检查异常只是方便统称,翻译成英文的这个类是没有继承自Exception的,检查异常中包含访问文件,文件末尾读入,类不存在等错误Error和RuntimeException属于非检查异常,前者一般是Java虚拟机或内存上(堆栈)的问题,而后者一般是程序编写错误导致的,属于可掌控的异常
- JVM 字节码指令集--技术
ThinkPet
jvmjava
JVM(Java虚拟机)字节码是一种特殊的指令集,用于将Java源代码编译成可在JVM上运行的字节码文件。JVM字节码指令集包括多种指令类型,如加载和存储指令、算术和逻辑指令、控制指令、方法调用指令等。这些指令可在JVM上执行,实现Java程序的运行。JVM字节码是与硬件无关的,因此可以将Java程序编译成字节码文件,然后在不同的环境中运行,提高了Java程序的可移植性和跨平台性。JVM字节码指令
- JVM底层详解
爱编程的王小美
jvm
JVM底层详解目录JVM概述JVM内存模型垃圾回收机制类加载过程JIT编译JVM调优JVM监控与故障排查JVM与多线程JVM与性能优化JVM发展历程与未来JVM实战案例分析JVM高级特性JVM安全机制JVM与容器化一、JVM概述1.1什么是JVMJava虚拟机(JavaVirtualMachine,JVM)是Java平台的核心组件,它是一个抽象的计算机,能够执行Java字节码。JVM的主要职责是:
- java 手机音频播放,用Java实现音频播放
mirrorizeai
java手机音频播放
桌面PC的性能日益提高,Java虚拟机的优化技术也不断获得突破,这一切使得用Java处理实时信号成为可能。本文将通过设计和构造一个支持实时mp3、WAV和Ogg音频格式解码/回放的Java音乐播放器,阐述用JavaSoundAPI编写音频处理程序的思路和一般过程。JavaSound是一个小巧的低层API,支持数字音频和MIDI数据的记录/回放。在JDK1.3.0之前,JavaSound是一个标准的
- java八股文---java基础
小熊ying糖
java八股文java面试
1、Java语言有哪些特点/什么是Java?面向对象(封装,继承,多态);平台无关性(由java虚拟机实现平台无关性,一次编译,多出运行);GC实现垃圾回收;异常处理机制;支持多线程;支持网络编程并且很方便;
- Java的JDK、JRE、JVM关系与作用
苦学编程啊
Java基础javajvm开发语言
Java的JDK、JRE、JVM关系与作用java中的JDK、JRE和JVM是三个核心组件,各自承担不同角色,且存在层级依赖关系1.JVM(JavaVirtualMachine,Java虚拟机)是什么:JVM是虚拟的计算机,能够执行编译后的Java字节码(.class文件)。它是Java跨平台能力的核心。作用:解释或编译字节码为机器码(通过JIT编译器)。管理内存(如垃圾回收)。提供运行时环境,隔
- Java学习手册:JVM、JRE和JDK的关系
佩奇的技术笔记
Java学习手册jvmjava开发语言
在Java生态系统中,JVM(Java虚拟机)、JRE(Java运行时环境)和JDK(Java开发工具包)是三个核心概念。它们共同构成了Java语言运行和开发的基础。理解它们之间的关系对于Java开发者来说至关重要。本文将深入探讨这三个概念及其相互关系。Java虚拟机(JVM)JVM是Java语言的核心组件,它是一个抽象的计算机,用于执行Java字节码。JVM的主要功能是将字节码转换为特定平台的机
- 图解Java运行机制-JVM、JRE、JDK区别
学堂在线
编程java开发语言jvm
以下是Java运行机制及JVM、JRE、JDK区别的图解与说明:---###一、Java程序运行机制1.**编写与编译**Java源文件(`.java`)通过**JDK中的编译器(javac)**编译为字节码文件(`.class`),字节码是一种与平台无关的中间代码。2.**执行流程**字节码文件由**JVM(Java虚拟机)**解释执行,JVM将字节码转换为具体操作系统的机器指令,从而实现“一次
- JVM 不同的垃圾收集算法分别有什么优缺点?
冰糖心书房
JVM常见问题汇总jvm算法javajvm垃圾回收算法
Java虚拟机(JVM)的垃圾收集(GarbageCollection,GC)算法有多种,每种算法都有其自身的优缺点,适用于不同的场景。以下是几种常见的垃圾收集算法及其优缺点:1.标记-清除算法(Mark-Sweep):原理:标记(Mark):从GCRoots开始,递归地标记所有可达对象。清除(Sweep):遍历整个堆,清除未被标记的对象(垃圾对象),释放其占用的内存。优点:实现简单:算法思路比较
- 深入剖析Java虚拟机性能调优:从内存管理到监控实践的全方位指南
软件职业规划
java测试工具开发语言
一、JVM性能调优概述Java虚拟机(JVM)是Java程序运行的核心平台,它负责将Java字节码转换为机器码并执行。JVM的性能直接影响到Java应用程序的运行效率、响应时间和资源占用情况。性能调优的目标是使JVM在有限的资源下,以最优的方式运行应用程序,从而提高系统的吞吐量、降低延迟、减少内存占用和避免频繁的垃圾回收等。JVM性能调优是一个系统性工程,涉及多个方面,包括内存管理、垃圾回收机制、
- JVM调优
明天过后ww
jvm
JVM(Java虚拟机)调优是提升Java应用程序性能的关键步骤。它涉及对JVM的内存管理、垃圾回收、编译等多个方面的参数进行调整,以适应不同的应用场景和性能需求。以下是JVM调优的详细讲解:一、内存管理调优内存管理是JVM调优的核心内容之一,合理的内存分配可以有效减少垃圾回收的频率和停顿时间。1.堆内存调优堆内存是JVM中对象存储的主要区域,其大小直接影响应用程序的性能和稳定性。设置堆内存初始大
- 分布式微服务系统架构第97集:JVM底层原理
掘金-我是哪吒
分布式微服务系统架构jvm架构
加群联系作者vx:xiaoda0423仓库地址:https://webvueblog.github.io/JavaPlusDoc/https://1024bat.cn/JVM内存结构Java虚拟机的内存空间分为5个部分:·程序计数器·Java虚拟机栈·本地方法栈·堆·方法区JDK1.8同JDK1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。
- Android面试题(一)Java高频面试题
红日666
Android面试题大全javaJava面试题
Android面试题(一)Java高频面试题Android面试题(二)Android中高级/资深面试题Android面试题(三)Java虚拟机原理面试题Android面试题(四)常用设计模式面试题Android面试题(五)数据结构/算法面试题Android面试题(六)高频网络基础面试题Android面试题(七)Kotlin高频面试题Android面试题(八)Flutter高频面试题目录Java的基
- Java是如何运行一个程序的?
eason再来一次
java开发语言
一、Java程序运行总体流程(一)启动JVM并加载核心库当在命令行输入java命令运行Java程序时,操作系统会启动Java虚拟机(JVM)。JVM启动后,利用引导类加载器加载Java核心库,像java.lang、java.util等基础包中的类会在此时被加载。此过程由JVM底层机制完成,不依赖Java线程。(二)创建主线程并加载入口类主线程创建:JVM完成初始化操作(包括核心库加载)后,会创建一
- Java高频面试题1:Java SE
·云扬·
面试java开发语言面试
一、Java概述1.Java语言的特点?面向对象:封装、继承、多态。跨平台:通过JVM实现“一次编写,到处运行”。内存管理:自动垃圾回收(GC),避免手动内存管理。多线程:内置多线程支持,通过Thread类和Runnable接口实现。2.JVM、JDK、JRE的区别?组件描述包含内容JVMJava虚拟机,负责执行字节码解释器、即时编译器(JIT)JREJava运行时环境JVM+核心类库(如java
- Java类加载问题
LeonNo11
javajava开发语言
Java类加载是Java虚拟机(JVM)在运行时动态加载.class文件到内存的过程。这个过程和类的生命周期紧密相关。我们来系统地学习下Java类加载的过程、生命周期阶段、类加载器的作用以及相关细节和面试点。一、类加载过程(ClassLoadingProcess)Java类从.class文件变成JVM可执行的对象代码,会经过七个步骤,可以分为三大阶段:✅加载->连接->初始化:加载(Loading
- 初步了解JVM,总结小知识
Stefan Yu
jvmjava
JVM内存结构先来一张内存结构图那么什么叫做Java虚拟机呢?我们学习的时候,应该都知道Java语言能够一次编译,到处运行的特点,其中这种平台无关性关键就在于Java虚拟机,他是一个可执行Java字节码的虚拟机进程。组成部分ClassLoader:(类加载器)类装载子系统,JVM启动的时候,将字节码加载到JVM中。RunTimeDataArea:(运行时数据区)如上图,将内存分为不同的区域,分别实
- JVM 内存区域详解
huingymm
面试学习使用jvm
JVM内存区域详解Java虚拟机(JVM)的内存区域划分为多个部分,每个部分有特定的用途和管理机制。以下是JVM内存区域的核心组成及其功能:一、运行时数据区(RuntimeDataAreas)1.线程共享区域内存区域别名特性异常类型堆(Heap)新生代+老年代存储对象实例和数组,GC主要工作区域OutOfMemoryError方法区元空间(Metaspace)存储类信息、常量、静态变量、JIT编译
- ViewController添加button按钮解析。(翻译)
张亚雄
c
<div class="it610-blog-content-contain" style="font-size: 14px"></div>// ViewController.m
// Reservation software
//
// Created by 张亚雄 on 15/6/2.
- mongoDB 简单的增删改查
开窍的石头
mongodb
在上一篇文章中我们已经讲了mongodb怎么安装和数据库/表的创建。在这里我们讲mongoDB的数据库操作
在mongo中对于不存在的表当你用db.表名 他会自动统计
下边用到的user是表明,db代表的是数据库
添加(insert):
- log4j配置
0624chenhong
log4j
1) 新建java项目
2) 导入jar包,项目右击,properties—java build path—libraries—Add External jar,加入log4j.jar包。
3) 新建一个类com.hand.Log4jTest
package com.hand;
import org.apache.log4j.Logger;
public class
- 多点触摸(图片缩放为例)
不懂事的小屁孩
多点触摸
多点触摸的事件跟单点是大同小异的,上个图片缩放的代码,供大家参考一下
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener
- 有关浏览器窗口宽度高度几个值的解析
换个号韩国红果果
JavaScripthtml
1 元素的 offsetWidth 包括border padding content 整体的宽度。
clientWidth 只包括内容区 padding 不包括border。
clientLeft = offsetWidth -clientWidth 即这个元素border的值
offsetLeft 若无已定位的包裹元素
- 数据库产品巡礼:IBM DB2概览
蓝儿唯美
db2
IBM DB2是一个支持了NoSQL功能的关系数据库管理系统,其包含了对XML,图像存储和Java脚本对象表示(JSON)的支持。DB2可被各种类型的企 业使用,它提供了一个数据平台,同时支持事务和分析操作,通过提供持续的数据流来保持事务工作流和分析操作的高效性。 DB2支持的操作系统
DB2可应用于以下三个主要的平台:
工作站,DB2可在Linus、Unix、Windo
- java笔记5
a-john
java
控制执行流程:
1,true和false
利用条件表达式的真或假来决定执行路径。例:(a==b)。它利用条件操作符“==”来判断a值是否等于b值,返回true或false。java不允许我们将一个数字作为布尔值使用,虽然这在C和C++里是允许的。如果想在布尔测试中使用一个非布尔值,那么首先必须用一个条件表达式将其转化成布尔值,例如if(a!=0)。
2,if-els
- Web开发常用手册汇总
aijuans
PHP
一门技术,如果没有好的参考手册指导,很难普及大众。这其实就是为什么很多技术,非常好,却得不到普遍运用的原因。
正如我们学习一门技术,过程大概是这个样子:
①我们日常工作中,遇到了问题,困难。寻找解决方案,即寻找新的技术;
②为什么要学习这门技术?这门技术是不是很好的解决了我们遇到的难题,困惑。这个问题,非常重要,我们不是为了学习技术而学习技术,而是为了更好的处理我们遇到的问题,才需要学习新的
- 今天帮助人解决的一个sql问题
asialee
sql
今天有个人问了一个问题,如下:
type AD value
A
- 意图对象传递数据
百合不是茶
android意图IntentBundle对象数据的传递
学习意图将数据传递给目标活动; 初学者需要好好研究的
1,将下面的代码添加到main.xml中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:/
- oracle查询锁表解锁语句
bijian1013
oracleobjectsessionkill
一.查询锁定的表
如下语句,都可以查询锁定的表
语句一:
select a.sid,
a.serial#,
p.spid,
c.object_name,
b.session_id,
b.oracle_username,
b.os_user_name
from v$process p, v$s
- mac osx 10.10 下安装 mysql 5.6 二进制文件[tar.gz]
征客丶
mysqlosx
场景:在 mac osx 10.10 下安装 mysql 5.6 的二进制文件。
环境:mac osx 10.10、mysql 5.6 的二进制文件
步骤:[所有目录请从根“/”目录开始取,以免层级弄错导致找不到目录]
1、下载 mysql 5.6 的二进制文件,下载目录下面称之为 mysql5.6SourceDir;
下载地址:http://dev.mysql.com/downl
- 分布式系统与框架
bit1129
分布式
RPC框架 Dubbo
什么是Dubbo
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 集群容错: 提供基于接
- 那些令人蛋痛的专业术语
白糖_
springWebSSOIOC
spring
【控制反转(IOC)/依赖注入(DI)】:
由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
简单的说:对象的创建又容器(比如spring容器)来执行,程序里不直接new对象。
Web
【单点登录(SSO)】:SSO的定义是在多个应用系统中,用户
- 《给大忙人看的java8》摘抄
braveCS
java8
函数式接口:只包含一个抽象方法的接口
lambda表达式:是一段可以传递的代码
你最好将一个lambda表达式想象成一个函数,而不是一个对象,并记住它可以被转换为一个函数式接口。
事实上,函数式接口的转换是你在Java中使用lambda表达式能做的唯一一件事。
方法引用:又是要传递给其他代码的操作已经有实现的方法了,这时可以使
- 编程之美-计算字符串的相似度
bylijinnan
java算法编程之美
public class StringDistance {
/**
* 编程之美 计算字符串的相似度
* 我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:
* 1.修改一个字符(如把“a”替换为“b”);
* 2.增加一个字符(如把“abdd”变为“aebdd”);
* 3.删除一个字符(如把“travelling”变为“trav
- 上传、下载压缩图片
chengxuyuancsdn
下载
/**
*
* @param uploadImage --本地路径(tomacat路径)
* @param serverDir --服务器路径
* @param imageType --文件或图片类型
* 此方法可以上传文件或图片.txt,.jpg,.gif等
*/
public void upload(String uploadImage,Str
- bellman-ford(贝尔曼-福特)算法
comsci
算法F#
Bellman-Ford算法(根据发明者 Richard Bellman 和 Lester Ford 命名)是求解单源最短路径问题的一种算法。单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore zu 也为这个算法的发展做出了贡献。
与迪科
- oracle ASM中ASM_POWER_LIMIT参数
daizj
ASMoracleASM_POWER_LIMIT磁盘平衡
ASM_POWER_LIMIT
该初始化参数用于指定ASM例程平衡磁盘所用的最大权值,其数值范围为0~11,默认值为1。该初始化参数是动态参数,可以使用ALTER SESSION或ALTER SYSTEM命令进行修改。示例如下:
SQL>ALTER SESSION SET Asm_power_limit=2;
- 高级排序:快速排序
dieslrae
快速排序
public void quickSort(int[] array){
this.quickSort(array, 0, array.length - 1);
}
public void quickSort(int[] array,int left,int right){
if(right - left <= 0
- C语言学习六指针_何谓变量的地址 一个指针变量到底占几个字节
dcj3sjt126com
C语言
# include <stdio.h>
int main(void)
{
/*
1、一个变量的地址只用第一个字节表示
2、虽然他只使用了第一个字节表示,但是他本身指针变量类型就可以确定出他指向的指针变量占几个字节了
3、他都只存了第一个字节地址,为什么只需要存一个字节的地址,却占了4个字节,虽然只有一个字节,
但是这些字节比较多,所以编号就比较大,
- phpize使用方法
dcj3sjt126com
PHP
phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,下面介绍一个它的使用方法,需要的朋友可以参考下
安装(fastcgi模式)的时候,常常有这样一句命令:
代码如下:
/usr/local/webserver/php/bin/phpize
一、phpize是干嘛的?
phpize是什么?
phpize是用来扩展php扩展模块的,通过phpi