千家信息网

如何优化内存

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"如何优化内存",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何优化内存"吧!案例介绍这里,我将在平时工作过程中总结的内存溢出的情况
千家信息网最后更新 2026年11月03日如何优化内存

这篇文章主要讲解了"如何优化内存",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何优化内存"吧!

案例介绍

这里,我将在平时工作过程中总结的内存溢出的情况,以代码案例的形式直观的分享给大家,希望能够为小伙伴们带来实质性的帮助。

接下来,我们就以代码案例的形式来分析各种内存溢出的情况。

定义主类结构

首先,我们创建一个类叫做BlowUpJVM,所有的案例实验都是基于这个类进行。

public class BlowUpJVM {  
}

栈深度溢出

public static void  testStackOverFlow(){ 
BlowUpJVM.testStackOverFlow();
}

栈不断递归,而且没有处理,所以虚拟机栈就不断深入不断深入,栈深度就这样溢出了。

永久代内存溢出

public static void testPergemOutOfMemory1(){ 
//方法一失败
List list = new ArrayList();

while(true){
list.add(UUID.randomUUID().toString().intern());
}
}

打算把String常量池堆满,没想到失败了,JDK1.7后常量池放到了堆里,也能进行垃圾回收了。

然后换种方式,使用cglib,用Class把老年代取堆满

public static void testPergemOutOfMemory2(){ 
try {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOM.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
catch (Exception e){
e.printStackTrace();
}
}

虚拟机成功内存溢出了,那JDK动态代理产生的类能不能溢出呢?

public static void testPergemOutOfMemory3(){ 
while(true){
final OOM oom = new OOM();
Proxy.newProxyInstance(oom.getClass().getClassLoader(), oom.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(oom, args);
return result;
}
});
}
}

事实表明,JDK动态代理差生的类不会造成内存溢出,原因是:JDK动态代理产生的类信息,不会放到永久代中,而是放在堆中。

本地方法栈溢出

public static void testNativeMethodOutOfMemory(){ 
int j = 0;
while(true){
Printer.println(j++);
ExecutorService executors = Executors.newFixedThreadPool(50);
int i=0;
while(i++<10){
executors.submit(new Runnable() {
public void run() {
}
});
}
}
}

这个的原理就是不断创建线程池,而每个线程池都创建10个线程,这些线程池都是在本地方法区的,久而久之,本地方法区就溢出了。

JVM栈内存溢出

public static void testStackOutOfMemory(){ 
while (true) {
Thread thread = new Thread(new Runnable() {
public void run() {
while(true){
}
}
});
thread.start();
}
}

线程的创建会直接在JVM栈中创建,但是本例子中,没看到内存溢出,主机先挂了,不是JVM挂了,真的是主机挂了,无论在mac还是在windows,都挂了。

温馨提示,这个真的会死机的。

堆溢出

public static void testOutOfHeapMemory(){ 
List list = new ArrayList();
while(true){
StringBuffer B = new StringBuffer();
for(int i = 0 ; i < 10000 ; i++){
B.append(i);
}
list.add(B);
}
}

不断往堆中塞新增的StringBuffer对象,堆满了就直接溢出了。

感谢各位的阅读,以上就是"如何优化内存"的内容了,经过本文的学习后,相信大家对如何优化内存这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内存 不断 线程 方法 案例 动态 情况 代理 学习 主机 代码 内容 就是 常量 形式 深度 永久 温馨 直观 久而久之 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 深圳九邦互联网科技有限公司 互联网科技工作委员会主任 互联网科技公司华为 互联网科技会 互联网科技公司电话 成都互联网科技公司 奇酷互联网络科技公司 无线互联网科技 广州善班互联网科技 银川新华互联网科技职业技术培训学校图片 南山科技园互联网公司有哪些 河南猎农互联网科技有限公司 科技类公司包括互联网吗 特约风豹互联网科技为什么扣费 互联网科技数字货币 互联网科技收购价值 互联网科技品牌 陕西彩京云互联网科技有限公司 科技发展第三阶段互联网时代 河南云网互联网络科技有限公司 互联网科技保险 智网互联网科技 亿策互联网科技 百单互联网科技有限公司 深圳齐家互联网科技 团飞科技与伯堂互联网服务平台 悟空问答互联网科技 北京品多多互联网科技有限公司 利用互联网等科技手段
0