小编Jua*_*ano的帖子

Java垃圾收集器和内存的问题

我对Java应用程序有一个非常奇怪的问题.

基本上它是一个使用玉兰(一个cms系统)的网页,在生产环境中有4个实例可用.有时CPU在java进程中达到100%.

所以,第一种方法是进行线程转储,并检查有问题的线程,我发现的是奇怪的:

"GC task thread#0 (ParallelGC)" prio=10 tid=0x000000000ce37800 nid=0x7dcb runnable 
"GC task thread#1 (ParallelGC)" prio=10 tid=0x000000000ce39000 nid=0x7dcc runnable 
Run Code Online (Sandbox Code Playgroud)

好吧,这很奇怪,我从来没有像这样的垃圾收集器,所以接下来我们做的是激活JMX并使用jvisualvm检查机器:堆内存使用率非常高(95%).

天真的方法:增加内存,所以问题需要更多的时间才能在重新启动的服务器上出现,结果,内存增加(6 GB!)问题出现在重新启动后20小时,而其他服务器上的内存较少(4GB!)运行了10天,这个问题还需要几天才能重新出现.此外,我尝试使用服务器失败的apache访问日志,并使用JMeter将请求重播到本地服务器,以尝试重现错误...它也不起作用.

然后我更多地调查了日志以找到这个错误

info.magnolia.module.data.importer.ImportException: Error while importing with handler [brightcoveplaylist]:GC overhead limit exceeded
at info.magnolia.module.data.importer.ImportHandler.execute(ImportHandler.java:464)
at info.magnolia.module.data.commands.ImportCommand.execute(ImportCommand.java:83)
at info.magnolia.commands.MgnlCommand.executePooledOrSynchronized(MgnlCommand.java:174)
at info.magnolia.commands.MgnlCommand.execute(MgnlCommand.java:161)
at info.magnolia.module.scheduler.CommandJob.execute(CommandJob.java:91)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
    Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)

另一个例子

    Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.Arrays.copyOf(Arrays.java:2894)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:117)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:407)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at java.lang.StackTraceElement.toString(StackTraceElement.java:175)
    at java.lang.String.valueOf(String.java:2838)
    at java.lang.StringBuilder.append(StringBuilder.java:132)
    at java.lang.Throwable.printStackTrace(Throwable.java:529)
    at org.apache.log4j.DefaultThrowableRenderer.render(DefaultThrowableRenderer.java:60) …
Run Code Online (Sandbox Code Playgroud)

java memory garbage-collection magnolia

9
推荐指数
1
解决办法
5082
查看次数

何时对数组进行排序?

几年前,在一次求职面试中,我被问到:什么时候排序阵列值得?我记得不能正确回答,最近我做了一个算法课程,我得出结论,提供更"学术化"的反应可能会让我得到那份工作......无论如何,不​​可能修复过去,到目前为止,我正试图正式回答自己,目前,这就是我所在的地方:

给定一个数组,搜索的时间将是

  • O(n)如果没有排序
  • O(log(n))如果已排序

考虑到O(n*log(n))中的快速排序排序

何时对数组进行排序?它当然取决于我们要搜索数组的次数.

  • 在有序数组中搜索x次的成本= O(n*log(n))+ [O(log(n))*x]
  • 在未排序的数组中搜索x次的成本= O(n)*x

x的价值是多少?

arrays sorting algorithm big-o

8
推荐指数
1
解决办法
212
查看次数

测试构造函数太多了吗?

首先,我会说我来自Java世界(这很重要,真的).

我已经编写了一段时间的PHP,我遇到的一个问题是由于缺少编译,有时可能在编译时很容易检测到错误(例如,给定函数的参数数量错误),可以默默地通过.

通过添加单元测试,可以轻松检测到代码覆盖率增加.问题是,例如测试构造函数以检查传递的参数是否正确是否有意义?我不是指参数的数量,而是指这些参数的内容(例如,如果参数为null,某些对象应该启动异常以避免创建"脏"对象).

问题是,我是否被多年的Java代码污染了?因为毕竟,增加代码覆盖率以"发现"错过的函数感觉就像(真正)原始的编译方式.

另外,我想说明我已经使用了开发环境(PHPStorm),我们也使用了像PHPCodeSniffer这样的工具.

有什么想法/建议吗?

php phpunit unit-testing software-quality

7
推荐指数
1
解决办法
178
查看次数

同步,易失性和线程安全

我最近正在阅读一些关于java并发的书.关于线程安全性,如果无法使类不可变,则可以始终通过同步其数据来确保线程安全.

以下类显然不是线程安全的

public class NotThreadSafe {
  private int value;

  public void setValue(int value) {
    this.value = value;
  }

  public int getValue() {
    return this.value;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以同步写入,但它仍然不是线程安全的

public class StillNotThreadSafe {
  private int value;

  public synchronized void setValue(int value) {
    this.value = value;
  }

  public int getValue() {
    return this.value;
  }
}
Run Code Online (Sandbox Code Playgroud)

因为我不仅需要同步写入,还需要同步读取

public class ThreadSafe {
  private int value;

  public synchronized void setValue(int value) {
    this.value = value;
  }

  public synchronized int getValue() {
    return this.value;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,通过使用volatile我可以保证其他线程会看到更新的值,所以这让我觉得这个类应该是线程安全的 …

java multithreading synchronization volatile thread-safety

7
推荐指数
1
解决办法
210
查看次数

python与组合中的多重继承

我对 Java 中的 OOP 及其习语有深刻的理解。

现在我正在用 python 编码,我处于多重继承可能有用的情况,但是(这可能是由于多年的 Java 代码),我不愿意这样做,我正在考虑使用组合而不是继承以避免与潜在的相等方法名称发生潜在冲突。

问题是,我在这件事上是过于严格还是过于专注于 Java。或者在 python 中使用多重继承不仅是可能的,而且是鼓励的。

谢谢你的时间 :)

python

6
推荐指数
1
解决办法
2483
查看次数

接口实现启动了不同的异常

我有一个界面

public interface DataDAO {
     public void doSomething() throws Exception;
}
Run Code Online (Sandbox Code Playgroud)

假设有两个实现,一个使用Database来获取数据,另一个使用Webservice.

public class DataDAOJdbc implements DataDAO {
    public void doSomething() throws Exception {
         //Implement
    }
}

public class DataDAOWebService implements DataDAO {
    public void doSomething() throws Exception {
         //Implement
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您已经看到的,问题是启动了超级通用异常.因为这两种实现都需要引发同样的异常.

Jdbc实现实际上只引发了SQLException,而Webservice实现只会提升IOException.

问题是,我怎样才能使界面更优雅,所以我捕获了一个正确的异常?

我首先要创建自己的异常,并在接口级别声明它

public interface DataDAO {
  public void doSomething() throws MyCoolException;
}
Run Code Online (Sandbox Code Playgroud)

然后,当然,实施accinly.

问题是,这有意义吗?我从来没有创建过我自己的异常,所以我不确定这是否有意义.另外,在创建MyCoolException时我应该考虑什么?

java oop interface exception

6
推荐指数
1
解决办法
158
查看次数

是否可以使用带有jrebel或dcevm的docker

我已经在我的开发环境中使用了几个星期的docker,它非常好,我不必担心配置我也不需要运行一个完整的虚拟机来运行应用服务器(在我的情况下是JBoss).

但是我似乎已经回到了过去的编译,部署,等待,测试.

现在问题是,有没有办法使用诸如jrebel或dcevm之类的工具来加快速度?此外,这个问题是否有意义?

java jrebel dcevm docker

5
推荐指数
1
解决办法
979
查看次数

将 JdbcTemplate 与 CrudRepository 混合使用有意义吗?

我对 Spring 的对象(以及一般的 spring-jdbc)非常熟悉JdbcTemplate,并且我非常喜欢自己编写 SQL 并处理对象映射。

然而最近我在玩这个CrudRepository界面,我真的很喜欢它。

也就是说,当涉及到复杂的查询(连接等)时,我仍然倾向于编写自己的 SQL 查询。

我希望能够CrudRepository在也有实例的类中使用这些方法JdbcTemplate,这样我就可以拥有开箱即用的方法,CrudRepository同时能够编写自己的复杂 SQL 并将它们与JdbcTemplate.

当然,问题是,这CrudRepository只是一个接口,而它JdbcTemplate是一个常规类。所以问题是

  1. 我提到的任何内容实际上有意义吗?
  2. 假设(1)的答案是肯定的,那么我如何才能拥有一个带有 a 实例的类JdbcTemplate,并且还提供了 a 的实现,CrudRepository而不必过多地绕过它?

java spring jdbc spring-data spring-data-jpa

5
推荐指数
1
解决办法
3592
查看次数

Kohana 3.2会话过期,短期到期工作按预期进行

Kohana 3.2会议即将到期.我目前的配置是:

return array(
'native' => array(
    'name' => 'kohanasession',
    'lifetime' => 0,       
 ),
);
Run Code Online (Sandbox Code Playgroud)

使用lifetime => 0意味着会话将在浏览器关闭时结束.但是,1小时后会话到期.

我也尝试使用不同的生命周期(例如36000 => 10小时),但同样,它失败了.

如果我使用一个很小的会话寿命(例如10秒),那么到期就会完美.据我检查,似乎如果我希望会话的生命周期超过1小时,它将无法正常工作.

最后,我们用于php.ini的相关配置

session.save_handler = memcache
session.save_path="tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
session.cache_limiter = nocache
session.gc_probability = 0
Run Code Online (Sandbox Code Playgroud)

我真的迷失在这里.这应该很容易修复,但我无法解决.

php session kohana kohana-3.2

4
推荐指数
1
解决办法
2815
查看次数

Python记录到同一个文件,不同的用户

我正在使用python的日志记录模块.

在每次启动测试时进行单元测试(我们使用py.test)时,一些日志信息会转到某个文件.在集成服务器中,每当有人推送代码时(我们也使用git :),我们运行测试.

问题是,当用户B尝试运行测试时,用户A创建文件后,测试将失败,因为用户B无权在同一文件上写入.

到目前为止,我们已手动更改了文件权限,但看起来像是一个肮脏的解决方案.我们也为每个用户创建一个日志文件,但是再次感觉不对.

我们在测试中记录的代码是

logging.basicConfig(level=logging.DEBUG,
    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
    datefmt='%m-%d %H:%M',
    filename='/tmp/py.test.log',
    filemode='w')
log.setLevel(logging.DEBUG)
log.addHandler(logging.StreamHandler())
Run Code Online (Sandbox Code Playgroud)

有没有办法避免这个问题?也许使用filemode ='a'可以做到这一点,但我们假设我每次都想要一个新文件(说实话,这是一个真正的问题更好奇,我仍然想做正确的事)

谢谢 :)

python linux logging file-permissions

3
推荐指数
1
解决办法
4090
查看次数

这是撤消git东西的好策略吗?

到现在为止,如果我曾经提交并将错误推送到主分支,我的解决方法是,假设git日志看起来像

commit bad_hash
commit another_bad_hash
commit yet_another_bad_hash
commit good_hash
Run Code Online (Sandbox Code Playgroud)

我'解决'过去的情况的方式是:

git reset --hard good_hash
git push -f origin master
Run Code Online (Sandbox Code Playgroud)

是的,这将有效...但似乎并不优雅,因为它有效地删除了提交历史.

所以在破坏了我的自我的情况之后,我检查了更好的方法,并且出来了git revert one,基本上我现在使用

git revert bad_hash another_bad_hash yet_another_bad_hash
git push origin master
Run Code Online (Sandbox Code Playgroud)

git revert将创建三个提交(每个恢复的哈希一个),之后,需要推送来更新远程.

现在,问题是,这种策略是否正确?对我来说看起来比重置更好 - 硬,因为回购的历史没有中断,如果最终有人想检查为什么有问题,他们总是可以做

git diff bad_hash
Run Code Online (Sandbox Code Playgroud)

这种推理是正确的还是我仍然缺少基本概念.

谢谢

git revert git-revert git-reset

3
推荐指数
1
解决办法
263
查看次数

补丁/内核的大小如何影响卷积网络的结果?

我在家里用 tensorflow 玩卷积神经网络(顺便说一句,我已经完成了 udacity 深度学习课程,所以我有理论基础)。当运行卷积时,补丁的大小有什么影响?当图像更大/更小时,这种尺寸是否必须改变?

我做的练习之一涉及图像的 CIFAR-10 数据库(32x32 像素),然后我使用了 3x3 的卷积(填充为 1),得到了不错的结果。

但是现在我想玩比那个更大的图像(比如 100x100),我应该让我的补丁更大吗?我要保留它们 3x3 吗?此外,使补丁真正大有什么影响?(比如 50x50)。

通常我会直接在家里测试这个,但是在我的电脑上运行这个有点慢(没有 nvidia GPU!)

所以这个问题应该总结为

  1. 当我的输入图像更大/更小时,我应该增加/减少补丁的大小吗?
  2. 增加/减少我的路径大小有什么影响(在性能/过度拟合方面)?

machine-learning image-recognition neural-network conv-neural-network

3
推荐指数
1
解决办法
3115
查看次数

如何确定git中的最后一个合并分支?

我需要确定哪个是最后一个合并为master的分支.

我一直在搜索git文档,但我仍然有点迷失.到目前为止,我已经找到了命令(假设master是我当前的分支)

git log --oneline --graph --decorate
Run Code Online (Sandbox Code Playgroud)

这为我提供了这样的输出

git log --oneline --graph --decorate
*   12cfc6d (HEAD, origin/master, origin/HEAD, master) Merge branch 'release/VCS_6.12.0-20150826' to master
|\  
| *   bef8908 (origin/release/VCS_6.12.0-20150826) Merge remote-tracking branch 'origin/release/VCS_6.12.0-20150826' into release/VCS_6.12.0-20150826
| |\  
| | *   c61f97b Merge pull request #12 in COM/vcs from feature/SWAT-47-Loader-JMS to release/VCS_6.12.0-20150826
| | |\  
| | | *   33aefe6 (origin/feature/SWAT-47-Loader-JMS) [SWAT-47] Merge from release/VCS_6.12.0-20150826 branch
| | | |\  
| | | |/  
| | |/|   
| | * | …
Run Code Online (Sandbox Code Playgroud)

git bash merge

2
推荐指数
1
解决办法
482
查看次数