如何优化内存
发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这篇文章主要讲解了"如何优化内存",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何优化内存"吧!案例介绍这里,我将在平时工作过程中总结的内存溢出的情况
千家信息网最后更新 2025年11月11日如何优化内存
这篇文章主要讲解了"如何优化内存",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何优化内存"吧!
案例介绍
这里,我将在平时工作过程中总结的内存溢出的情况,以代码案例的形式直观的分享给大家,希望能够为小伙伴们带来实质性的帮助。
接下来,我们就以代码案例的形式来分析各种内存溢出的情况。
定义主类结构
首先,我们创建一个类叫做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安全错误
数据库的锁怎样保障安全
网页无法与服务器安全的连接
arcgis土壤数据库
我的世界him 进入服务器
软件开发如何开16的税
dlna服务器 mac
软件开发项目案例代码
国家网络安全宣传中央
网络安全管理的实现的论文
我的世界国庆节服务器
陕西光雅网络技术有限公司
在网络安全定义中
儿童玩具视频软件开发
政治初二上期的网络安全
国金证券软件开发年终奖
航天信息开票安全服务器地址
集群时钟同步服务器
科技(国外)数据库
沙雕服务器管理员
量化研究大型数据库有什么
手游服务器租赁网站
数据库进度条数据透视表
oracal 数据库教材
网站链接数据库字符串加密
网络安全检测包括
疫情期间网络安全宣教
数据库如何修改储存位置
祖安服务器在那
数据库实体完整性的效果
vsc添加数据库
网络技术学院大逃杀上海